Мировое пространство на экранное пространство (перспективная проекция) - PullRequest
1 голос
/ 16 августа 2010

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

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

  • Положение взгляда
  • Положение
  • Вертикальное поле зрения
  • Z далеко
  • Z около
  • и, очевидно, положение целевого объекта.

Может кто-нибудь дать мне алгоритм, который будет делать это, используя только эти компоненты?

Большое спасибо.

Ответы [ 2 ]

8 голосов
/ 19 августа 2010

все графические движки используют матрицы для преобразования между различными системами координат. Действительно, OpenGL и DirectX используют их, потому что они являются стандартным способом.

Камеры обычно строят матрицы, используя параметры, которые у вас есть:

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

  • матрица проекции (преобразуется из 3D-координат в 2D-координаты), она использует fov, near, far и aspect.

Вы можете найти информацию о том, как построить матрицы в Интернете, в поисках функций opengl, которые их создают:

  • gluLookat создает матрицу просмотра

  • gluPerspective: создает матрицу проекции

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

Когда у вас есть эти матрицы, вы умножаете их, чтобы получить матрицу viewprojeciton. Эта матрица преобразуется из мировых координат в экранные координаты. Так что просто умножьте матрицу на позицию, которую вы хотите знать (в формате вектора 4, являясь компонентом 4º 1.0).

Но подождите, результат будет в однородных координатах, вам нужно разделить X, Y, Z результирующего вектора на W, и тогда у вас будет позиция в нормализованных экранных координатах (0 означает центр, 0,5 означает право, и т.д.).

Отсюда легко преобразовать умножение на ширину и высоту.

Удачи:)

P.S .: когда вы работаете с 3D, очень важно понимать три матрицы (модель, вид и проекция), иначе вы будете каждый раз спотыкаться.

0 голосов
/ 21 августа 2010

чтобы я мог размещать надписи на двухмерных текстах в 3d пространстве

Вы искали технику "рекламного щита"? Иногда все, что вам нужно, это просто знать правильный термин для поиска. Это относится к полигонам (обычно прямоугольникам), которые всегда обращены к камере, независимо от положения или ориентации камеры.

...