Преобразования OpenGL - PullRequest
       1

Преобразования OpenGL

3 голосов
/ 17 февраля 2012

У меня есть объект в точке, скажем, x, y, z относительно начала координат.
Я хочу применить некоторые преобразования к точке, скажем, вращение и перемещение, и визуализировать объект в преобразованной точке. Я использую функции glTranslatef() и glRotatef(). Это выглядит примерно так:

glTranslatef(x,y,z); 
glRotatef(Ang,0,1,0); // rotated around Y axis at an arbitrary angle
glTranslatef(xt,yt,zt); // further translation
<render the object>

Несмотря на то, что это спасает меня от сложных операций преобразования матрицы, я не знаю фактических значений координат конечной позиции относительно начала координат. Есть ли способ получить координаты фактической позиции преобразованной точки без прохождения матричных операций?

Ответы [ 2 ]

13 голосов
/ 17 февраля 2012

Сначала я приведу немного теории.OpenGL работает с матрицами 4x4 и векторами (координатами точки) длиной 4 (в 3D).

Давайте получим вектор X = (x,y,z,1).Я надеюсь, вы знаете, как умножить матрицы .И скажем, вы хотите перевести свою точку на V = (v<sub>x</sub>,v<sub>y</sub>,v<sub>z</sub>).Для этого вам нужно построить матрицу перевода следующим образом:

Translation matrix

И вы умножите две матрицы (матрица * вектор / точка):Y = TX:

Translation via matrix

Причина сделать это настолько сложно (а не просто добавить X + V) состоит в том, что вы можете вращать свою точку вокруг оси, просто заполняя еематрица с разными значениями.Это называется матрица вращения :

Rotation matrices

Самое приятное, что вы можете связать эти матрицы.Когда вам нужно нарисовать точку с этими правилами:

  • Перевести 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);

И вот как правильно представить эти данные (подробная информация здесь ):

enter image description here

Все изображения, кроме последнего, взяты с wikipedia.org

3 голосов
/ 17 февраля 2012

Вы можете получить матрицы из состояния OpenGL, используя glGetDoublev :

GLdouble projectionMatrix[16];
glGetDoublev(GL_PROJECTION, projectionMatrix);

GLdouble modelViewMatrix[16];
glGetDoublev(GL_MODELVIEW, modelViewMatrix);

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

РЕДАКТИРОВАТЬ: Чтобы получить преобразованные координаты p ', вам необходимо преобразовать точку p , используя эти матрицы:

p' = projectionMatrix * modelViewMatrix * p

Я предлагаю использовать glm для таких операций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...