예제 #1
0
 private void UpdateImageAnchor(ARImageAnchor arImageAnchor)
 {
     Debug.LogFormat("image anchor updated[{0}] : tracked => {1}", arImageAnchor.Identifier, arImageAnchor.IsTracked);
     if (arImageAnchor.ReferenceImageName == "dynamicImage")
     {
         if (_gameObject != null)
         {
             if (arImageAnchor.IsTracked)
             {
                 if (!_gameObject.activeSelf)
                 {
                     _gameObject.SetActive(true);
                 }
                 _gameObject.transform.position = UnityARMatrixOps.GetPosition(arImageAnchor.Transform);
                 _gameObject.transform.rotation = UnityARMatrixOps.GetRotation(arImageAnchor.Transform);
             }
             else if (_gameObject.activeSelf)
             {
                 //_imageAnchorGO.SetActive(false);
             }
         }
     }
 }
예제 #2
0
    /// <summary>
    /// Get the camera pose for the current frame.
    /// </summary>
    /// <returns>The camera pose of the current frame.</returns>
    public static Pose GetCameraPose()
    {
        Pose framePose = new Pose();

        if (Application.platform == RuntimePlatform.IPhonePlayer)
        {
#if ARCORE_IOS_SUPPORT
            var session = UnityARSessionNativeInterface.GetARSessionNativeInterface();
            if (session != null)
            {
                var matrix = session.GetCameraPose();
                framePose.position = UnityARMatrixOps.GetPosition(matrix);
                framePose.rotation = UnityARMatrixOps.GetRotation(matrix);
            }
#endif
        }
        else
        {
            framePose = Frame.Pose;
        }

        return(framePose);
    }
예제 #3
0
        void UpdateImageAnchor(ARImageAnchor arImageAnchor)
        {
            m_logger.Debug("image anchor updated {0}", arImageAnchor.referenceImageName);

            ARKitTrackedImage trackedImage;

            if (m_trackedImages.TryGetValue(arImageAnchor.identifier, out trackedImage))
            {
                trackedImage.gameObject.SetActive(true);

                trackedImage.gameObject.transform.position = UnityARMatrixOps.GetPosition(arImageAnchor.transform);
                trackedImage.gameObject.transform.rotation = UnityARMatrixOps.GetRotation(arImageAnchor.transform);

                trackedImage.transform.localScale = arImageAnchor.transform.lossyScale * arImageAnchor.referenceImagePhysicalSize;

                /*
                 * m_logger.Debug("Setting pos={0} rot={1} scale={2}",
                 *             trackedImage.gameObject.transform.position,
                 *             trackedImage.gameObject.transform.rotation.eulerAngles,
                 *             trackedImage.transform.localScale);
                 */
            }
        }
예제 #4
0
        bool HitTestWithResultType(ARPoint point, ARHitTestResultType resultTypes)
        {
            Debug.Log("Enter HitTestWithResultType!");
            List <ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest(point, resultTypes);

            Debug.Log("HitResults " + hitResults.Count);
            if (hitResults.Count > 0)
            {
                foreach (var hitResult in hitResults)
                {
                    Debug.Log("Got hit!");
                    m_HitObject.transform.position = UnityARMatrixOps.GetPosition(hitResult.worldTransform);
                    m_HitObject.transform.rotation = Quaternion.LookRotation(new Vector3(
                                                                                 m_HitObject.transform.position.x - arCameraManager.m_camera.transform.localPosition.x,
                                                                                 0.0f,
                                                                                 m_HitObject.transform.position.z - arCameraManager.m_camera.transform.position.z));
                    m_HitObject.SetActive(true);
                    return(true);
                }
            }
            m_HitObject.SetActive(false);
            return(false);
        }
