He visto un montón de Screen-Coordinate a las publicaciones de coordenadas mundiales, pero no he visto lo contrario. ¿Hay una manera fácil de obtener coordenadas de pantalla desde un punto 3d, desde cualquier ángulo desde el que lo veo? Estoy usando C++ y OpenGL¿Cómo obtener las coordenadas de la pantalla desde un punto 3D? Opengl
Respuesta
pantalla las coordenadas de un vértice es sólo el resultado de la multiplicación de tales vértice por su proyección y modelview matriz:
screen_coordinates = projection_matrix * modelview_matrix * world_coordinates
Usted puede hacerlo a mano (sobre todo si usted está utilizando alguna biblioteca de matemáticas para hacer operaciones sobre matrices) o utilizar gluProject, por ejemplo: respuesta
std::array<GLfloat, 16> projection;
std::array<GLfloat, 16> modelview;
std::array<GLfloat, 3> screen_coords;
glGetFloatv(GL_PROJECTION_MATRIX, projection.data());
glGetFloatv(GL_MODELVIEW_MATRIX, modelview.data());
gluProject(world_coords[0], world_coords[1], world_coords[2],
modelview.data(), projection.data(),
screen_coords.data(), screen_coords.data() + 1, screen_coords.data() + 2);
Votación a la baja. gluProject hace lo correcto, pero tu explicación no. Multiplicar un punto con solo la matriz de vista de modelo y la matriz de proyección le da la coordenada de espacio de clip, pero * antes de * la división por w. No te da la coordenada del espacio de la pantalla. Ver la respuesta de Bahbar. –
Para juzgar si da coordenadas espaciales correctas o no, necesita más detalles sobre la configuración mundial de OP, p. Casi nunca utilizo la configuración de ventana gráfica para mis juegos en 2D. Pero parece que tu bola de cristal funciona perfectamente así que thx para downvote :) – erjot
p. ¿no es la configuración de contabilización de la matriz de PROYECCIÓN de OpenGL (tubería de función fija) para la ventana gráfica? y ¿cuáles son los casos que necesita dividir explícitamente por w? GLSL lo está haciendo por defecto. – erjot
de erjot es incompleta.
Hay 2 cosas adicionales a tener en cuenta.
- con
homogeneous = P . M . world
, el vector es un vectorhomogeneous
4-d en el espacio homogénea. En particular, para devolverlo al cubo [-1: 1]^3, debe dividir sus primeras 3 coordenadas porhomogeneous.w
.cube.x = homogeneous.x/homogeneous.w
(lo que algunos llaman división de proyección). - este caso es necesario para transformar el [-1: 1]^3 cubo de coordenadas de la ventana mediante la aplicación de la transformación de la vista para ella.
window.x = viewport.x + viewport.width * (cube.x+1)/2
En caso de que se preocupe por la Z final, la transformación no pasa por la ventana gráfica sino por DepthRange.
Una cosa más. Recuerde, gluProject da coordenadas donde el comienzo del sistema de coordenadas comienza en la esquina inferior izquierda. Las coordenadas de la pantalla comienzan en la esquina superior izquierda. Para obtener los valores correctos de las coordenadas de pantalla, se debe restar el valor de y de la altura del dispositivo OpenGL.
Por ejemplo en Qt GLWidget para dibujar un texto en (0,1,2) las coordenadas del mundo va:
gluProject (0,1,2, modelMatrix, projMatrix, sc.x, sc.y, sc.z); renderText (sc.x, height() - sc.y, "(0,1,2)");
- 1. Proyectando un punto 3D a una coordenada de pantalla 2D
- 2. ¿Coordenadas de OpenGL para coincidir con las coordenadas de la pantalla?
- 3. Cómo obtener la vista desde las coordenadas X/Y
- 4. Cómo obtener las coordenadas de un punto en un sistema de coordenadas según el ángulo y la distancia
- 5. Obtener en la pantalla las coordenadas de una cierta UITableViewCell?
- 6. ¿Cómo puedo convertir coordenadas espaciales 3D a coordenadas espaciales 2D?
- 7. Obtener el país desde las coordenadas?
- 8. Traducir las coordenadas del mouse a un plan 3D
- 9. Obtener coordenadas de pantalla de UILongPressGestureRecognizer
- 10. Cómo obtengo las coordenadas utilizables de la pantalla en Delphi
- 11. Android OpenGL selección 3D
- 12. glReadPixels() realmente una solución lenta y mejor para obtener las coordenadas de OpenGL desde la posición del mouse?
- 13. ¿Cómo obtener las coordenadas de un punto con un clic del mouse con JFreeChart?
- 14. Encontrar coordenadas de un punto en OpenLayers
- 15. La conversión de coordenadas de la pantalla al mundo en OpenGLES es una tarea fácil?
- 16. Cómo obtener coordenadas de dirección desde Python
- 17. Obtener coordenadas de un punto en una carretera
- 18. ¿Cómo funcionan las coordenadas de la pantalla de Android?
- 19. ¿Cómo marco las coordenadas de latitud/longitud en la pantalla?
- 20. Obtenga las coordenadas de un punto de mkmapview en iphone
- 21. Cómo obtener Yaw, Pitch and Roll desde un vector 3D
- 22. corrección de la perspectiva de las coordenadas de la textura en 3d
- 23. ¿Cómo obtener las coordenadas de ToolStripButton?
- 24. Obtener las coordenadas de un evento táctil en Android
- 25. ¿Puedo obtener las coordenadas de un div con JQuery?
- 26. ¿Encontrar coordenadas de un punto entre dos puntos?
- 27. Obtener las coordenadas del cursor en raphael
- 28. cómo obtener las coordenadas de un polígono en OpenLayers
- 29. herramienta para obtener las coordenadas de un píxel de imagen
- 30. ¿Cómo determino qué se toca en el espacio 3D desde la pantalla?
Este es un duplicado exacto de http://stackoverflow.com/questions/724219/how-to-convert-a-3d-point-into-2d-perspective-projection/866749#866749 –
@Mads Elvheim: Casi un duplicado exacto. Esta pregunta es específica de C++ y OpenGL. La otra pregunta no es. De hecho, la otra pregunta está etiquetada como "Java". –