Перспективная проекция - Помоги Нубу - PullRequest
14 голосов
/ 31 марта 2009

Я хочу определить координаты 2D-экрана (x, y) точек в трехмерном пространстве (x, y, z).

Точки, которые я хочу спроецировать, являются точками реального мира, представленными координатами GPS и высотой над уровнем моря.

Например: Точка (широта: 49.291882, длина: -123.131676, высота: 14 м)

Положение и высота камеры также могут быть определены как точки x, y, z. У меня также есть курс камеры (градусы компаса), степень ее наклона (выше / ниже горизонта) и крен (вокруг оси z).

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

Мне сказали, что OpenGL может быть полезен для построения 3D-модели точек реального мира, настройки ориентации камеры и получения 2D-координат 3D-точек.

Однако я не уверен, является ли использование OpenGL лучшим решением этой проблемы, и даже если я не знаю, как создавать модели, настраивать камеры и т. Д.

Может ли кто-нибудь предложить лучший способ решения моей проблемы? Если OpenGL - реальное решение, я должен был бы использовать OpenGL ES, если это имеет какое-то значение. Да, и какое бы решение я ни выбрал, оно должно выполняться быстро.

Спасибо за вашу помощь

Ответы [ 4 ]

13 голосов
/ 31 марта 2009

Вот очень общий ответ. Скажите камере на (Xc, Yc, Zc) и точка, которую вы хотите проецировать, это P = (X, Y, Z). Расстояние от камеры до 2D-плоскости, на которую вы проецируете, равно F (поэтому уравнение плоскости равно Z-Zc = F). 2D координаты P, спроецированные на плоскость, (X ', Y').

Тогда очень просто:

X '= ((X - Xc) * (F / Z)) + Xc

Y '= ((Y - Yc) * (F / Z)) + Yc

Если ваша камера является исходной, то это упрощается до:

X '= X * (F / Z) * ​​1011 *

Y '= Y * (F / Z) * ​​1013 *

4 голосов
/ 31 марта 2009

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

Использование OpenGL , скорее всего, избавит вас от большой работы по сравнению с собственным программным растеризатором . Итак, я бы посоветовал сначала попробовать . Вы можете создавать прототипы своей системы на ПК, поскольку OpenGL ES не слишком отличается, если вы не усложняете его.

2 голосов
/ 31 марта 2009

Я бы порекомендовал "Математика для программирования трехмерных игр и компьютерной графики" Эрика Ленгеля. Он охватывает матрицы, преобразования, усеченный вид, перспективную проекцию и многое другое.

В Руководстве по программированию OpenGL (красная книга) также есть хорошая глава о просмотре преобразований и настройке камеры (в том числе о том, как использовать gluLookAt).

Если вы не заинтересованы в отображении 3D-сцены и ограничены использованием OpenGL ES, то может быть лучше просто написать свой собственный код для сопоставления трехмерных оконных координат с 2D-окнами. В качестве отправной точки вы можете загрузить Mesa 3D , реализацию OpenGL с открытым исходным кодом, чтобы увидеть, как они реализуют gluPerspective (для установки матрицы проекции), gluLookAt (для установки преобразования камеры) и gluProject (для проецирования). от 3D-точки к 2D-координатам окна).

2 голосов
/ 31 марта 2009

Если вам просто нужно вычислить координаты некоторых точек, вам понадобятся только некоторые навыки алгебры, а не 3D-программирование с openGL.

Более того openGL не работает с географическими координатами

Сначала получите документацию о WGS84 и геодезических координатах, сначала вы должны преобразовать свои GPS-данные в декартову рамку (например, декартовую рамку, ориентированную на землю, в которой определен эллипсоид WGS84).

Тогда могут выполняться вычисления с матрицей. Цепочка преобразований примерно равна:

  • WGS84
  • земные координаты
  • какой-то локальный кадр
  • кадр камеры
  • 2D проекция

Для первого преобразования см. this Последнее включает в себя матрицу проекции Остальные только координаты поворота и перевода. «Некоторая локальная рамка» - это локальная декартова рамка с источником в качестве местоположения вашей камеры. касательная к эллипсоиду.

...