예제 #5
0
        /// <summary>
        /// Finds a target object by name and updates its state.
        /// </summary>
        /// <param name="label">     A label to aid in debugging.</param>
        /// <param name="anchorData">Anchor data.</param>
        /// <param name="act">       The action to perform once the target is found.</param>
        private void WithTarget(string label, ARImageAnchor anchorData, Action <TrackableFoundEventHandler> act)
        {
            var tracking = Tracking ? "tracking" : "not tracking";

            ScreenDebugger.Print($"{label} {anchorData.referenceImageName} [{tracking}]");

            if (Tracking)
            {
                var targetName = anchorData.referenceImageName;
                if (targetsByName.ContainsKey(targetName))
                {
                    var target = targetsByName[targetName];
                    act?.Invoke(target);
                    target.transform.position = UnityARMatrixOps.GetPosition(anchorData.transform);
                    target.transform.rotation = UnityARMatrixOps.GetRotation(anchorData.transform);
                }
                else
                {
                    ScreenDebugger.Print($"Couldn't find {targetName}");
                    ScreenDebugger.Print($"Names we recognize: {string.Join(", ", targetsByName.Keys.ToArray())}");
                }
            }
        }
예제 #6
0
        void AddImageAnchor(ARImageAnchor arImageAnchor)
        {
            Debug.Log("image anchor added");
            if (arImageAnchor.referenceImageName == referenceImage.imageName)
            {
                transform.position = UnityARMatrixOps.GetPosition(arImageAnchor.transform);
                transform.rotation = UnityARMatrixOps.GetRotation(arImageAnchor.transform);



                if (Marker != null)
                {
                    _myMarker = Instantiate(Marker, Anchor.position, Anchor.rotation);
                    _myMarker.GetComponent <MarkerQuadScript>().setARImage(referenceImage);
                    StartCoroutine(HideMarker());
                }
                if (detected != null)
                {
                    detected(this);
                }
                _lastTimeUpdate = Time.time;
            }
        }
예제 #7
0
    public static ExARKitPlaneMeshRender UpdatePlaneWithAnchorTransform(ExARKitPlaneMeshRender plane, ARPlaneAnchor arPlaneAnchor)
    {
        //do coordinate conversion from ARKit to Unity
        plane.transform.position = UnityARMatrixOps.GetPosition(arPlaneAnchor.transform);
        plane.transform.rotation = UnityARMatrixOps.GetRotation(arPlaneAnchor.transform);

        plane.UpdateMesh(arPlaneAnchor);

        MeshFilter mf = plane.GetComponentInChildren <MeshFilter> ();

        if (mf != null)
        {
            //if (apmr == null) {
            //since our plane mesh is actually 10mx10m in the world, we scale it here by 0.1f
            mf.gameObject.transform.localScale = new Vector3(arPlaneAnchor.extent.x * 0.1f, arPlaneAnchor.extent.y * 0.1f, arPlaneAnchor.extent.z * 0.1f);

            //convert our center position to unity coords
            mf.gameObject.transform.localPosition = new Vector3(arPlaneAnchor.center.x, arPlaneAnchor.center.y, -arPlaneAnchor.center.z);
            //}
        }

        return(plane);
    }
예제 #8
0
    void AddImageAnchor(ARImageAnchor arImageAnchor)
    {
        Debug.LogFormat("image anchor added[{0}] : tracked => {1}", arImageAnchor.identifier, arImageAnchor.isTracked);
        if (arImageAnchor.referenceImageName == referenceImage.imageName)
        {
            markerPosition = UnityARMatrixOps.GetPosition(arImageAnchor.transform);
            markerRotation = UnityARMatrixOps.GetRotation(arImageAnchor.transform);
            Debug.Log("Marker Position: " + markerPosition);
            Debug.Log("Marker Rotation: " + markerRotation);

            imageAnchorGO = Instantiate <GameObject>(prefabToGenerate, markerPosition, markerRotation);

            GameObject markerText = GameObject.Find("markerLocation");
            //GameObject markerFoundPrompt = new GameObject();
            //markerFoundPrompt.AddComponent<TextMesh>();
            //markerFoundPrompt.GetComponent<TextMesh>().text = "Marker position: " + markerPosition + ". MarkerRotation: " + markerRotation ;
            //Vector3 worldPoint = Camera.main.ScreenToWorldPoint(new Vector3(0, 0, 0));
            //imageAnchorGO = Instantiate<GameObject> (markerFoundPrompt, worldPoint, Quaternion.identity);
            //Debug.Log(markerFoundPrompt.GetComponent<TextMesh>().text);
            //Debug.Log(markerFoundPrompt.GetComponent<TextMesh>().transform.position);
            //Debug.Log(markerFoundPrompt.GetComponent<TextMesh>().transform.rotation);
        }
    }
