2010-07-28 3 views
7

Im пытается сделать простое вращение куба вокруг оси х и у:OpenGL кватернионов вращения матрицы

Я хочу всегда вращать куб по оси х на величину х и вращать куб над YAxis на величину у, не зависящий от поворота оси х

первого я наивно сделали:

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

затем

, но что первые Повороты ов er 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.

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

+0

ок позвольте мне сказать, что это так ... то, что я хочу сделать, это повернуть куб с помощью мыши. Я хочу, чтобы левый справа управлял поворотами оси y по экрану, а затем вверх вниз, чтобы управлять поворотами оси x. Я хочу, чтобы они вращались независимо от другой оси, но только вращаются на экранах глобальной оси. Если я делаю 2 glRotations, я не получаю этого поведения, потому что вращение одной оси взаимно изменяет друг друга. – yeahdixon

+0

Например, вращающийся куб: Операции без поворотов показывают только одну сторону затем я делаю glRotatef (90,1,0,0); \t glRotatef (45,0,1,0); \t ⁃ \t дает мне наклонный куб (бриллиант), когда мне нужен куб, у которого был угол, обращенный к камере, который на самом деле был бы результатом замены операций: \t glRotatef (45,0,1,0); \t glRotatef (90,1,0,0); Я бы просто поменял команды поворота, но это столкнулось с теми же проблемами, когда значения угла перевернуты. – yeahdixon

ответ

3

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

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

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); 

затем нарисовать куб

+0

Этот сайт действительно помог: http://www.gamedev.net/reference/articles/article1095.asp, но сначала это не имело смысла, пока я не исследовал и не пробовал дальше – yeahdixon

0

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

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

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

+0

Я описал проблему выше, но я думаю, что официальным термином является gimbal lock. – yeahdixon

0

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

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

+0

. Я подробно описал проблему выше, но я думаю, что официальным термином является gimbal lock – yeahdixon

0

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

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

+0

thankyou, да, я полностью согласен, кватернионы и матрицы вращения могут быть взаимозаменяемы, поэтому это можно сделать без кватернионов. Ответ на эту проблему был больше в преумножении матрицы, используя инкрементные вращения. – yeahdixon

Смежные вопросы