Как преобразовать glRotatef () в матрицу умножения для glMultMatrixd ()

Мне нужно выполнить некоторые операции с различными функциями 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.

0

Решение

По оси 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]);
//...
1

Другие решения


По вопросам рекламы [email protected]