예제 #9
0
    private bool HitTestWithResultType(ARPoint point, ARHitTestResultType resultTypes)
    {
        List <ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest(point, resultTypes);

        if (hitResults.Count > 0)
        {
            foreach (var hitResult in hitResults)
            {
                Debug.Log("Got hit!");
                m_HitTransform.position = UnityARMatrixOps.GetPosition(hitResult.worldTransform);
                m_HitTransform.rotation = UnityARMatrixOps.GetRotation(hitResult.worldTransform);
                //targetPosition = UnityARMatrixOps.GetPosition(hitResult.worldTransform);
                targetRotation = UnityARMatrixOps.GetRotation(hitResult.worldTransform);
                //m_HitTransform.position = targetPosition;
                //m_HitTransform.rotation = targetRotation;
                //FramePerfabs.transform.position = targetPosition;
                // FramePerfabs.transform.rotation = targetRotation;
                Debug.Log(string.Format("x:{0:0.######} y:{1:0.######} z:{2:0.######}", m_HitTransform.position.x, m_HitTransform.position.y, m_HitTransform.position.z));
                return(true);
            }
        }
        return(false);
    }
예제 #10
0
파일: BallMaker.cs 프로젝트: abhid94/ARPT
    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            var     screenPosition = Camera.main.ScreenToViewportPoint(Input.mousePosition);
            ARPoint point          = new ARPoint {
                x = screenPosition.x,
                y = screenPosition.y
            };

            List <ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest(point,
                                                                                                                    ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent);
            if (hitResults.Count > 0)
            {
                foreach (var hitResult in hitResults)
                {
                    Vector3 position = UnityARMatrixOps.GetPosition(hitResult.worldTransform);
                    CreateBall(new Vector3(position.x, position.y + createHeight, position.z));
                    break;
                }
            }
        }
    }
예제 #11
0
    bool HitTestWithResultType(ARPoint point, ARHitTestResultType resultTypes)
    {
        List <ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest(point, resultTypes);

        if (hitResults.Count > 0)
        {
            Debug.Log("Got a hit");
            foreach (var hitResult in hitResults)
            {
//				m_HitTransform.position = UnityARMatrixOps.GetPosition (hitResult.worldTransform);
//				m_HitTransform.rotation = UnityARMatrixOps.GetRotation (hitResult.worldTransform);
                Vector3    position = UnityARMatrixOps.GetPosition(hitResult.worldTransform);
                GameObject target   = DisplayAnchorPoint(position, 0);

                // anchor selected on server! LOCK IN
                anchorChosen = true;
                anchorSelect = true;
                anchor       = target;

                return(true);
            }
        }
        return(false);
    }
예제 #12
0
    void ProcessInput()
    {
        if (Input.touchCount > 0 && buttonPressed == false)
        {
            var touch = Input.GetTouch(0);

            if (touch.tapCount == 2)
            {
                currentAnimation = AnimState.Dance;
                return;
            }

            if (touch.phase == TouchPhase.Began)
            {
                var     screenPosition = Camera.main.ScreenToViewportPoint(touch.position);
                ARPoint point          = new ARPoint
                {
                    x = screenPosition.x,
                    y = screenPosition.y
                };

                List <ARHitTestResult> hitResults =
                    UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest(
                        point, ARHitTestResultType.ARHitTestResultTypeEstimatedHorizontalPlane);
                if (hitResults.Count > 0)
                {
                    foreach (var hitResult in hitResults)
                    {
                        Vector3 position = UnityARMatrixOps.GetPosition(hitResult.worldTransform);
                        PetGo(position);
                        break;
                    }
                }
            }
        }
    }
    public void UpdateEnvironmentProbe(AREnvironmentProbeAnchor environmentProbeAnchor)
    {
        transform.position = UnityARMatrixOps.GetPosition(environmentProbeAnchor.transform);

        Quaternion rot = UnityARMatrixOps.GetRotation(environmentProbeAnchor.transform);

        //rot.z = -rot.z;
        //rot.w = -rot.w;

        transform.rotation = rot;

        if (reflectionProbe != null)
        {
            reflectionProbe.size = environmentProbeAnchor.Extent;
        }

        if (debugExtentGO != null)
        {
            debugExtentGO.transform.localScale = environmentProbeAnchor.Extent;
        }

        latchedTexture = environmentProbeAnchor.Cubemap;
        latchUpdate    = true;
    }
