Также, каковы различия между различными координатными пространствами, например, мир, объект и т. д.
Это в основном вопрос соглашения, но:
Пространство модели (= локальное пространство) - это координатное пространство конкретной модели относительно ее "центра". Если у вас есть файл с моделью, координаты центрируются вокруг некоторой его точки (например, это геометрический центр, его основание, что угодно).
Пространство сцены (= мировое пространство) - это координатное пространство относительно произвольной точки вашей сцены
Глазное пространство (= пространство обзора) - это пространство, в котором камера находится в точке (0,0,0)
, x
обращено вправо, y
направлено вверх и z
направлено out экрана (-z
= глубже)
Область клипа - это где (-1,-1,*)
- нижний левый угол окна просмотра, (1,1,*)
- верхний правый угол окна просмотра, а координата Z в (-1,1 ) указывает только глубину (опять же, Z = глубже). (Фрагменты
Размер экрана (= координаты окна) такой же, как указано выше, за исключением того, что координаты масштабируются с -1..1
до значений в пикселях, соответствующих диапазону текущего видового экрана и диапазону глубины .
Вы преобразуете координаты из пространства модели в пространство сцены, умножая (в соглашениях OpenGL обычно левое умножение) на матрицу модели (которая содержит информацию о том, где находится модель на сцене). Если у вас есть иерархия сцен, может быть много «сложенных» матриц моделей для объекта (размещение меча относительно руки, рука относительно рыцаря, рыцарь относительно сцены).
Затем вы преобразуете координаты в пространство глаза, умножая на матрицу вида (обычно подключенную к объекту «камера»).
После этого, используя матрицу проекции , вы преобразуете эти координаты в пространство экрана, так что OpenGL отобразит эти координаты в фактические пиксели экрана (в зависимости от настройки области просмотра).
Некоторые факты:
Матрицы модели и вида обычно содержат перемещение, вращение и / или масштабирование, в то время как матрица проекции обычно содержит преобразование перспективы, которое делает объекты дальше от экрана меньше.
Старый OpenGL (версии 2.x и более ранние) требовал, чтобы вы поместили матрицы в два "матричных стека":
- стек GL_MODELVIEW, который должен содержать View * Model (или View * Model1 * Model2 ... * ModelN),
- стек GL_PROJECTION, который должен содержать только матрицу проекции.
Это могут быть также одиночные матрицы, а не стеки, но стек (вместе с glPushMatrix
и glPopMatrix
) был введен, чтобы позволить программисту "сохранять и загружать" их легко. В расчетах используется только самая верхняя матрица из каждого стека.
Матрица проекции обычно создается с gluPerspective
или эквивалентным. Матрица вида может быть создана с помощью gluLookAt
(или аналогично матрицам моделей), а матрицы моделей могут быть легко собраны с использованием glTranslate
, glRotate
и glScale
.
(примечание: OpenGL 3.1+ удалил эти функции, что позволяет вам использовать любые матрицы и любые соглашения, которые вы предпочитаете)
Зная, что:
Я хочу иметь возможность получить координаты объекта (например, треугольника) после того, как он был переведен и повернут, поэтому я хочу сделать это так, чтобы позже я мог обнаруживать столкновения и вычислять расстояние между объектами, используя координаты
Разумный способ вычислить всю вашу физику - сделать это в пространстве сцены .
Следовательно, если у вас есть модель (например, треугольная сетка), чтобы получить положение любой ее вершины в пространстве сцены , вам нужно умножить ее влево только на матрицу модели модели. (или в случае иерархии по всем ее модельным матрицам).
О gluProject
, на случай, если вам интересно - это удобный метод, который позволяет умножить набор координат на текущий PROJECTION*MODELVIEW
и выполняет преобразование области просмотра, чтобы увидеть, где он окажется в пространстве экрана, и gluUnProject
делает наоборот.
Ссылка: http://www.opengl.org/resources/faq/technical/transformations.htm