Как я могу вызвать событие, когда пользователь вращает объект руками, используя Leap Motion в виртуальной реальности?

#unity3d #virtual-reality #oculus #leap-motion

#unity-game-engine #виртуальная реальность #oculus #leap-motion

Вопрос:

Я новичок в виртуальной реальности. Я использую Oculus Rift для гарнитуры и Leap Motion для интерактивности. Когда пользователь будет вращать объект руками, я хочу, чтобы запускалось определенное событие.

Вот мой код:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class step1 : MonoBehaviour
{

    public GameObject object;
    public ParticleSystem event;


    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        if(object.transform.rotation == Quaternion.AngleAxis(-30,Vector3.right))
        {
            Debug.Log("Done");
            event.Play();   
        }
    }
}
  

Ответ №1:

Обратите внимание, что, поскольку кватернионы могут представлять повороты до двух полных оборотов (720 градусов), это сравнение может возвращать false, даже если результирующие повороты выглядят одинаково.

Из Quaternion.operator == Документы Unity

Я бы избегал работать с кватернионами все вместе, так как они вызывают головную боль и неудобны в использовании.

Попробуйте использовать Vector3 представление с eulerAngles , а затем протестируйте приблизительное значение equals примерно так:

 //only checks for one axis!
if(Math.Abs(rotationA.eulerAngles.x - rotationB.eulerAngles.x) <= maxDifference)
{
    //do stuff
}
  

Или придерживайтесь Quaternion.Angle , но используйте его следующим образом:

 //compares angle directly
if(Math.Abs(Quaternion.Angle(rotationA, rotationB)) <= maxDifference)
{
    //do stuff
}
  

Vector3 состоит из трех float значений внутри и Quaternion.Angle возвращает float значение. Сравнение их для точного равенства не сработает в 99% всех случаев. Сравните их с максимальной разницей, с которой вас устраивает, и это должно сработать.

Комментарии:

1. Или вы можете использовать Mathf.Approximately для сравнения floats

2. Конечно. Вероятно, это было бы оптимальным решением для большинства случаев. Мне просто нравится контролировать поле, где мое сравнение возвращает true, отсюда сравнение maxDifference. Я думаю, что это невозможно с Mathf.Approximately ? Не уверен, хотя.

Ответ №2:

Вы хотите запустить событие

  1. когда пользователь впервые начинает вращать объект
  2. постоянно срабатывает, пока пользователь вращает объект
  3. когда пользователь закончит вращать объект

кстати, вам не обязательно выбирать только один из этих вариантов

в настоящее время ваша реализация запускает событие только тогда, когда ваш объект имеет определенное вращение — это ожидаемое поведение?

Комментарии:

1. Хотя это скорее вопрос, чем ответ.