예제 #14
0
    //testing

    //finding the place to place
    bool HitTestWithResultType(ARPoint point, ARHitTestResultType resultTypes)
    {
        List <ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest(point, resultTypes);

        if (hitResults.Count > 0)
        {
            foreach (var hitResult in hitResults)
            {
                for (int i = 0; i < arpags.Count; i++)
                {
                    if (hitResult.anchorIdentifier == arpags[i].planeAnchor.identifier)
                    {
                        selectedPlaneValue = i;
                        //  planePlacementState = planeState.Set;
                        // print(planePlacementState);

                        PlaceFloorPlane(UnityARMatrixOps.GetPosition(hitResult.worldTransform));
                        return(true);
                    }
                }
            }
        }
        return(false);
    }
예제 #15
0
    private void AddImageAnchor(ARImageAnchor arImageAnchor)
    {
        Debug.LogFormat("image anchor added[{0}] : tracked => {1}", arImageAnchor.Identifier, arImageAnchor.IsTracked);
        if (arImageAnchor.ReferenceImageName == "dynamicImage")
        {
            Vector3    position = UnityARMatrixOps.GetPosition(arImageAnchor.Transform);
            Quaternion rotation = UnityARMatrixOps.GetRotation(arImageAnchor.Transform);

            var arObjectState = ArBehaviour.ArObjectState;
            if (arObjectState != null && TriggerObject != null && !_gameObjectCreated)
            {
                _gameObjectCreated = true;

                lock (arObjectState)
                {
                    transform.position = position;
                    transform.rotation = rotation;

                    var result = ArBehaviour.CreateArObject(
                        arObjectState,
                        TriggerObject.gameObject,
                        null,
                        transform,
                        TriggerObject.poi,
                        TriggerObject.poi.id,
                        out _gameObject
                        );
                    if (!ArBehaviourPosition.IsEmpty(result))
                    {
                        ArBehaviour.ErrorMessage = result;
                        return;
                    }
                }
            }
        }
    }
 void UpdateImageAnchor(ARImageAnchor arImageAnchor)
 {
     Debug.Log("image anchor updated");
     if (arImageAnchor.referenceImageName == referenceImage.imageName)
     {
         imageAnchorGO.transform.position = UnityARMatrixOps.GetPosition(arImageAnchor.transform);
         imageAnchorGO.transform.rotation = UnityARMatrixOps.GetRotation(arImageAnchor.transform);
         searchcount++;
         if (!issetparent && searchcount > searchlimit)
         {
             issetparent       = true;
             offset            = worldroot.position - imageAnchorGO.transform.position;
             eulerangleYoffset = worldroot.eulerAngles.y - imageAnchorGO.transform.eulerAngles.y;
             lockedDoneTitle.gameObject.SetActive(true);
             Debug.Log("记录初始偏移  ==  " + offset.ToString() + "   " + eulerangleYoffset.ToString());
         }
         else if (issetparent)
         {
             Debug.Log("位置恢复!!!!!!");
             worldroot.position    = imageAnchorGO.transform.position + offset;
             worldroot.eulerAngles = new Vector3(0, imageAnchorGO.transform.eulerAngles.y + eulerangleYoffset, 0);
         }
     }
 }
예제 #17
0
    void Update()
    {
        if (m_camera != null)
        {
            Matrix4x4 matrix = m_session.GetCameraPose();

            Vector3 arPos         = UnityARMatrixOps.GetPosition(matrix);
            Vector3 diff          = arPos - lastArPos;
            Vector3 correctedDiff = new Vector3(
                sin * diff.z + cos * diff.x,
                diff.y,
                cos * diff.z - sin * diff.x);
            m_camera.transform.localPosition += correctedDiff;
            lastArPos = arPos;

            Quaternion r = UnityARMatrixOps.GetRotation(matrix);
            m_camera.transform.localRotation = Quaternion.Euler(
                r.eulerAngles.x,
                r.eulerAngles.y + initRotation.eulerAngles.y,
                r.eulerAngles.z);

            m_camera.projectionMatrix = m_session.GetCameraProjection();
        }
    }
