Вы можете перемножить два кватерниона вместе, чтобы получить третий кватернион, который является результатом двух вращений. Обратите внимание, что умножение кватернионов не является коммутативным, то есть порядок имеет значение (если вы проделаете это в уме несколько раз, вы поймете, почему).
Вы можете создать кватернион, представляющий поворот на заданный угол вокруг определенной оси, примерно так (извините, что это С++, а не java):
Quaternion Quaternion::create_from_axis_angle(const double &xx, const double &yy, const double &zz, const double &a)
{
// Here we calculate the sin( theta / 2) once for optimization
double factor = sin( a / 2.0 );
// Calculate the x, y and z of the quaternion
double x = xx * factor;
double y = yy * factor;
double z = zz * factor;
// Calcualte the w value by cos( theta / 2 )
double w = cos( a / 2.0 );
return Quaternion(x, y, z, w).normalize();
}
Например, чтобы вращаться вокруг оси x, вы можете создать кватернион с createFromAxisAngle(1, 0, 0, M_PI/2)
и умножить его на текущий кватернион вращения вашей модели.
person
sje397
schedule
14.12.2010