Android. Как перемещать объект в направлении, к которому он обращен (с использованием Vector3 и Quaternion)

Я использую libGDX (совершенно новый для него на самом деле) и Android. И я хочу переместить 3d-объект в направлении, в котором он находится (с некоторой скоростью). Я думаю, что это основной вопрос, но он не может найти прямой ответ. У меня есть Quaternion, представляющий вращение объекта (направление), и у меня есть Vector3, представляющий позицию объекта. Вопрос в том, как обновить позицию Vector3, используя информацию из Quaternion, чтобы переместить объект в направлении, представленном Quaternion. (Альтернативой этому является откат качки и рыскание от Quaternion и получение новых коордов, применяя тригонометрические вычисления. Но я думаю, что для достижения этого нужно использовать Vector3 и Quat.)

Кватернион используется для указания вращения. Сначала вам нужно указать направление, когда не применяется поворот. Например, если вы хотите перемещаться по оси X, когда вращение не применяется:

Vector3 baseDirection = new Vector3(1,0,0); 

Убедитесь, что базовое направление нормализовано (длина = 1), вы можете использовать метод nor() для обеспечения безопасности:

 Vector3 baseDirection = new Vector3(1,0,0).nor(); 

Затем вам нужно повернуть направление, используя Quaternion:

 Vector3 direction = new Vector3(); Quaternion rotation = your_quaternion; direction.set(baseDirection); direction.mul(rotation); 

Теперь, когда у вас есть направление, вы можете масштабировать его с суммой, которую вы хотите переместить. Вероятно, вы захотите сделать это каждый кадр и в зависимости от времени, прошедшего с момента последнего кадра.

 final float speed = 5f; // 5 units per second Vector3 translation = new Vector3(); translation.set(direction); translation.scl(speed * Gdx.graphics.getDeltaTime()); 

Наконец, вам нужно добавить перевод в позицию

 position.add(translation); 

Конечно, в зависимости от вашей реальной реализации вы можете выполнять несколько операций, например:

 translation.set(baseDirection).mul(rotation).scl(speed * Gdx.graphics.getDeltaTime()); position.add(translation); 

Обновление: добавление рабочего кода из комментария Xoppa:

 translation.set(baseDirection).rot(modelInstance.transform).nor().scl(speed * delta) 
Intereting Posts
Библиотека Android с использованием основных ресурсов проекта Как фрагмент загрузки в ViewPager только тогда, когда выбранный Android MediaPlayer получает объем Почему я отправляю RST, если мой сокет подключен и не закрыт? Преимущества в Android для импорта библиотеки внутри и снаружи Как изменить высоту макета как анимацию (программно) Альтернативные зеркала для Android Kernel 3.0, так как kernel.org не работает? ListView в SlidingDrawer теряет фокус после onResume Вызов службы биллинга в приложении без установки целевого пакета для намерения Расстояние между двумя телефонами Android Соединение через некоторое время прекращает подключение к Интернету Android: настройка уровня масштабирования в Картах Google для включения всех точек маркера Файлы cookie не хранятся в API-интерфейсе android WebView API 21 и выше Где я могу найти файл базы данных Realm по умолчанию Как получить объект Google Maps внутри фрагмента