У меня есть два вектора, описывающие вращения; вращение запуска A и целевое вращение B. Как я лучше всего пошел бы об интерполяции фактором F для приближения к B?
Используя простой lerp на сбоях векторов для работы, когда больше чем один размер должен быть интерполирован (т.е. производит нежелательные вращения). Возможно, создание кватернионов от векторов вращения и использование slerp являются способом пойти. Но как, затем, я мог извлечь вектор, описывающий новое вращение от получающегося кватерниона?
Заранее спасибо.
Поскольку я, кажется, не понимаю вашего вопроса, вот небольшая реализация SLERP на Python с использованием numpy. Результаты я построил с помощью matplotlib (v.99 для Axes3D). Я не знаю, можете ли вы использовать python, но похоже ли это на вашу реализацию SLERP? Мне кажется, что это дает прекрасные результаты ...
from numpy import *
from numpy.linalg import norm
def slerp(p0, p1, t):
omega = arccos(dot(p0/norm(p0), p1/norm(p1)))
so = sin(omega)
return sin((1.0-t)*omega) / so * p0 + sin(t*omega)/so * p1
# test code
if __name__ == '__main__':
pA = array([-2.0, 0.0, 2.0])
pB = array([0.0, 2.0, -2.0])
ps = array([slerp(pA, pB, t) for t in arange(0.0, 1.0, 0.01)])
from pylab import *
from mpl_toolkits.mplot3d import Axes3D
f = figure()
ax = Axes3D(f)
ax.plot3D(ps[:,0], ps[:,1], ps[:,2], '.')
show()
Если вы решили использовать кватернионы (которые будут очень хорошо скользить), смотрите мой ответ здесь о ресурсах для реализации кватернионов: Вращение в OpenGL относительно области просмотра
Вы можете найти множество примеров в ссылках в этом посте.
Ну, ваш подход slerp будет работать и, вероятно, является наиболее эффективным с вычислительной точки зрения (хотя он немного сложен для понимания). Чтобы вернуться от кватернионов к вектору, вам нужно использовать набор формул, которые вы можете найти здесь.
Также есть немного соответствующего кода здесь, хотя я не знаю, соответствует ли он тому, как у вас представлены данные.