кватернионы вращения матрицы opengl

Я пытаюсь сделать простое вращение куба об оси X и Y:

Я хочу всегда повернуть куб по оси X суммой x и повернуть куб по yaxis суммой y независимый от вращения оси X

сначала я наивно сделал:

glRotatef(x,1,0,0);
glRotatef(y,0,1,0);

затем

но это сначала вращается по x, затем вращается по y, который я хочу повернуть по y независимо от x доступа.

Я начал изучать кватернионы, таким образом, я попробовал:

Quaternion Rotation1;
Rotation1.createFromAxisAngle(0,1, 0, globalRotateY);
Rotation1.normalize();

Quaternion Rotation2;
Rotation2.createFromAxisAngle(1,0, 0, globalRotateX);
Rotation2.normalize();

GLfloat Matrix[16];

Quaternion q=Rotation2 * Rotation1;

q.createMatrix(Matrix);
glMultMatrixf(Matrix);

это просто делает почти точно, что было выполнено, делая 2 последовательных glRotates..., таким образом, я думаю, что пропускаю шаг или 2.

действительно ли кватернионы являются способом пойти, или я должен использовать что-то другое? И если кватернионы являются способом пойти, что шаги могут я добавлять, чтобы заставить куб вращаться независимо от каждой оси. я думаю, что у кого-то еще есть та же проблема: Вращение сцены OpenGL в 2 осях

7
задан Community 23 May 2017 в 12:28
поделиться

4 ответа

Я убедился, что это работает правильно, используя кватернионы: Я уверен есть и другие способы, но после повторной отборки это отлично сработало для меня. Я выложил аналогичную версию на другом форуме. http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=280859&#Post280859

сначала создайте кватернионное представление углов изменения x / y затем каждый кадр умножает изменяющиеся кватернионы углов на накапливающийся кватернион, а затем, наконец, преобразует этот кватернион в матричную форму для умножения текущей матрицы. Вот основной код цикла:

Quaternion3D Rotation1=Quaternion3DMakeWithAxisAndAngle(Vector3DMake(-1.0f,0,0), DEGREES_TO_RADIANS(globalRotateX));
Quaternion3DNormalize(&Rotation1);

Quaternion3D Rotation2=Quaternion3DMakeWithAxisAndAngle(Vector3DMake(0.0f,-1.0f,0), DEGREES_TO_RADIANS(globalRotateY));
Quaternion3DNormalize(&Rotation2);


Matrix3D Mat;
Matrix3DSetIdentity(Mat);
Quaternion3DMultiply(&QAccum, &Rotation1);

Quaternion3DMultiply(&QAccum, &Rotation2);

Matrix3DSetUsingQuaternion3D(Mat, QAccum);
globalRotateX=0;
globalRotateY=0;

glMultMatrixf(Mat);

затем нарисуйте куб

3
ответ дан 7 December 2019 в 16:38
поделиться

Было бы очень полезно, если бы вы могли дать более подробное объяснение того, что вы пытаетесь сделать, и чем получаемые вами результаты отличаются от желаемых. Но в целом использование углов Эйлера для вращения сопряжено с некоторыми проблемами, поскольку объединение поворотов может привести к неинтуитивному поведению (и в худшем случае к потере степени свободы).

Quaternion slerp может оказаться лучшим выбором, если вы сможете найти единственная ось и единственный угол, которые представляют желаемое вращение. Но выполнение последовательных вращений вокруг осей X и Y с использованием кватернионов не поможет вам избежать проблем, присущих составлению вращений Эйлера.

Сообщение, на которое вы ссылаетесь, похоже, связано с другой проблемой. Плакат, кажется, переводил свой объект, а затем делал его вращения, тогда как он должен был сначала вращать, а затем перемещать.

0
ответ дан 7 December 2019 в 16:38
поделиться

Непонятно, чего вы хотите добиться. Возможно, вам стоит подумать о некоторых точках и о том, где вы хотите, чтобы они вращались - например, вершина (1,1,1) должна отображаться в (0,1,0). Затем, исходя из этой информации, вы можете рассчитать необходимое вращение.

Кватернионы обычно используются для интерполяции между двумя поворотными «позициями». Итак, первый шаг - это определение ваших начальных и конечных «позиций», которых у вас еще нет. Получив это, вы можете использовать кватернионы для интерполяции. Не похоже, что у вас здесь есть какой-либо аспект, зависящий от времени.

0
ответ дан 7 December 2019 в 16:38
поделиться

Ваша проблема не в блокировке кардана. И, по сути, нет причин, по которым ваша версия кватерниона будет работать лучше, чем версия вашей матрицы (glRotate), потому что используемые кватернионы математически идентичны вашим матрицам вращения.

Если вам нужно управление мышью, вы, вероятно, захотите проверить arcballs .

0
ответ дан 7 December 2019 в 16:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: