Unity - отключить AR HitTest после первоначального размещения - PullRequest
0 голосов
/ 24 июня 2018

Я использую плагин ARKit для Unity, используя UnityARHitTestExample.cs.

После того, как я помещаю свой объект на мировую сцену, я хочу отключить ARKit от попытки разместить объект снова каждый раз, когда я касаюсь экрана,Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 24 июня 2018

Это можно сделать несколькими способами, хотя, возможно, самым простым является создание boolean, чтобы определить, была ли размещена ваша модель.

Прежде всего, вы должны создать boolean, как указано выше, например:

private bool modelPlaced = false;

Затем вы установите значение true в функции HitTestResultType после размещения вашей модели:

bool HitTestWithResultType (ARPoint point, ARHitTestResultType resultTypes)
{
    List<ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface ().HitTest (point, resultTypes);
    if (hitResults.Count > 0) {
        foreach (var hitResult in hitResults) {

            //1. If Our Model Hasnt Been Placed Then Set Its Transform From The HitTest WorldTransform
            if (!modelPlaced){

                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));

                //2. Prevent Our Model From Being Positioned Again
                modelPlaced = true;
            }


            return true;
        }
    }
    return false;
}

А затем в функции Update():

void Update () {

    //Only Run The HitTest If We Havent Placed Our Model
    if (!modelPlaced){

        if (Input.touchCount > 0 && m_HitTransform != null)
        {
            var touch = Input.GetTouch(0);
            if (touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved)
            {
                var screenPosition = Camera.main.ScreenToViewportPoint(touch.position);
                ARPoint point = new ARPoint {
                    x = screenPosition.x,
                    y = screenPosition.y
                };

                ARHitTestResultType[] resultTypes = {
                    ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent, 
                }; 

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

Надеюсь, это поможет ...

...