ARCore Хранение якорных / HitTrackable позиций и сравнение - PullRequest
0 голосов
/ 20 февраля 2019

Я новичок в Unity и пытаюсь сделать простую функцию в скрипте HelloARController.В этом сценарии я пытаюсь сохранить положение, в котором находится объект Энди в реальном мире.Я делаю это, используя этот код в методе Update ():

storePos.Add(hit.Pose.position);

Насколько я понимаю, hit.Pose.position - это трехмерное позиционирование того, где пользователь касается экрана, относительно пространства реального мира.(Я предполагаю. После некоторых исследований я пришел к такому выводу. Пожалуйста, не стесняйтесь меня поправлять!).Поэтому я сохранил эти координаты в списке.Если бы пользователь снова нажал или нажал где-то с такими же координатами, я просто хотел бы создать холст.Я делаю это с помощью цикла for, чтобы сравнить позицию попадания с ранее сохраненными позициями, например:

for (int i = 0; i < storePos.Count; i++)
                    {
                        if (hit.Pose.position == storePos[i])
                        {
                            etc...
                        }
                    }

При тестировании этого кода он не работает, и я подумал о некоторыхпричины, почему, но изо всех сил пытается найти решение этой проблемы.Продолжая понимать это, я был бы признателен за некоторые советы, ответы или советы!:)

1 Ответ

0 голосов
/ 20 февраля 2019

Как я уже сказал в комментарии, совершенно логично, что ваш код не работает.Учитывая, что сравнение двух значений с плавающей запятой с == не работает из-за точности значений с плавающей запятой, сравнение vector3s с 3 значениями с плавающей запятой было бы невозможным.Чтобы добиться этого, вы можете определить радиус для каждой сохраненной точки и проверить, находится ли новое касание в радиусе какой-либо точки, например:

float distance = 0.0f;
for (int i = 0; i < storePos.Count; i++)
{
         distance = (hit.Pose.position - storePos[i]).magnitude;
         // 0.1 as radius
         if (distance < 0.1f )
         {
             etc...
         }
 }

Также, если вы хотите добиться чего-то вроде нажатия на ЭндиОбъект и создать холст, вы можете использовать Raycasting следующим образом:

        Touch touch;
        if (!(Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began))
        {

            Ray ray = Camera.main.ScreenPointToRay(touch.position);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit, 100))
            {                    
                Debug.Log(hit.transform.gameObject+" Object is hit");
            }

         }   
...