Я показываю символы в Opengl, у меня они вращаются вокруг оси с помощью кватернионов, я хочу добиться, чтобы они вращались вокруг своей оси, но при использовании кватернионов, если я вращаю объект в соответствии с одной осью, другие не принимают учитывая, что это вращение будет вращаться вокруг фиксированной мировой оси. Учитывая накопительный кватернион Q (прежние вращения) и 3 угла AngleX, AngleY и AngleZ. Сначала я подумал, что нужно попробовать вращение Эйлера, и попробовал несколько техник:
Quaternion rot1;
Quaternion rot2;
Quaternion rot3;
Vector3 axis ;
float angle;
QAccumulative.getAxisAngle(&axis, &angle);
// first try : around fix axes
cout << "axis : " << axis << endl;
rot1.FromAxis(Vector3(1.0,0.0,0.0),angleX);
rot2.FromAxis(Vector3(0.0,1.0,0.0),angleY);
rot3.FromAxis(Vector3(0.0,0.0,1.0),angleZ);
QAccumulative = QAccumulative * rot1;
QAccumulative = QAccumulative * rot2;
QAccumulative = QAccumulative * rot3;
/*
// second try, around current modified axes
rot1.FromAxis(Vector3(axis.x,0.0,0.0),angleX);
rot2.FromAxis(Vector3(0.0,axis.y,0.0),angleY);
rot3.FromAxis(Vector3(0.0,0.0,axis.z),angleZ);
QAccumulative = QAccumulative * rot1;
QAccumulative = QAccumulative * rot2;
QAccumulative = QAccumulative * rot3;
*/
/*
// third try with Euler rotation
Quaternion rotation;
rotation.FromEuler(10*angleX,10*angleY,10*angleZ);
QAccumulative = QAccumulative * rotation;
*/
QAccumulative.normalise();
Ни один из них пока не работал ... я не думаю, что мои реализации ротации - это проблемы, но если кто-то это сделает, я опубликую код. Разве Эйлер не то, что я думал? Какое чередование я должен использовать для достижения своей цели?
РЕДАКТИРОВАТЬ: я пробовал это, предложенное сообщением:
rotate(float angleX,float angleY,float angleZ) {
Vector3 axis = Vector3(angleX,angleY,angleZ);
Vector3 worldAxis = QAccumulative * axis;
Quaternion worldRotation( worldAxis.x,worldAxis.y,worldAxis.z, 10 );
QAccumulative = worldRotation * QAccumulative;
QAccumulative.normalise();
Персонаж по-прежнему вращается вокруг фиксированной оси.
РЕДАКТИРОВАТЬ: я применил псевдокод, указанный в сообщении, и он сработал:
rotate(float angleX,float angleY,float angleZ) {
Vector3 axis = Vector3(angleX,angleY,angleZ);
Vector3 worldAxis = QAccumulative * axis;
Quaternion worldRotationx( 1.0,0,0, angleZ );
Quaternion worldRotationy( 0,1.0,0, angleX);
Quaternion worldRotationz( 0,0,1.0, -angleY );
QAccumulative = worldRotationx * worldRotationy * worldRotationz * QAccumulative;
QAccumulative.normalise();