2010-08-15 7 views
1

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

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

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

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

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

ответ

8

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

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

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

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

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

  • gluLookat создает viewmatrix

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

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

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

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

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

Удачи :)

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

0

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

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

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