예제 #18
0
    bool HitTestWithResultType(ARPoint point, ARHitTestResultType resultTypes)
    {
        if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
        {
            return(false);
        }                                                                                                   // don't register touches on the UI

        List <ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest(point, resultTypes);

        if (hitResults.Count > 0)
        {
            foreach (var hitResult in hitResults)                                                                      // Why not just get [0] instead of looping?
            {
                m_HitTransform.position = UnityARMatrixOps.GetPosition(hitResult.worldTransform) + Vector3.up * 0.02f; // move above grid slightly
                m_HitTransform.rotation = UnityARMatrixOps.GetRotation(hitResult.worldTransform);
                if (!planePainting)
                {
                    PaintPlaneOn();
                }
                return(true);
            }
        }
        return(false);    // no hit results
    }
예제 #19
0
        private bool HitTestWithResultType(ARPoint point, ARHitTestResultType resultType)
        {
            List <ARHitTestResult> hitResults =
                UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest(point, resultType);

            if (hitResults.Count > 0)
            {
                foreach (ARHitTestResult hitResult in hitResults)
                {
                    Debug.Log("Got hit!");

                    Vector3    position = UnityARMatrixOps.GetPosition(hitResult.worldTransform);
                    Quaternion rotation = UnityARMatrixOps.GetRotation(hitResult.worldTransform);

                    // Transform to placenote frame of reference
                    Matrix4x4 worldTransform     = Matrix4x4.TRS(position, rotation, Vector3.one);
                    Matrix4x4?placenoteTransform = LibPlacenote.Instance.ProcessPose(worldTransform);

                    Vector3    hitPosition = PNUtility.MatrixOps.GetPosition(placenoteTransform.Value);
                    Quaternion hitRotation = PNUtility.MatrixOps.GetRotation(placenoteTransform.Value);

                    // Create node info object
                    NodeInfo nodeInfo = new NodeInfo();
                    nodeInfo.px       = hitPosition.x;
                    nodeInfo.py       = hitPosition.y;
                    nodeInfo.pz       = hitPosition.z;
                    nodeInfo.nodeType = (int)m_NodeController._selectedNodeType;

                    m_NodeController.AddActiveNode(nodeInfo);

                    return(true);
                }
            }

            return(false);
        }
    void UpdateImageAnchor(ARImageAnchor arImageAnchor)
    {
        Debug.LogFormat("image anchor updated[{0}] : tracked => {1}", arImageAnchor.identifier, arImageAnchor.isTracked);
        if (bindObjectToImage && arImageAnchor.referenceImageName == referenceImage.imageName)
        {
            if (arImageAnchor.isTracked)
            {
                if (!imageAnchorGO.activeSelf)
                {
                    imageAnchorGO.SetActive(true);
                }

                if (bindObjectToImage)
                {
                    imageAnchorGO.transform.position = UnityARMatrixOps.GetPosition(arImageAnchor.transform);
                    imageAnchorGO.transform.rotation = UnityARMatrixOps.GetRotation(arImageAnchor.transform);
                }
            }
            else if (destroyObjectOnEnd && imageAnchorGO)
            {
                GameObject.Destroy(imageAnchorGO);
            }
        }
    }
예제 #21
0
    bool HitTestWithResultType(ARPoint point, ARHitTestResultType resultTypes)      // UI button
    {
        List <ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest(point, resultTypes);

        if (hitResults.Count > 0)
        {
            foreach (var hitResult in hitResults)
            {   // Manually adding 1 unit on Y axis because of the pivot point and center of the 3D model
                Vector3    position = UnityARMatrixOps.GetPosition(hitResult.worldTransform) + new Vector3(0, 1f, 0);
                Quaternion rotation = UnityARMatrixOps.GetRotation(hitResult.worldTransform);


                OpenDoorInFront(position, rotation);                                       // Passing the data to spwan the portal on detected dimentions from hit test

                Instantiate(particleLauncher, position + new Vector3(0, 1f, 0), rotation); // particle animation
                instructionText.text = "Enjoy your journey!!";
                Vector3 currentAngle = transform.eulerAngles;
                transform.LookAt(Camera.main.transform);
                transform.eulerAngles = new Vector3(currentAngle.x, transform.eulerAngles.y, currentAngle.z);               // Angle correction for the door that is placed
                return(true);
            }
        }
        return(false);
    }
