예제 #1
0
    void Update()
    {
//		// don't consider taps over the UI
//		if(UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())
//			return;

        // check for tap
        if (arManager && arManager.IsInitialized() && arManager.IsInputAvailable(true))
        {
            MultiARInterop.InputAction action = arManager.GetInputAction();

            if (action == MultiARInterop.InputAction.Click || action == MultiARInterop.InputAction.Grip)
            {
                if (modelTransform && modelTransform.gameObject.activeSelf)
                {
                    // raycast world
                    //Vector2 screenPos = Input.GetTouch(0).position;
                    MultiARInterop.TrackableHit hit;

                    if (arManager.RaycastToWorld(true, out hit))
                    {
                        // set model's new position
                        SetModelWorldPos(hit.point, !verticalModel ? hit.rotation : Quaternion.identity);
                    }
                }
            }
        }

        // check if anchorId is still valid
        if (arManager && anchorId != string.Empty && !arManager.IsValidAnchorId(anchorId))
        {
            anchorId = string.Empty;
        }

        // update the model-active and anchor-active transforms
        UpdateModelToggle(modelActiveToggle, modelTransform);
        UpdateModelToggle(anchorActiveToggle, anchorTransform);

        // update the info-text
        if (infoText)
        {
            string sMsg = string.Empty;

            if (!bSessionPaused)
            {
                sMsg = (modelTransform && modelTransform.gameObject.activeSelf ?
                        "Model at " + modelTransform.transform.position + ", " : "No model, ");
                sMsg += (anchorTransform && anchorTransform.gameObject.activeSelf ?
                         "Anchor at " + anchorTransform.transform.position : "No anchor");
                sMsg += !string.IsNullOrEmpty(anchorId) ? "\nAnchorId: " + anchorId : string.Empty;
            }
            else
            {
                sMsg = "AR-Session is paused.";
            }

            infoText.text = sMsg;
        }
    }
    void Update()
    {
//		// don't consider taps over the UI
//		if(UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())
//			return;

        // check for click
        if (objectPrefab && arManager && arManager.IsInitialized() && arManager.IsInputAvailable(true))
        {
            MultiARInterop.InputAction action = arManager.GetInputAction();

            if (action == MultiARInterop.InputAction.Click)
            {
                // raycast world
                //Vector2 screenPos = Input.GetTouch(0).position;
                MultiARInterop.TrackableHit hit;

                if (arManager.RaycastToWorld(true, out hit))
                {
                    // instantiate the object and anchor it to the world position
                    GameObject spawnObj = Instantiate(objectPrefab, hit.point, !verticalModel ? hit.rotation : Quaternion.identity);
                    arManager.AnchorGameObjectToWorld(spawnObj, hit);

                    // look at the camera
                    if (modelLookingAtCamera)
                    {
                        Camera arCamera = arManager.GetMainCamera();
                        MultiARInterop.TurnObjectToCamera(spawnObj, arCamera, hit.point, hit.normal);
                    }
                }
            }
        }
    }
    void Update()
    {
//		// don't consider taps over the UI
//		if(UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())
//			return;

        // check for tap
        if (arManager && arManager.IsInitialized() && arManager.IsInputAvailable(true))
        {
            MultiARInterop.InputAction action = arManager.GetInputAction();

            if (action == MultiARInterop.InputAction.Click || action == MultiARInterop.InputAction.Grip)
            {
                // check if there is a model selected
                if (currentModel == null)
                {
                    Debug.LogError("No model selected!");
                    return;
                }

                // update the currently selected model
                currentModel = GetModelHit();

                // raycast world
                MultiARInterop.TrackableHit hit;
                if (currentModel && arManager.RaycastToWorld(true, out hit))
                {
                    // anchor the model if needed
                    if (currentModel.parent == null)
                    {
                        arManager.AnchorGameObjectToWorld(currentModel.gameObject, hit);
                    }

                    // set the new position of the model
                    SetModelWorldPos(hit.point, !verticalModel ? hit.rotation : Quaternion.identity);
                }
            }
        }

        // update the info
        if (infoText)
        {
            infoText.text = currentModel ? "Selected: " + currentModel.gameObject.name : "No model selected";
        }

        // turn off the toggles, if the respective models are not active
        UpdateToggleStatus(toggle1, model1);
        UpdateToggleStatus(toggle2, model2);
        UpdateToggleStatus(toggle3, model3);
    }
    void Update()
    {
        // check for click
        if (objectPrefab && arManager && arManager.IsInitialized() && arManager.IsInputAvailable(true))
        {
            MultiARInterop.InputAction action = arManager.GetInputAction();

            if (action == MultiARInterop.InputAction.Click && (Time.time - lastInstanceTime) >= 1.5f)
            {
                // dont allow too often instance creation
                lastInstanceTime = Time.time;

                // remove current object, if any
                if (objectInstance)
                {
                    DestroyObjectInstance();
                }

                // raycast world
                MultiARInterop.TrackableHit hit;
                if (arManager.RaycastToWorld(true, out hit))
                {
                    // instantiate the object and anchor it to the world position
                    objectInstance = Instantiate(objectPrefab, hit.point, !verticalModel ? hit.rotation : Quaternion.identity);
                    arManager.AnchorGameObjectToWorld(objectInstance, hit);

                    // get object renderer & initial scale
                    objectRenderer = GetObjectRenderer(objectInstance);
                    objectScale    = objectInstance.transform.localScale;

                    // look at the camera
                    if (modelLookingAtCamera)
                    {
                        Camera arCamera = arManager.GetMainCamera();
                        MultiARInterop.TurnObjectToCamera(objectInstance, arCamera, hit.point, hit.normal);
                    }

                    if (infoText)
                    {
                        infoText.text = string.Format("{0} placed at {1}", objectPrefab.name, hit.point);
                    }
                }
            }
            else if (objectInstance && action == MultiARInterop.InputAction.Grip)
            {
                // get nav coordinates
                Vector3 navCoords = arManager.GetInputNavCoordinates();
                lastInstanceTime = Time.time;

                // estimate the scale change and target scale
                Vector3 scaleChange = navCoords.x >= 0 ? (objectScale * navCoords.x) : ((objectScale / 2f) * navCoords.x);
                targetScale = objectScale + scaleChange;

                objectInstance.transform.localScale = Vector3.Lerp(objectInstance.transform.localScale, targetScale, smoothFactor * Time.deltaTime);

                if (infoText)
                {
                    float fScaleChange = 1f + (navCoords.x >= 0 ? navCoords.x : (0.5f * navCoords.x));
                    infoText.text = string.Format("Scale change: {0:F2}", fScaleChange);
                }

                // outline object bounds
                if (objectRenderer && boundsPrefab)
                {
                    Bounds objectBounds = objectRenderer.bounds;

                    // instantiate bounds-cube, if needed
                    if (boundsInstance == null)
                    {
                        boundsInstance = GameObject.Instantiate(boundsPrefab);
                        boundsInstance.transform.SetParent(objectInstance.transform);
                    }

                    // set the bounds-cube tras=nsform
                    boundsInstance.transform.position = objectBounds.center;
                    boundsInstance.transform.rotation = objectInstance.transform.rotation;

                    Vector3 objScale    = objectInstance.transform.localScale;
                    Vector3 boundsScale = new Vector3(objectBounds.size.x / objScale.x, objectBounds.size.y / objScale.y, objectBounds.size.z / objScale.z);
                    boundsInstance.transform.localScale = boundsScale;
                }
            }
            else if (action == MultiARInterop.InputAction.Release)
            {
                // instantiate bounds-cube, if needed
                if (boundsInstance != null)
                {
                    Destroy(boundsInstance);
                    boundsInstance = null;
                }

                if (infoText)
                {
                    infoText.text = "Tap to place the object, then drag right or left, to scale it up or down.";
                }
            }
        }
    }
    // Update is called once per frame
    void Update()
    {
        // check for tap
        if (portalPrefab && arManager && arManager.IsInitialized() && arManager.IsInputAvailable(true))
        {
            MultiARInterop.InputAction action = arManager.GetInputAction();

            if (action == MultiARInterop.InputAction.Click)
            {
                // raycast to world
                MultiARInterop.TrackableHit hit;
                if (arManager.RaycastToWorld(true, out hit))
                {
                    // create the portal object, if needed
                    if (!portalObj)
                    {
                        portalObj = Instantiate(portalPrefab);
                    }

                    // set its position and rotation
                    portalObj.transform.position = hit.point;
                    portalObj.transform.rotation = !verticalPortal ? hit.rotation : Quaternion.identity;

                    // look at the camera
                    if (portalLookingAtCamera)
                    {
                        Camera arCamera = arManager.GetMainCamera();
                        MultiARInterop.TurnObjectToCamera(portalObj, arCamera, hit.point, hit.normal);
                    }

                    // remove object anchor, if it was anchored before
                    string anchorId = arManager.GetObjectAnchorId(portalObj);
                    if (anchorId != string.Empty)
                    {
                        arManager.RemoveGameObjectAnchor(anchorId, true);
                    }

                    // anchor it to the new world position
                    arManager.AnchorGameObjectToWorld(portalObj, hit);

                    // apply the vertical offset
                    if (verticalOffset != 0f)
                    {
                        Vector3 objPos = portalObj.transform.position;
                        //objPos.y += verticalOffset;
                        objPos += portalObj.transform.up * verticalOffset;
                        portalObj.transform.position = objPos;
                    }

                    // play portal-open animation
                    if (playAnimation != string.Empty)
                    {
                        // get reference to the portal animator
                        if (!animator)
                        {
                            animator = portalObj.GetComponent <Animator>();
                        }

                        if (animator)
                        {
                            animator.Play(playAnimation, 0, 0f);
                        }
                    }

                    // create camera rigidbody (no gravity) & box-collider, if needed
                    if (cameraBoxCollider != Vector3.zero)
                    {
                        Camera arCamera = arManager.GetMainCamera();

                        Rigidbody camRigidbody = arCamera.gameObject.GetComponent <Rigidbody>();
                        if (camRigidbody == null)
                        {
                            camRigidbody            = arCamera.gameObject.AddComponent <Rigidbody>();
                            camRigidbody.useGravity = false;
                        }

                        BoxCollider camBoxCollider = arCamera.gameObject.GetComponent <BoxCollider>();
                        if (camBoxCollider == null)
                        {
                            camBoxCollider           = arCamera.gameObject.AddComponent <BoxCollider>();
                            camBoxCollider.size      = cameraBoxCollider;
                            camBoxCollider.isTrigger = true;
                        }
                    }
                }
            }
        }
    }