2013-02-21 1 views
0

Я недавно начал изучать OpenGL, и, насколько это касается общения с GL и шейдерами, я получил хорошую компетенцию, но я немного неясен в отношении системы координат.В OpenGL, какое влияние оказывает создание проекционной матрицы перспективы на координаты объекта?

Я использую OpenGL ES 2.0, поэтому я должен сам управлять матрицей. Я пришел, чтобы понять, что следующее:

  1. Для того, чтобы наблюдать правильные результаты перемножить матрицы в модели * вид * проекция (что имеет смысл в качестве матричного умножения не является коммутативной).

  2. Модельная матрица представляет собой масштаб, поворот, перевод и т. Д. Примитива рисования. Перемещение примитива в 3D-пространстве включает в себя преобразования, применяемые к этой матрице.

  3. Матрица представления представляет собой «камеру», как многие относятся к ней. Расстояние между объектом и зрителем, а также вращение глаза вокруг объекта происходит от преобразований к этой матрице.

  4. И, наконец, матрица перспективы представляет собой 3D-пространство, в котором находится сцена. Я следую некоторым примерам, которые в основном используют метод перспективы, используя поле зрения и соотношение сторон. Здесь начинается мое замешательство.

Координаты примитива даны как поплавок в интервале + - [0, 1]. Но перспективная матрица представляет собой трехмерное пространство от близкого к z до far-z (которое я видел как 0 и 100 соответственно). Я смущен тем, как координаты примитива входят в это пространство. Очевидно, что мои навыки линейной алгебры не так сильны, как хотелось бы, чтобы они были в этом случае. Может ли кто-нибудь уточнить, как эти точки отображаются в это пространство?

Например, во многих примерах куб должен быть равен + - (.5, .5, .5). Я использую перспективную матрицу около z = 0, far-z = 100 и соотношение сторон всего дисплея, будет ли это означать, что куб всегда равен 0,5 от каждого из этих размеров? Я имею в виду, что если перспективная матрица будет работать от x = -5 до x = 5, то x-координата будет равна .5 (-5) = -2.5?

+1

«* умножьте матрицы как модель * view * projection *" Если это то, что вы наблюдаете, это потому, что ваши матрицы транспонированы. –

ответ

1

Чтобы понять, как выглядит карта вершин, вы должны понять, что такое открытое gl, чтобы получить вершины в их окончательной форме, называемые «координатами нормализованного устройства», которые идут от z = -1 до z = 1.

Во-первых, вершина пространства вида умножается на матрицу проекции. Затем вершина делится на ее четвертый или «w» компонент. Это называется perspective divide

Зная эту информацию, вы можете получить формулу. This page объясняет математику, которая входит в матрицу проекции, чтобы сопоставить координату вида z с координатой проекции-z. Если вы не заботитесь о выводе, вы можете прокрутить вниз, чтобы увидеть конечный результат, а именно:

zn = (-(f+n) * ze/(f-n) - 2*f*n/(f-n))/(-ze) 

где гп является г в нормированных координатах устройства, г является г в силу (или глаза) координаты, f - дальняя плоскость клипа, а n - плоскость ближнего клипа.

Если вы посмотрите на формулу, вы заметите, что если компонент z вершины равен n, она отображает -1. Если он равен f, он отображает 1, то между ними следует гиперболическая функция от -1 до 1.

+0

Вот еще один хороший [сайт] (http://www.scratchapixel.com/lessons/3d-advanced-lessons/perspective-and-orthographic-projection-matrix/opengl-perspective-projection-matrix/) с графиком, показывающим, как они отображают – pauld