如何在增强现实中显示模型放置位置的跟踪线?

How to show a tracking line from where the model is placed in Augmented Reality?

我希望在我的应用程序中显示一条线,从放置模型的位置开始,以便用户知道模型在现实世界中的位置。当用户将设备相机从模型上移开时,线条会打开以显示模型所在的位置。同样,它会在检测到模型时关闭。我附上了来自类似应用程序的图像,白色虚线显示了路径。注意检测到模型时线条是如何消失的。

 LineRenderer lins;
 public GameObject Lineprefab;
 private GameObject newline;
 public Transform startpoint;

 public Renderer m_rend1;

       bool HitTestWithResultType (ARPoint point, ARHitTestResultType resultTypes) 
       {

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

           if (hitResults.Count > 0 && check==true) 
             {

              foreach (var hitResult in hitResults)

                {


            Debug.Log ("Got hit!");
            //obj.Hideplane();
            Genplanes.SetActive(false);

            if (Select == 0) {
                Debug.Log("hit-zero!");
                Instantiate(Instaobj[0], ForSelect);
                check = false;
            }

            if (Select == 1) {
                Debug.Log("hit-one!");
                Instantiate(Instaobj[1], ForSelect);
                check = false;
            }

            if (Select == 2) {
                Debug.Log("hit-two!");
                Instantiate(Instaobj[2], ForSelect);
                check = false;
            }

                m_HitTransform.position = UnityARMatrixOps.GetPosition (hitResult.worldTransform);
                m_HitTransform.rotation = UnityARMatrixOps.GetRotation (hitResult.worldTransform);
                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));

                obj.StopPlaneTracking();


                    }


              }
    return false;
        }


       private void Start()
    {

       spawngenerator();
        newline.SetActive(false);
        m_rend1 = GetComponent<MeshRenderer>();


    }







        void spawngenerator()

          {

           GameObject newline = Instantiate(Lineprefab);
           lins = newline.GetComponent<LineRenderer>();


          }


    private void LateUpdate()
        {
        lins.SetPosition(0, startpoint.position);
        lins.SetPosition(1, m_HitTransform.position);

        if( m_rend1.isVisible==true)
        {
            Debug.Log("Render is Visible");
            newline.SetActive(false);   

        }
        else if( m_rend1.isVisible==false)
        {

                newline.SetActive(true);
                Debug.Log("It is InVisible");

            Debug.Log("Render is InVisible");

        }

        }



void Update () {

#if UNITY_EDITOR   //we will only use this script on the editor side, though there is nothing that would prevent it from working on device
        if (Input.GetMouseButtonDown (0)) {
            Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
            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, collisionLayer)) {
                //we're going to get the position from the contact point
                m_HitTransform.position = hit.point;
                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));

                //and the rotation from the transform of the plane collider
                m_HitTransform.rotation = hit.transform.rotation;
            }
        }
        #else
        if (Input.touchCount > 0 && m_HitTransform != null )
        {
            var touch = Input.GetTouch(0);
            if ((touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved) &&  !EventSystem.current.IsPointerOverGameObject(touch.fingerId))
            {
                var screenPosition = Camera.main.ScreenToViewportPoint(touch.position);
                ARPoint point = new ARPoint {
                    x = screenPosition.x,
                    y = screenPosition.y
                };

                // prioritize reults types
                ARHitTestResultType[] resultTypes = {
                    //ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingGeometry,
                    ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent, 
                    // if you want to use infinite planes use this:
                    //ARHitTestResultType.ARHitTestResultTypeExistingPlane,
                    //ARHitTestResultType.ARHitTestResultTypeEstimatedHorizontalPlane, 
                    //ARHitTestResultType.ARHitTestResultTypeEstimatedVerticalPlane, 
                    //ARHitTestResultType.ARHitTestResultTypeFeaturePoint
                }; 

                foreach (ARHitTestResultType resultType in resultTypes)
                {
                    if (HitTestWithResultType (point, resultType))
                    {
                        return;
                    }
                }
            }
        }
        #endif


    }

.

首先,我会先检查模型是否在相机的边界框内 https://docs.unity3d.com/ScriptReference/Renderer-isVisible.html

如果对象不可见 (isVisible == false),则创建一个从对象位置到它应该结束的任何位置的线渲染器。

终点可能是它前面的相机子位置,所以它看起来像是从用户开始到对象。