2010-03-17 4 views
17

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

Одна вещь, которую я по-прежнему не совсем понимаю, - это использование матриц OpenGL. Я вижу это (и такие вещи, как это) довольно много:

x y z n 
------- 
1 0 0 0 
0 1 0 0 
0 0 1 0 
0 0 0 1 

Так что мое лучшее понимания, что это не является нормализованной (не величиной) 4 одномерных, столбцы матрицы. Кроме того, эта матрица в частности называется «единичной матрицей».

Некоторые вопросы:

  • Что такое "энный" измерение?
  • Как и когда применяются?

Моя самая большая путаница возникает из-за того, как OpenGL использует данные такого типа.

+0

Ознакомьтесь с книгой «Основная математика для игр и интерактивных приложений» . –

+2

Нормализованный вектор не «без величины». Нормализованные векторы имеют длину/величину 1. – alesplin

+0

Спасибо! Наверное, я увлекся пониманием. По крайней мере, я был на правильном пути. ;) –

ответ

3

Короткий ответ, который может помочь вам начать, заключается в том, что измерение «nth», как вы его называете, не представляет собой визуализируемого количества. Он добавлен в качестве практического инструмента для включения матричных умножений, которые вызывают трансляцию и перспективную проекцию. Интуитивная матрица 3x3 не может делать эти вещи.

3D-значение, представляющее точку в пространстве, всегда получает 1 добавление в качестве четвертого значения, чтобы этот трюк работал. 3D-значение, представляющее направление (т. Е. Нормальное, если вы знакомы с этим термином) получает 0, добавляется в четвертое место.

59

В большинстве 3D-графиков точка представлена ​​4-компонентным вектором (x, y, z, w), где w = 1. Обычные операции, применяемые к точке, включают в себя перевод, масштабирование, поворот, отражение, перекос и их сочетание.

Эти преобразования могут быть представлены математическим объектом, называемым «матрицей». Матрица применяется на векторе, например так:

[ a b c tx ] [ x ] [ a*x + b*y + c*z + tx*w ] 
| d e f ty | | y | = | d*x + e*y + f*z + ty*w | 
| g h i tz | | z | | g*x + h*y + i*z + tz*w | 
[ p q r s ] [ w ] [ p*x + q*y + r*z + s*w ] 

Например, масштабирование представлено в виде

[ 2 . . . ] [ x ] [ 2x ] 
| . 2 . . | | y | = | 2y | 
| . . 2 . | | z | | 2z | 
[ . . . 1 ] [ 1 ] [ 1 ] 

и перевода как

[ 1 . . dx ] [ x ] [ x + dx ] 
| . 1 . dy | | y | = | y + dy | 
| . . 1 dz | | z | | z + dz | 
[ . . . 1 ] [ 1 ] [ 1 ] 

Одной из причин для 4-го компоненты состоит в том, чтобы сделать перевод, представимый матрицей.

Преимущество использования матрицы состоит в том, что множественные преобразования могут быть объединены в одну с помощью матричного умножения.

Теперь, если целью является просто перенос перевода на таблицу, я бы сказал (x, y, z, 1) вместо (x, y, z, w) и произвел последнюю строку матрица всегда [0 0 0 1], как обычно для 2D-графики. В самом деле, вектор 4-компонент будет отображаться обратно к нормальному 3-вектор вектора с помощью этой формулы:

[ x(3D) ] [ x/w ] 
| y(3D) ] = | y/w | 
[ z(3D) ] [ z/w ] 

Это называется homogeneous coordinates. Позволяет сделать перспективную проекцию, выражаемую также матрицей,, которая может снова сочетаться со всеми другими преобразованиями.

Например, поскольку объекты на значительном удалении должна быть меньше на экране, мы преобразуем 3D-координаты в 2D, используя формулу

x(2D) = x(3D)/(10 * z(3D)) 
y(2D) = y(3D)/(10 * z(3D)) 

Теперь, если мы применим матрицу проекции

[ 1 . . . ] [ x ] [ x ] 
| . 1 . . | | y | = | y | 
| . . 1 . | | z | | z | 
[ . . 10 . ] [ 1 ] [ 10*z ] 

то реальное 3D-координаты станут

x(3D) := x/w = x/10z 
y(3D) := y/w = y/10z 
z(3D) := z/w = 0.1 

поэтому нам просто нужно нарезать z - согласовать проект с 2D.

+2

Хотелось бы, чтобы я мог понять ваши примеры, но я действительно не понимаю. Я извиняюсь. –

+1

@ Omega Этот раздел Красной книги OpenGL может помочь http://www.glprogramming.com/red/appendixf.html#name1 – Swiss

+0

@Omega Возможно, основы тоже полезны [http://en.wikipedia.org/wiki/Matrix_multiplication]. – Luca

Смежные вопросы