2009-03-31 4 views
13

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

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

Например: Точка (лат: 49,291882, Лонг: -123,131676, высота: 14m)

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

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

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

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

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

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

+0

У вас есть муравей, чтобы нарисовать материал, или вы хотите просто вычислить некоторые моменты? –

ответ

4

Вам действительно нужно perspective projection и matrix operations значительно упрощает это делать. Я предполагаю, что вы уже знаете, что ваш spherical coordinates должен быть преобразован в Cartesian coordinates для этих расчетов.

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

+0

Я не знал, что мне пришлось преобразовать в декартовые координаты, поэтому спасибо за это. Что касается OpenGL, я думаю, что я попытаюсь реализовать его, используя его, поскольку у него есть методы для настройки положения камеры и, я считаю, механизм для получения 2D-проекции из 3D-модели. Знаете ли вы хорошие учебные пособия? – 2009-03-31 15:39:25

+0

Это классические учебные пособия, портированные на несколько языков: http://nehe.gamedev.net/ –

2

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

Кроме того OPENGL не занимается Географические координаты

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

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

  • WGS84
  • земля ориентированных координаты
  • некоторую местную рамку
  • камеры кадра
  • 2D проекции

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

2

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

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

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

12

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

Затем, очень просто:

Х '= ((Х - Хс) * (F/Z)) + Хс

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

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

X '= X * (F/Z)

Y' = Y * (F/Z)

+0

Не должны ли первые два уравнения читать 'X '= ((X - Xc) * (F/(Z-Zc))) + Xc' и 'Y '= ((Y - Yc) * (F/(Z-Zc))) + Yc'? –

+1

@rofrankel Что делать, если я хочу указать точку с Z = 0? – 0x6B6F77616C74