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