2009-03-31 12 views
13

Deseo determinar las coordenadas de la pantalla 2D (x, y) de los puntos en el espacio 3D (x, y, z).Proyección en perspectiva - Ayuda a un Noob

Los puntos que deseo proyectar son puntos del mundo real representados por coordenadas de GPS y elevación sobre el nivel del mar.

Por ejemplo: Point (Lat: 49.291882, Long: -123,131676, altura: 14 m)

La posición de la cámara y la altura también se puede determinar como x, y, z punto. También tengo el encabezado de la cámara (grados de brújula), su grado de inclinación (arriba/abajo del horizonte) y el balanceo (alrededor del eje z).

No tengo experiencia en programación 3D, por lo tanto, he leído sobre el tema de la proyección de perspectiva y he aprendido que requiere conocimiento de matrices, transformaciones, etc., todo lo cual me confunde por completo en la actualidad.

Me han dicho que OpenGL puede ser útil para construir un modelo 3D de los puntos del mundo real, configurar la orientación de la cámara y recuperar las coordenadas 2D de los puntos 3D.

Sin embargo, no estoy seguro de si el uso de OpenGL es la mejor solución a este problema e incluso si es que no tienen idea de cómo crear modelos, cámaras creados etc

Podría alguien sugerir el mejor método para resolver ¿mi problema? Si OpenGL es una solución factible, tendría que usar OpenGL ES si eso marca alguna diferencia. Ah, y cualquier solución que elija debe ejecutarse rápidamente.

Gracias por su ayuda

+0

¿Eres w? hormiga para dibujar cosas o ¿quieres simplemente calcular algunos puntos? –

Respuesta

4

Usted necesita de hecho un perspective projection y matrix operations simplificar en gran medida lo hace. Supongo que ya sabe que su spherical coordinates debe transformarse en Cartesian coordinates para estos cálculos.

Usar OpenGL es probable que le ahorre mucho trabajo al rodar su propio software rasterizer. Entonces, yo aconsejaría trying it primero. Puedes hacer un prototipo de tu sistema en una PC ya que OpenGL ES no es muy diferente siempre y cuando lo mantengas simple.

+0

No sabía que tenía que transformarme en coordenadas cartesianas, así que gracias por eso. En cuanto a OpenGL, creo que intentaré implementar una solución que lo use ya que tiene métodos para configurar la posición de la cámara y, creo, un mecanismo para obtener la proyección 2D del modelo 3D. ¿Conoces algún buen tutorial? –

+0

Estos son los tutoriales clásicos portados a varios idiomas: http://nehe.gamedev.net/ –

2

Si solo necesitas calcular las coordenadas de algunos puntos, solo deberías necesitar algunas habilidades de álgebra, no programación en 3D con openGL.

Además OpenGL no se ocupa de Coordenadas geográficas

En primer lugar conseguir un poco de doc sobre WGS84 y coordenadas geodésicas, primero tiene que convertir los datos GPS en un marco cartesiano (por ejemplo la tierra centrada en marco cartesiano en el que se define el elipsoide WGS84).

Luego pueden realizarse los cálculos con la matriz. La cadena de transformaciones es aproximadamente:

  • WGS84
  • Tierra céntrica coordina
  • algunos marco local
  • marco de la cámara
  • proyección 2D

Por primera conversión ver this El último implica una matriz de proyección Los otros son solo rotaciones de coordenadas y traducción. El "marco local" es el marco cartesiano local con origen como ubicación de la cámara tangente al elipsoide.

2

Recomendaría "Matemáticas para la programación de juegos en 3D y gráficos por computadora" por Eric Lengyel. Cubre matrices, transformaciones, la vista tridimensional, proyección de perspectiva y más.

También hay un buen capítulo en la Guía de programación de OpenGL (libro rojo) sobre la visualización de transformaciones y la configuración de una cámara (que incluye cómo usar gluLookAt).

Si no está interesado en mostrar la escena en 3D y está limitado a usar OpenGL ES, entonces puede ser mejor escribir su propio código para hacer la asignación de coordenadas de ventana 3D a 2D. Como punto de partida, puede descargar Mesa 3D, una implementación de código abierto de OpenGL, para ver cómo implementan gluPerspective (para establecer una matriz de proyección), gluLookAt (para establecer una transformación de cámara) y gluProject (para proyectar un punto 3D a coords de ventana 2D)

12

Aquí hay una respuesta muy general. Supongamos que la cámara está en (Xc, Yc, Zc) y el punto que desea proyectar es P = (X, Y, Z). La distancia desde la cámara al plano 2D en el que está proyectando es F (por lo que la ecuación del plano es Z-Zc = F). Las coordenadas 2D de P proyectadas en el plano son (X ', Y').

Entonces, muy simplemente:

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

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

Si la cámara está en el origen, entonces esto se simplifica a:

X '= X * (F/Z)

Y' = Y * (F/Z)

+0

Las primeras dos ecuaciones no deberían leer 'X '= ((X - Xc) * (F/(Z-Zc))) + Xc' y 'Y '= ((Y - Yc) * (F/(Z-Zc))) + Yc'? –

+1

@rofrankel ¿Qué sucede si quiero proyectar un punto con Z = 0? – 0x6B6F77616C74

Cuestiones relacionadas