Bonjour,
ce qui suit peut être un peu compliqué pour les personnes qui n'ont pas fait les math derrière mais voici la théorie pour une bonne projection:
D'abord, on utilise des vecteurs de dimension 4 pour définir un point et une matrice de 4x4 pour les transformations en 3D. Ceci provient du fait que les transformations en 3D ne sont pas linéaire !
Pour résoudre ce problème, on rajoute une 4ième composante et pour trouver les vrais coordonnées, on doit faire les calculs suivants:
x = (x1, x2, x3, x4) représente le point (x1/x4, x2/x4, x3/x4)
Maintenant, voyant voir comment on réalise une bonne projection, pour cela il faut comprendre les ONZE paramètres qui influencent une caméra:
les paramètres extérieurs:
- rotation: par rapport à une world-reference (0,0,0,0), la caméra peut être tourne en 3 dimensions, donc 3 paramètres
- translation: la caméra peut se trouver quelque part dans le repère, donc de nouveau 3 paramètres pour la translation
Si on appelle R la matrice de rotation (3x3) et T la matrice de translation (1x3), alors la matrice 4x4 qui définit les transformations extérieurs est:
(R,T;0,1)
les paramètres intérieurs:
- principal point: 2 paramètres qui définissent où se trouve le principal point sur ton caméra plane
- axis skew: un paramètre qui définit le rapport entre les deux axes, d'habitude ceci est 90°.
- inhomogeneous scaling: si tes pixels ne sont pas carrés, alors ceci sont les 2 paramètres qui influencent la rapport
Ceci fait un total de 11 paramètres pour le linéar camera model et la formule de projection est trop compliqué pour l'écrire ici donc je t'invite à lire:
http://cvlab.epfl.ch/~fua/courses/vision/math/notes/Cameras.pdfen particulier le dernier slide à la page 2 avec le titre "Full Projection Matrix".
Si tu as des questions, n'hésite pas à les demander, il se peut que tu as des problèmes comment trouver la matrice de rotation (c'est une multiplication de 3 3x3 matrices qui ont une forme spéciale (cosinus et sinus) et qui sont particulières par rapport à l'axe de rotation)
Et si maintenant tu te demandes pourquoi faire tout ce travaille alors qu'une simple formule:
x = f * X/Z
y = f * Y/Z
suffit, alors je peux de garantir que ceci est la base sur laquelle tu peux commencer à faire des choses bien, comme les transformations en OpenGL, comme les rotations, translations etc (tu dois tout simplement multiplier ta matrice de projection par la matrice de transformation avant de dessiner tes points et ils vont se trouver au bon endroit).