Сначала я приведу немного теории.OpenGL работает с матрицами 4x4
и векторами (координатами точки) длиной 4
(в 3D).
Давайте получим вектор X = (x,y,z,1)
.Я надеюсь, вы знаете, как умножить матрицы .И скажем, вы хотите перевести свою точку на V = (v<sub>x</sub>,v<sub>y</sub>,v<sub>z</sub>)
.Для этого вам нужно построить матрицу перевода следующим образом:
И вы умножите две матрицы (матрица * вектор / точка):Y = TX
:
Причина сделать это настолько сложно (а не просто добавить X + V
) состоит в том, что вы можете вращать свою точку вокруг оси, просто заполняя еематрица с разными значениями.Это называется матрица вращения :
Самое приятное, что вы можете связать эти матрицы.Когда вам нужно нарисовать точку с этими правилами:
- Перевести
T<sub>1</sub>
- Повернуть
R<sub>1</sub>
- Перевести
T<sub>2</sub>
Вы можете подготовить одну матрицу, которая будет выполнять всю работу одновременно: F =
T<sub>1</sub>R<sub>1</sub>T<sub>2</sub>
И затем применить все эти преобразования к точке сразу: Y = FX
.
Обратите внимание, чтоумножение матриц не коммутативно , поэтому порядок имеет значение .
OpenGL работает с этими матрицами (есть еще несколько типов, таких как масштабная матрица ) внутри,Вы можете получить текущую матрицу преобразования с помощью команды (пример из здесь ):
glGetDoublev(GL_MODELVIEW_MATRIX, redTransformationMatrix);
И вот как правильно представить эти данные (подробная информация здесь ):
Все изображения, кроме последнего, взяты с wikipedia.org