Подтвердить что ты не робот

Объект, мир, камера и проекционные пространства в OpenGL

Я пытаюсь понять создание пробелов в OpenGL:

  • Объектное пространство

  • Мировое пространство

  • Камера

  • Проецируемое пространство


Правильно ли я понимаю эти этапы?

  • "Куб" создается в центре декартовой системы координат, непосредственно внутри программы, набирая координаты вершин.

  • Координаты преобразуются в координаты внутри "мира", что означает перемещение в любое место на экране.

Хорошо, на самом деле я хотел бы, чтобы вы проверили мое понимание этих двух терминов.


Теперь я создаю треугольник на черном экране. Как код openGL подходит для этих пространств?

Он по умолчанию работает на флажке GL_MODELVIEW, но на втором этапе - мировом пространстве. Означает ли это, что вызов glVertex3f() создает треугольник в пространстве объектов?

Где находится космическая часть мира?


Кроме того, я прочитал, что последние два пробела не являются частью конвейера openGL (или каким бы то ни было). Однако OpenGL содержит такие флаги, как GL_PROJECTION, например:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w, h); // w - width, h - height
gluPerspective(45, ratio, 1, 100); // radio = w/h
glMatrixMode(GL_MODELVIEW);

Что делает этот код? Он устанавливает перспективу. Создает ли он ось z? Но разве это уже часть пространства объектов?

4b9b3361

Ответ 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).