Je dois faire une erreur quelque part le long du chemin dans mes maths, mais je n'arrive pas à trouver la faille dans ma logique. Nous pouvons calculer l'orientation de rotation d'une caméra par rapport au système de coordonnées du monde en 3D en utilisant l'emplacement de 2 (sur 3) points de fuite du système mondial. Si la caméra est presque alignée avec le système mondial, nous pourrions trouver le point de fuite de l'axe X à la position (10000000, 0)
sur le plan de l'image et le point de fuite de l'axe Y à la position (0, 10000000)
. Cela signifierait que les lignes sur ces axes sont presque parallèles dans l'image. Et avec K
étant des paramètres internes, nous pouvons utiliser (ajouter un 1 à la matrice de point de fuite pour le rendre 3D) de l'appareil photo:Une minuscule variation de hauteur entraîne une rotation de 180 degrés lors du calcul de l'orientation à partir des points de fuite?
r1 = (K.inverse * vp_x)/norm(K.inverse * vp_x)
r2 = (K.inverse * vp_y)/norm(K.inverse * vp_y)
r3 = cross_product(r1, r2)
Pour obtenir les 3 colonnes de la matrice de rotation, ce qui entraîne quelque chose près de:
1 0 0
0 1 0
0 0 1
Ce qui est ce que nous attendons, puisque le système est presque aligné. Cependant, si nous inclinons légèrement la caméra, les lignes de l'axe Y convergent en valeurs négatives de y sur le plan de l'image. Par exemple, la position du point de fuite peut maintenant apparaître à (0, -10000000)
. Mais en utilisant le même calcul que précédemment, nous nous retrouvons avec une matrice de rotation:
1 0 0
0 -1 0
0 0 -1
Ce qui suggère une rotation de 180 degrés autour de l'axe X. Bien sûr, nous sommes dans la même direction que précédemment, donc une rotation de 180 degrés n'a pas de sens. Je dois manquer quelque chose, mais je ne sais pas quoi. Aucune suggestion? Merci!