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

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

Я хочу определить координаты 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, если это имеет какое-то значение. Да, и какое бы решение я ни выбрал, оно должно быть выполнено быстро.

4b9b3361

Ответ 1

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

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

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

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

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

X '= X * (F/Z)

Y '= Y * (F/Z)

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

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