J'essaye de construire une matrice de transformation de perspective en python pour une utilisation avec pyOpenGL. Mes transformations de vue et de modèle fonctionnent mais quand j'applique ma transformation de projection, je reçois un écran vide (je devrais voir un triangle à l'origine vu de (0,0, + 1)). J'ai regardé par-dessus les maths et autant que je peux dire que la transformation devrait fonctionner, j'ai donc besoin d'une deuxième paire d'yeux pour aider à trouver le problème.Matrice Perspective OpenGL en Python
def perspective(field_of_view_y, aspect, z_near, z_far):
fov_radians = math.radians(field_of_view_y)
f = math.tan(fov_radians/2)
a_11 = 1/(f*aspect)
a_22 = 1/f
a_33 = (z_near + z_far)/(z_near - z_far)
a_34 = -2*z_near*z_far/(z_near - z_far)
# a_33 = -(z_far + z_near)/(z_far - z_near)
# a_34 = 2*z_far*z_near/(z_far - z_near)
perspective_matrix = numpy.matrix([
[a_11, 0, 0, 0],
[0, a_22, 0, 0],
[0, 0, a_33, a_34],
[0, 0, -1, 0]
]).T
return perspective_matrix
projection_matrix = perspective(45, 600/480, 0.1, 100)
mvp_matrix = projection_matrix * view_matrix * model_matrix
Je transpose la matrice parce que je suis assez sûr que les magasins numpy la matrice transposée à la façon dont OpenGL a besoin. J'ai essayé d'envoyer la matrice sans la transposer et elle n'avait aucun effet (visible) sur la sortie.
Et voici le vertex shader:
#version 330 core
layout(location = 0) in vec3 position;
uniform mat4 MVP;
void main()
{
vec4 p = vec4(position, 1.0);
gl_Position = MVP * p;
}
Quelqu'un peut-il identifier ce que les éventuels problèmes avec ma transformation pourrait être?
EDIT: J'ai pris la matrice de sortie et j'ai effectué le calcul à la main. Après l'application de la division de perspective, tous les points du bord du tronc apparaissent le long de la boîte NDC, avec z aux points proches et lointains transformés respectivement à -1, +1 (précision mineure +/- due à l'erreur d'arrondi). Pour moi, cela suggère que mes maths ont raison et que le problème est ailleurs. C'est la matrice de sortie:
[ 1.93137085 0. 0. 0. ]
[ 0. 2.41421356 0. 0. ]
[ 0. 0. -1.002002 -1. ]
[ 0. 0. 0.2002002 0. ]
'600/480' va toujours retourner un' 1'. Faites-le '600.0/480.0'.Cela ne devrait pas être la raison de l'écran blanc si. –
600/480 = 1,25 quand je l'exécute en python. – Francis
http://ideone.com/I9sfXf –