Ответ 1
1) Объектное пространство - это вершины объекта относительно начала объекта. В случае куба 1x1x1 ваши вершины будут:
( 0.5, 0.5, 0.5)
(-0.5, 0.5, 0.5)
( 0.5, -0.5, 0.5)
(-0.5, -0.5, 0.5)
и др.
2) Мировое пространство - это место, где объект находится в вашем мире. Если вы хотите, чтобы этот куб находился в (15, 10)
, вы создали матрицу перевода, которая при умножении на каждую вершину центрировала бы ваши вершины вокруг (15, 10)
. Например, первая вершина станет (15.5, 10.5, 0.5)
. Матрица, идущая от объекта к мировому пространству, называется "модельной" матрицей.
3) Пространство глаз (иногда называемое пространством камеры) - это мир относительно местоположения зрителя. Так как это должна быть матрица, умноженная на каждую вершину, она технически является инверсией ориентации камеры. То есть, если вы хотите камеру в (0, 0, -10)
, ваша матрица просмотра должна быть переводом (0, 0, 10)
. Таким образом, все объекты в мире имеют 10 единиц, что делает его похожим на 10 единиц.
4) Проецируемое пространство - это то, как мы применяем правильную перспективу к сцене (предполагая, что вы не используете орфографическую проекцию). Это почти всегда представлено усечкой, и эта статья может объяснить это лучше, чем я могу. По сути, вы картируете 3d-пространство на другое перекошенное пространство.
OpenGL затем обрабатывает пространство клипа и пространство экрана.
Он работает на флаге
GL_MODELVIEW
по умолчанию, но на втором этапе - в мировом пространстве. Означает ли это, что вызовglVertex3f()
создает треугольник в пространстве объектов?
Вы всегда устанавливаете вершины с glVertex3f()
в пространстве объектов. (на самом деле это очень старый и медленный способ сделать это, но на самом деле это не вопрос этого вопроса)
Когда вы устанавливаете GL_MODELVIEW
, он меняет только модельную матрицу (с которой можно управлять с помощью glLoadMatrix
, glTranslate
, glRotate
, glScale
и т.д.).
Строка за строкой, ваш фрагмент кода выполняет следующие действия:
- Все преобразования теперь будут влиять на матрицу проекции.
- Очистите старую матрицу проекции и замените ее на единицу.
- Используйте весь экран в качестве окна просмотра.
- Установите проекционную матрицу в перспективу с вертикальным полем обзора 45 градусов с соотношением сторон w/h, плоскостью ближнего клипа на 1 единицу и плоскостью дальнего клипа на 100 единиц.
- Все преобразования теперь влияют на матрицу просмотра модели.
Z-ось уже существует, это просто устанавливает матрицу проекции, которая дает вам перспективу, сообщает OpenGL, чтобы использовать все окно для рендеринга. Это не пространство объектов, это способ преобразования пространства объектов в пространство проецирования.
Также обратите внимание, что вы используете действительно старую OpenGL (1992 год). glTranslate и т.д. давно устарели и теперь просто удалены из API. Единственная причина, по которой вы все еще можете использовать их, - это то, что драйверы сохраняют их там для обеспечения совместимости. Я бы порекомендовал вам изучить использование современного (3.0+) OpenGL. Современные графические конвейеры на несколько порядков быстрее, чем немедленный режим (glBegin, glVertex, glEnd).