Как вы реализуете вращение фигуры на месте и движение в повернутом состоянии в OpenGL? - PullRequest
0 голосов
/ 23 ноября 2018

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

Я уже заставил форму перемещаться в направлении оси x и оси y, когда я нажимаю клавишу.Но я не могу двигаться так, как хочу.Это странно.Как настроить код, чтобы он двигался так, как я хочу?Я сейчас покажу код.

glTranslatef(2.5 + puzX1, 2 + puzY1, 0);
glRotatef(100, 0.0, 0.0, 1.0);
glRotatef(puzang1, 0.0, 0.0, 1.0);
glTranslatef(-2.5+puzX1, -2+puzY1, 0); 

Я написал код, чтобы он вращался на месте.

Код вверху и внизу кода - это код, которыйперемещается в центр фигуры, а затем возвращает его на место.

Что мне добавить?Какая часть должна быть изменена?

Я плохо владею английским языком.мне очень жаль, вы можете мне помочь?

1 Ответ

0 голосов
/ 23 ноября 2018

Обратите внимание, что рисование последовательностями glBegin / glEnd, стек матрицы конвейеров с фиксированной функцией, считается устаревшим с десятилетий.Прочитайте о конвейере с фиксированными функциями и посмотрите Спецификация вершины и Шейдер для современного способа рендеринга.


Как вы реализуете вращение фигуры на месте?

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

glTranslatef(2.5 + puzX1, 2 + puzY1, 0);
glRotatef(puzang1, 0.0, 0.0, 1.0);
glRotatef(100, 0.0, 0.0, 1.0);

См. Также Перевод OpenGL до и после вращения

Пояснение:

Перевод: см. Документацию glTranslate:

glTranslate производит перевод x y z.Текущая матрица (см. glMatrixMode) умножается на эту матрицу перевода, при этом продукт заменяет текущую матрицу.

Вращение: см. Документацию glRotate:

glRotate производит вращение угловых градусов вокруг вектора x y z.Текущая матрица (см. glMatrixMode) умножается на матрицу вращения с произведением, заменяющим текущую матрицу.

Матрица перевода выглядит следующим образом:

Matrix4x4 translate;

translate[0] : ( 1,  0,  0,  0 )
translate[1] : ( 0,  1,  0,  0 )
translate[2] : ( 0,  0,  1,  0 )
translate[3] : ( tx, ty, tz, 1 )

А матрица вращения вокруг оси Z выглядит следующим образом:

Matrix4x4  rotate;
float      angle;

rotate[0] : ( cos(angle),  sin(angle), 0, 0 )
rotate[1] : ( -sin(angle), cos(angle), 0, 0 )
rotate[2] : ( 0,           0,          1, 0 )
rotate[3] : ( 0,           0,          0, 1 )   

Результат translate * rotate таков:

glTranslate( ..... );
glRotate( ..... );

model[0] : ( cos(angle),  sin(angle), 0,  0 )
model[1] : ( -sin(angle), cos(angle), 0,  0 )
model[2] : ( 0,           1,          0,  0 )
model[3] : ( tx,          ty,         tz, 1 )

Результат rotate * translate:

glRotate( ..... );
glTranslate( ..... );

model[0] : ( cos(angle),                     sin(angle),                     0,  0 )
model[1] : ( -sin(angle),                    cos(angle),                     0,  0 )
model[2] : ( 0,                              0,                              1,  0 )
model[3] : ( cos(angle)*tx - sin(angle)*tx,  sin(angle)*ty + cos(angle)*ty,  tz, 1 )

...