Вручную повернуть локальную UP-ось 3D-объекта в направлении UP-оси мира? - PullRequest
0 голосов
/ 06 мая 2019

Мой объект может иметь любое (неизвестное) вращение в мире.

Мне нужно интерполировать локальную UP-ось этого объекта по направлению к UP-оси мира, не касаясь других локальных вращений объекта (представьте себебуй поправляется после удара волны).

Но мне удается только интерполировать всю ось объекта «по направлению ко всей оси Мира» одновременно, эффективно выравнивая мой объект по отношению к Миру, как жесткийтренировал северокорейского солдата парада.

Я использую этот код, чтобы выполнить свою ошибку:

var TopQuat:Quat = Quat(0,0,0,1)
transform.basis = Basis(Quat(transform.basis).slerp(TopQuat,delta))

Есть ли какие-либо подсказки для изоляции этой интерполяции к локальной UP-оси моего объекта?

1 Ответ

0 голосов
/ 08 мая 2019

Quaternion SLERP будет интерполировать между двумя ориентационными кватернионами - т. Е. Когда вес интерполяции достигнет 1,0, кадр вашего объекта будет соответствовать мировому фрейму.

Что вы ищете, так этокватернион, представляющий вращение вокруг оси между двумя векторами UP.Это можно вычислить, используя перекрестное произведение двух векторов для вычисления оси вращения, точечное произведение для вычисления (косинуса) угла между двумя векторами и формула для создания кватерниона оси и угла .

В зависимости от того, какую платформу вы используете для своей реализации, у вас может быть такой метод, уже реализованный в классе кватернионов.Например, класс Imath::Quaternion OpenEXR включает setRotation() метод , реализующий несколько более продвинутую версию алгоритма, описанного выше.

...