java - Proyección de perspectiva: ayuda a un novato
opengl projection (4)
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 simple:
X ''= ((X - Xc) * (F / Z)) + Xc
Y ''= ((Y - Yc) * (F / Z)) + Yc
Si su cámara es el origen, entonces esto se simplifica a:
X ''= X * (F / Z)
Y ''= Y * (F / Z)
Deseo determinar las coordenadas de la pantalla 2D (x, y) de los puntos en el espacio 3D (x, y, z).
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, Height: 14m)
La posición y la altura de la cámara también se pueden determinar como ax, y, z point. 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 con la programación en 3D, por lo tanto, he leído sobre el tema de la proyección en 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 tridimensional de los puntos del mundo real, configurar la orientación de la cámara y recuperar las coordenadas 2D de los puntos tridimensionales.
Sin embargo, no estoy seguro si el uso de OpenGL es la mejor solución a este problema y, aunque lo sea, no tengo idea de cómo crear modelos, configurar cámaras, 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 tu ayuda
Realmente necesita una proyección de perspectiva y las operaciones de la matriz simplifican en gran medida hacerlo. Supongo que ya sabe que sus coordenadas esféricas deben transformarse en coordenadas cartesianas para estos cálculos.
El uso de OpenGL probablemente le ahorrará mucho trabajo antes de rodar su propio rasterizador de software . Por lo tanto, aconsejaría probarlo 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.
Recomendaría "Matemáticas para la programación de juegos en 3D y gráficos por computadora" de 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 cómo ver las transformaciones y cómo configurar una cámara (incluido 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 coords 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 ventana 2D coords).
Si solo necesitas calcular las coordenadas de algunos puntos, solo deberías necesitar algunas habilidades de álgebra, no programación 3D con OpenGL.
Además, OpenGL no se ocupa de coordenadas geográficas
Primero obtenga algún documento sobre WGS84 y coordenadas geodésicas, primero tiene que convertir sus datos de GPS en un marco cartesiano (por ejemplo, el marco cartesiano centrado en la tierra en el que se define el elipsoide WGS84).
Entonces los cálculos con la matriz pueden tener lugar. La cadena de transformaciones es más o menos:
- WGS84
- coordenadas centradas en la tierra
- un poco de marco local
- marco de la cámara
- Proyección 2D
Para la primera conversión, vea esto. Lo último implica una matriz de proyección. Los otros son solo coordenadas, rotaciones y traducción. El "algún marco local" es el marco cartesiano local con origen como ubicación de la cámara tangente al elipsoide.