예제 #22
0
        void FaceUpdated(ARFaceAnchor anchorData)
        {
            if (_positionBuffer == null)
            {
                return;
            }

            var mapWidth  = _positionMap.width;
            var mapHeight = _positionMap.height;
            var vCount    = anchorData.faceGeometry.vertices.Length;

            _positionBuffer.SetData(anchorData.faceGeometry.vertices);
            gameObject.transform.localPosition = UnityARMatrixOps.GetPosition(anchorData.transform);
            gameObject.transform.localRotation = UnityARMatrixOps.GetRotation(anchorData.transform);

            _vertexBaker.SetInt(_vertexCountID, vCount);
            _vertexBaker.SetMatrix(_transformID, gameObject.transform.localToWorldMatrix);
            _vertexBaker.SetBuffer(0, _positionBufferID, _positionBuffer);
            _vertexBaker.SetTexture(0, _positionMapID, _tmpPositionMap);

            _vertexBaker.Dispatch(0, mapWidth / 8, mapHeight / 8, 1);

            Graphics.CopyTexture(_tmpPositionMap, _positionMap);
        }
예제 #23
0
        // Update is called once per frame
        void Update()
        {
            Matrix4x4 matrix = m_session.GetCameraPose();

            if (m_arMode)
            {
                transform.localPosition = UnityARMatrixOps.GetPosition(matrix) * 1f;
            }
            else
            {
                transform.localPosition = UnityARMatrixOps.GetPosition(matrix) * 200f; //m_movementScale;
            }
            transform.localRotation = UnityARMatrixOps.GetRotation(matrix);
            //Camera.main.projectionMatrix = m_session.GetCameraProjection();
            if (m_arMode)
            {
                //for AR mode
                Camera.main.projectionMatrix = m_session.GetCameraProjection();
                foreach (Camera cam in Camera.main.transform.GetComponentsInChildren <Camera>())
                {
                    cam.projectionMatrix = Camera.main.projectionMatrix;
                }
            }
        }
예제 #24
0
        bool HitTestWithResultType(ARPoint point, ARHitTestResultType resultTypes)
        {
            List <ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest(point, resultTypes);

            if (hitResults.Count > 0)
            {
                foreach (var hitResult in hitResults)
                {
                    Logger.Info("Got hit!");
                    OnClickPlane(UnityARMatrixOps.GetPosition(hitResult.worldTransform), UnityARMatrixOps.GetRotation(hitResult.worldTransform));
                    //Logger.Info(string.Format("x:{0:0.######} y:{1:0.######} z:{2:0.######}", m_HitTransform.position.x, m_HitTransform.position.y, m_HitTransform.position.z));
                    return(true);
                }
            }
            return(false);
        }
예제 #25
0
 void FaceAdded(ARFaceAnchor anchorData)
 {
     currentBlendShapes            = anchorData.blendShapes;
     model.transform.localPosition = UnityARMatrixOps.GetPosition(anchorData.transform);
     model.transform.localPosition = new Vector3(model.transform.localPosition.x, model.transform.localPosition.y + offsetY, model.transform.localPosition.z);
 }
 void FaceAdded(ARFaceAnchor anchorData)
 {
     anchorPrefab.transform.position = UnityARMatrixOps.GetPosition(anchorData.transform);
     anchorPrefab.transform.rotation = UnityARMatrixOps.GetRotation(anchorData.transform);
     anchorPrefab.SetActive(true);
 }
