Пусть заданы два единичных кватерниона 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 );

⇐ Предыдущая| |Следующая ⇒