Мне нужно выполнить некоторые операции с различными функциями openGL.
Там у меня есть куб, инициализированный как glList. То, что я делаю, — это какое-то преобразование со стандартными функциями glu, и мне нравится делать точно такие же операции с умножением матриц.
Но я застрял с функцией вращения. Я хочу вращать куб вокруг оси, например 90 °:
glRotatef(90.0, 1.0f, 0.0f, 0.0f);
следует заменить на:
GLdouble m[16] ={1.0, 0.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0,-1.0, 0.0, 0.0,
0.0, 0.0, 0.0, 1.0 };
glMultMatrixd(m);
я нашел этот очень полезный сайт но кое-как, это не делает точно так же, как вышеупомянутая функция. Существует ли принцип Generell, как преобразовать функцию glRotatef () в матрицу преобразования gl?
ОБНОВЛЕНИЕ: извините, я пропустил важное примечание в начале документа о том, что матрицы из документа необходимо транспонировать для использования в openGL.
По оси X
| 1 0 0 0 |
M = | 0 cos(A) -sin(A) 0 |
| 0 sin(A) cos(A) 0 |
| 0 0 0 1 |
В оси Y
| cos(A) 0 sin(A) 0 |
M = | 0 1 0 0 |
| -sin(A) 0 cos(A) 0 |
| 0 0 0 1 |
В Z-Axsis
| cos(A) -sin(A) 0 0 |
M = | sin(A) cos(A) 0 0 |
| 0 0 1 0 |
| 0 0 0 1 |
ПРИМЕЧАНИЕ. Матрицы в OpenGL используют макет основной памяти столбца.
Пример:
#include <math.h>
#define PI 3.14159265
// Rotate -45 Degrees around Y-Achsis
GLdouble cosA = cos(-45.0f*PI/180);
GLdouble sinA = sin(-45.0f*PI/180);
// populate matrix in column major order
GLdouble m[4][4] = {
{ cosA, 0.0, -sinA, 0.0}, // <- X column
{ 0.0, 1.0, 0.0, 0.0}, // <- Y column
{ sinA, 0.0, cosA, 0.0}, // <- Z column
{ 0.0, 0.0, 0.0, 1.0} // <- W column
};
//Apply to current matrix
glMultMatrixd(&m[0][0]);
//...