2017-08-23 2 views
1

J'essaie de trouver un moyen de convertir une matrice de transformation 3D en 2D dans OpenGL. Mes coordonnées z sont ignorées (je travaille avec des projections au sol).Conversion de la transformation 3D en 2D

Voici un exemple de ce que je suis en train de réaliser:

// Given a transformation matrix 
// | r00 r01 r01 t0 | 
// | r10 r11 r11 t1 | 
// | r20 r21 r21 t2 | 
// | 0. 0. 0. 1. | 
// 
// Ignore the z-coordinate, and convert it to 
// | r00 r01 t0 | 
// | r10 r11 t1 | 
// | 0. 0. 1. | 
glm::dmat4 t_matrix_3D = GetTransformation(); 
glm::dmat3 t_matrix_2D = glm::dmat3(t_matrix_3D); 
t_matrix_2D[2] = dvec3(dvec2(t_matrix_3D[3]), 1.); 
t_matrix_2D[0][2] = 0.; 
t_matrix_2D[1][2] = 0.; 

La question est de savoir s'il y a un moyen plus joli de le faire? Peut-être en utilisant un découpage matriciel ou une extraction sous-matricielle?

+2

serait plus compréhensible être: 'GLM :: mat4 m4,' ' glm :: mat3 m3 (m4 [0] [0], m4 [0] [1], 0.0f, m4 [1] [0], m4 [1] [1], 0.0f, m4 [3] [0] ], m4 [3] [1], 1.0f); ' – Rabbid76

Répondre

3

Le plus compréhensible et probablement la plus performante façon est d'écrire une méthode en ligne ou fonction et d'utiliser directement le constructeur de glm::mat3:

glm::mat3 Mat3Dto2D(const glm::mat4 & m) 
{ 
    return glm::mat3(
     m[0][0], m[0][1], 0.0f, 
     m[1][0], m[1][1], 0.0f, 
     m[3][0], m[3][1], 1.0f 
    ); 
} 
+0

C'est à peu près ce que je fais en ce moment - existe-t-il un moyen de construire une matrice en utilisant une combinaison submasters/rows/columns. Généralement, je suis à la recherche d'un doublure lisible :) – RafazZ

+1

@RafazZ Communément un liner lisible est une fonction bien nommée – Rabbid76