예제 #27
0
    protected override void Update()
    {
        if (IsNewLayer)
        {
            _sessionStarted = false;
        }
        base.Update();

        var layerItemList = LayerItemList;

        if (MenuEnabled.HasValue && MenuEnabled.Value && layerItemList != null && layerItemList.Any())
        {
            var fitToScanOverlay = FitToScanOverlay;
            if (fitToScanOverlay != null && fitToScanOverlay.activeSelf)
            {
                long nowTicks = DateTime.Now.Ticks;
                var  second   = nowTicks / 10000000L;
                if (!_fitToScanOverlayActivationSecond.HasValue)
                {
                    _fitToScanOverlayActivationSecond = second;
                    //Debug.LogFormat("FTS value {0}", _fitToScanOverlayActivationSecond.Value);
                }
                else
                {
                    var value = _fitToScanOverlayActivationSecond.Value;
                    if (value + 30 < second)
                    {
                        //Debug.LogFormat("FTS value {0}, second {1}", _fitToScanOverlayActivationSecond.Value, second);

                        var triggerObjects = TriggerObjects;
                        if (triggerObjects != null)
                        {
                            foreach (var t in triggerObjects.Values)
                            {
                                t.isActive = false;
                            }
                        }
                        _fitToScanOverlayActivationSecond = null;
                        MenuButtonClick = new MenuButtonClickActivity {
                            ArBehaviour = this
                        };
                    }
                    else
                    {
                        SetInfoText($"Timeout in {value + 30 - second} seconds.");
                    }
                }
            }
            else
            {
                _fitToScanOverlayActivationSecond = null;
            }
        }

#if IS_SLAM_APP
#else
        if (!_sessionStarted)
        {
            if (!HasTriggerImages)
            {
                StartArSession();
                return;
            }
            var anchorManager = AnchorManager.GetComponent <ArKitAnchorManager>();
            anchorManager.ArBehaviour      = this;
            anchorManager.TriggerObjects   = TriggerObjects;
            anchorManager.FitToScanOverlay = FitToScanOverlay;
            StartArSession(anchorManager.TriggerObjects);
        }
#endif
        if (m_camera != null && _sessionStarted)
        {
            // JUST WORKS!
            Matrix4x4 matrix = m_session.GetCameraPose();
            m_camera.transform.localPosition = UnityARMatrixOps.GetPosition(matrix);
            m_camera.transform.localRotation = UnityARMatrixOps.GetRotation(matrix);

            m_camera.projectionMatrix = m_session.GetCameraProjection();
        }
    }
예제 #28
0
    void Update()
    {
        if (m_camera != null && sessionStarted)
        {
            // Positional information of AR camera
            Matrix4x4 matrix = m_session.GetCameraPose();
            Vector3   newPos = UnityARMatrixOps.GetPosition(matrix);

            passedTime += Time.deltaTime;

            // Get accelerometer difference (experimental)
            double acc = Input.acceleration.z - lastAcc.z;      //Changed from Float to double on 6 Apr to try and get Acc data to show
            if (acc > 0)
            {
                dir = Direction.backward;
            }
            else if (acc < 0)
            {
                dir = Direction.forward;
            }

            // Do speed calculation and update UI
            if (frames % speedFrames == 0)
            {
                double dist = Vector3.Distance(newPos, lastPos);        //Changed from Float to double on 6 Apr to try and get Acc data to show | Added 6 Apr
                speed          = dist / passedTime;
                speedText.text = "Speed " + speed.ToString();
                if (speed > 1)
                {
                    warningText.text = "Slow down!";
                    if (dir == Direction.forward)
                    {
                        directionText.text = "Forwards";
                    }
                    else
                    {
                        directionText.text = "Backwards";
                    }
                }
                else
                {
                    warningText.text   = "";
                    directionText.text = "";
                }
                // Reset counters and update last recorded info
                frames     = 0;
                passedTime = 0;
                lastPos    = m_camera.transform.localPosition;
                lastAcc    = Input.acceleration;
                // Debug text
                posText.text          = "Pos: " + m_camera.transform.localPosition;
                accText.text          = "Acc: " + (string.Format("{0:0.000000000000}", (Input.acceleration - lastAcc))); //Ensure it's formatting value to 12 places after the decimal point so that it's clear whether there's any value in there.
                debugAccText.text     = "Acc Debug: " + (Input.acceleration);                                            //Display Current Acceleration to debug the Acceleration bug: Added 6 Apr
                debugAccTypeText.text = "Acc Type: " + (Input.acceleration.GetType());                                   //Added 6 Apr: Should Display type of the Input.accleration val to determine if it's an int
            }
            frames++;
            // Move game camera to new position/rotation sensed
            m_camera.transform.localPosition = UnityARMatrixOps.GetPosition(matrix);
            m_camera.transform.localRotation = UnityARMatrixOps.GetRotation(matrix);
            m_camera.projectionMatrix        = m_session.GetCameraProjection();
        }
    }
