У меня есть снаряд, который движется по вектору скорости. Мне нужно убедиться, что объект всегда обращен в направлении вектора скорости. Кроме того, я представляю вращение объекта с использованием кватернионов, а не матриц.
Я знаю, что первым шагом является поиск ортогонального базиса:
forward = direction of velocity vector
up = vector.new(0, 1, 0)
right = cross(up, forward)
up = cross(forward, right)
Как я могу преобразовать базис в кватернион вращения?
Решение
Заметьте, я хотел бы поблагодарить Ноэля Хьюза за то, что он дал ответ, но я хочу уточнить с моим собственным опытом. Псевдокод следует:
vec3 vel = direction of velocity vector
vec3 forward = (1, 0, 0) // Depends on direction your model faces. See below.
vec3 axis = cross(forward, vel)
if (axis == 0) then quit // Already facing the right direction!
axis = normalize(axis)
float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
quat result = (0, axis.y * sin(theta/2), axis.z * sin(theta/2), cos(theta/2)
Последний элемент кватерниона - это скалярная часть, первые три элемента - это мнимые части. Кроме того, приведенный выше псевдокод предполагает, что ваш объект в «пространстве модели» направлен вниз по положительной оси X. В моем случае объект фактически указывал на положительную ось Y, и в этом случае я сделал следующие изменения:
vec3 vel = direction of velocity vector
vec3 forward = (0, 1, 0) // Note that y-component is now 1
vec3 axis = cross(forward, vel)
if (axis == 0) then quit
axis = normalize(axis)
float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
quat result = (axis.x * sin(theta/2), 0, axis.z * sin(theta/2), cos(theta/2)
// Note that SECOND component above is now 0