Вы можете умножить два кватерниона вместе, чтобы получить третий кватернион, который является результатом двух вращений. Обратите внимание, что умножение кватернионов не является коммутативным, то есть порядок имеет значение (если вы сделаете это несколько раз в своей голове, вы поймете, почему).
Вы можете создать кватернион, представляющий вращение на заданный угол вокруг определенной оси, с чем-то вроде этого (извините, что это c ++, а не 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)
и умножить его на текущий кватернион вращения вашей модели.