2010-09-25 31 views
12

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

+0

Este es un duplicado exacto de http://stackoverflow.com/questions/724219/how-to-convert-a-3d-point-into-2d-perspective-projection/866749#866749 –

+2

@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". –

Respuesta

4

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); 
+1

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. –

+0

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

+0

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

20

de erjot es incompleta.

Hay 2 cosas adicionales a tener en cuenta.

  1. con homogeneous = P . M . world, el vector es un vector homogeneous 4-d en el espacio homogénea. En particular, para devolverlo al cubo [-1: 1]^3, debe dividir sus primeras 3 coordenadas por homogeneous.w. cube.x = homogeneous.x/homogeneous.w (lo que algunos llaman división de proyección).
  2. 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.

2

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)");

Cuestiones relacionadas