예제 #29
0
        private void PerformHitTest(Vector2 touchPos)
        {
            var planeType = DetectedPlaneType.HorizontalUpwardFacing;

            if (Application.platform == RuntimePlatform.IPhonePlayer)
            {
#if ARCORE_IOS_SUPPORT
                var     session       = UnityARSessionNativeInterface.GetARSessionNativeInterface();
                var     viewportPoint = Controller.MainCamera.ScreenToViewportPoint(touchPos);
                ARPoint arPoint       = new ARPoint
                {
                    x = viewportPoint.x,
                    y = viewportPoint.y
                };

                _hitResultList = session.HitTest(arPoint,
                                                 ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent);
                if (_hitResultList.Count > 0)
                {
                    // Fetch the closest hit result.
                    int minDistanceIndex = GetMinDistanceIndex(_hitResultList);

                    string identifier = _hitResultList[minDistanceIndex].anchorIdentifier;
                    if (_arPlaneAligmentMapping.ContainsKey(identifier))
                    {
                        planeType = _arPlaneAligmentMapping[identifier] ==
                                    ARPlaneAnchorAlignment.ARPlaneAnchorAlignmentVertical ?
                                    DetectedPlaneType.Vertical : DetectedPlaneType.HorizontalUpwardFacing;
                    }
                    else
                    {
                        Debug.LogWarningFormat("Didn't find anchor identifier: {0}", identifier);
                        return;
                    }

                    Pose hitPose = new Pose();
                    hitPose.position = UnityARMatrixOps.GetPosition(
                        _hitResultList[minDistanceIndex].worldTransform);
                    if (planeType == DetectedPlaneType.Vertical)
                    {
                        hitPose.rotation = UnityARMatrixOps.GetRotation(
                            _hitResultList[minDistanceIndex].worldTransform);
                    }
                    else
                    {
                        // Point the hitPose rotation roughly away from the raycast/camera
                        // to match ARCore.
                        hitPose.rotation.eulerAngles =
                            new Vector3(0.0f, Controller.MainCamera.transform.eulerAngles.y, 0.0f);
                    }

                    _hitPose = hitPose;
                    var anchorGO = new GameObject("ARUserAnchor");
                    _anchorComponent            = anchorGO.AddComponent <UnityARUserAnchorComponent>();
                    anchorGO.transform.position = hitPose.position;
                    anchorGO.transform.rotation = hitPose.rotation;
                }
#endif
            }
            else
            {
                TrackableHit arcoreHitResult = new TrackableHit();
                if (Frame.Raycast(touchPos.x, touchPos.y, TrackableHitFlags.PlaneWithinPolygon,
                                  out arcoreHitResult))
                {
                    DetectedPlane plane = arcoreHitResult.Trackable as DetectedPlane;
                    if (plane == null)
                    {
                        Debug.LogWarning("Hit test result has invalid trackable type: " +
                                         arcoreHitResult.Trackable.GetType());
                        return;
                    }

                    planeType        = plane.PlaneType;
                    _hitPose         = arcoreHitResult.Pose;
                    _anchorComponent =
                        arcoreHitResult.Trackable.CreateAnchor(arcoreHitResult.Pose);
                }
            }

            if (_anchorComponent != null)
            {
                Instantiate(CloudAnchorPrefab, _anchorComponent.transform);

                // Attach map quality indicator to this pawn.
                var indicatorGO =
                    Instantiate(MapQualityIndicatorPrefab, _anchorComponent.transform);
                _qualityIndicator = indicatorGO.GetComponent <MapQualityIndicator>();
                _qualityIndicator.DrawIndicator(planeType, Controller.MainCamera);

                InstructionText.text = " To save this location, walk around the object to " +
                                       "capture it from different angles";
                DebugText.text = "Waiting for sufficient mapping quaility...";

                // Hide plane generator so users can focus on the object they placed.
                Controller.PlaneGenerator.SetActive(false);
            }
        }
예제 #30
0
 /// <summary>
 /// Converts a <see cref="UnityARMatrix4x4"/> to a <see cref="Matrix4x4"/>.
 /// </summary>
 /// <param name="input">The input matrix.</param>
 /// <returns><see cref="Matrix4x4"/>.</returns>
 public static Matrix4x4 ToMatrix4x4(this UnityARMatrix4x4 input)
 {
     return(UnityARMatrixOps.GetMatrix(input));
 }