123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.XR.iOS;
- namespace UnityARInterface
- {
- public class ARFocusSquare : MonoBehaviour {
- public enum FocusState {
- Initializing,
- Finding,
- Found
- }
- public GameObject findingSquare;
- public GameObject foundSquare;
- //for editor version
- public float maxRayDistance = 30.0f;
- public LayerMask collisionLayerMask;
- public float findingSquareDist = 0.5f;
- private FocusState squareState;
- public FocusState SquareState {
- get {
- return squareState;
- }
- set {
- squareState = value;
- foundSquare.SetActive (squareState == FocusState.Found);
- findingSquare.SetActive (squareState != FocusState.Found);
- }
- }
- bool trackingInitialized;
- // Use this for initialization
- void Start () {
- int layerIndex = LayerMask.NameToLayer("ARGameObject");
- collisionLayerMask = 1 << layerIndex;
- SquareState = FocusState.Initializing;
- trackingInitialized = true;
- }
- // Update is called once per frame
- void Update () {
- //use center of screen for focusing
- Vector3 center = new Vector3(Screen.width/2, Screen.height/2, findingSquareDist);
- Ray ray = Camera.main.ScreenPointToRay (center);
- RaycastHit hit;
- //we'll try to hit one of the plane collider gameobjects that were generated by the plugin
- //effectively similar to calling HitTest with ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent
- if (Physics.Raycast (ray, out hit, maxRayDistance, collisionLayerMask)) {
- //we're going to get the position from the contact point
- foundSquare.transform.position = hit.point;
- Debug.Log (string.Format ("x:{0:0.######} y:{1:0.######} z:{2:0.######}", foundSquare.transform.position.x, foundSquare.transform.position.y, foundSquare.transform.position.z));
- //and the rotation from the transform of the plane collider
- SquareState = FocusState.Found;
- foundSquare.transform.rotation = hit.transform.rotation;
- return;
- }
- //if you got here, we have not found a plane, so if camera is facing below horizon, display the focus "finding" square
- if (trackingInitialized) {
- SquareState = FocusState.Finding;
- //check camera forward is facing downward
- if (Vector3.Dot(Camera.main.transform.forward, Vector3.down) > 0)
- {
- //position the focus finding square a distance from camera and facing up
- findingSquare.transform.position = Camera.main.ScreenToWorldPoint(center);
- //vector from camera to focussquare
- Vector3 vecToCamera = findingSquare.transform.position - Camera.main.transform.position;
- //find vector that is orthogonal to camera vector and up vector
- Vector3 vecOrthogonal = Vector3.Cross(vecToCamera, Vector3.up);
- //find vector orthogonal to both above and up vector to find the forward vector in basis function
- Vector3 vecForward = Vector3.Cross(vecOrthogonal, Vector3.up);
- findingSquare.transform.rotation = Quaternion.LookRotation(vecForward,Vector3.up);
- }
- else
- {
- //we will not display finding square if camera is not facing below horizon
- findingSquare.SetActive(false);
- }
- }
- }
- }
- }
|