Пусть заданы два единичных кватерниона q] и q2 и вещественный параметр / е [О,1]. Тогда для получения промежуточной ориентации между <7, н q2, соответствующей параметру t, можно воспользоваться следующей формулой:
. Sin(<p(l-f)) Sill(cpf)
slerp(qi,q2,t) = -^--Ч^-^-Чг- (1.67)
sincp smcp
Формула (1.67) находит единичный вектор, лежащий в плоскости, проходящей через g,, q2 и начало координат.
В этой формуле угол ф определяется следующим образом:
cosq> = wlw2+xlx2 + y]y2 + ziz1, (1.68)
т. е. предстваляет косинус скалярного произведения q] и q2.
Существует довольно простая интерпретация сферической интерполяции кватернионов: рассмотрим кватернионы q{ и q2 как точки на единичной сфере ЦфЦ = 1. Тогда функция slerp описывает кратчайшую дугу на этой сфере, соединяющую эти точки.
Ниже приводится описание класса, служащего для работы с кватернионами. X
class Quaternion {
public: // make all members public
float x, y, z, w;
Координаты и их преобразования
Quaternion () {}
Quaternion ( float theX, float theY = 0, float theZ = 0, float theW = 0 )
{
x = theX; y = theY; z = theZ; w = theW;
}
Quaternion ( const Quaternions q ) {
x = q.x;
y = q-y;
z = q.z; w = q.w;
}
Quaternion ( const Vector3D& v ) {
X = v.x; y = v.y; z = v. z; w = O.Of;
}
Quaternion ( float angle, const Vector3D& axis );
Quaternion operator + () const {
return *this;
}
Quaternion operator - () const {
return Quaternion ( -x, -y, -z, -w );
}
Quaternions conj () {
x = -x;
y = -y; z = - z ;
return *this;
}
А. В. Боресков. Гоафика трехмерной компьютерной игры
Quaternions operator += ( const Quaternions q ) {
x += q.x;
У += q-У; z += q.z; w += q.w;
return *this;
}
Quaternions operator -= ( const Quaternions q ) {
x -= q.x;
У -= q.y; z - = q.z; w -= q.w;
return *this;
}
Quaternions operator *= ( const Quaternions q ) {
*this = Quaternion ( у * q.z - z * q.y + w * q.x + x * q.w,
z * q.x - x * q.z + w * q.y + у * q.w, x * q.y - у * q.x + w * q.z + z * q.w, w*q.w-x*q.x-y*q.y-z *q.z );
return *this;
}
Vector3D rotate ( const Vector3DS v );