Tourner vecteur normal sur l'axe de l'avion
J'ai un ensemble de points de données dans l'espace 3D qui, apparemment, tous tombent sur un plan spécifique. J'utilise de l'APC pour calculer les paramètres du plan. La 3ème composante de l'ACP, me donne le vecteur normal du plan (le plus faible).
Ce que je veux faire est de transformer tous les points sur ledit plan et de le regarder en 2D.
Mon idée était de faire ce qui suit:
- Trouver un point central (point moyen) sur le plan
- Soustraire de tous les points de données afin de les organiser autour de l'origine
- Rotation de la normale, de sorte qu'il devient (0,0,-1)
- Appliquer cette rotation à tous les points de données
- Utiliser la projection orthogonale (en gros, passez de l'axe z)
Maintenant, je suis coincé à trouver la bonne rotation de l'opération. J'ai essayé de travailler avec acos ou atan et mise en place de deux matrices de rotation. Semble que les deux méthodes (à l'aide d'acos, à l'aide de atan) donnez-moi le mauvais résultat. Peut-être que vous pouvez m'aider ici!
Code Matlab suivant:
b = atan(n(1) /n(2));
rotb = [cos(b) -sin(b) 0; sin(b) cos(b) 0; 0 0 1];
n2 = n * rotb;
a = atan(n(1) /n(3));
rota = [cos(a) 0 sin(a); 0 1 0; -sin(a) 0 cos(a)];
n3 = n2 * rotaows:
J'attends n2
d'avoir composante y de zéro. Cependant qui ne déjà pour le vecteur (-0.6367, 0.7697, 0.0467).
Que, ou connectez l'appareil photo directement à l'avion tel qu'il est en train de regarder directement.
La caméra idée est bonne. Vous déplacez l'appareil photo de l'avion à partir de l'origine à une certaine distance le long de la normale. Vous pointez l'appareil photo à l'origine. Bien sûr, cela suppose que vous avez de la projection de caméra code, ce qui peut être fait avec des avec des rotations ou des vecteurs.
Bonne suggestion. Malheureusement, je n'ai pas de caméra de code et je ne veux pas introduire toutes les opérations que je ne suis pas entièrement le contrôle.
OriginalL'auteur ypnos | 2009-06-21
Vous devez vous connecter pour publier un commentaire.
Si vous avez un plan, vous disposez d'un vecteur normal et une origine. Je ne voudrais pas faire de "rotations". Vous êtes juste un peu de vecteur opérations loin de votre réponse.
Si vous avez de la croix et le produit scalaire des fonctions déjà, c'est juste quelques lignes de code. Je sais que ça fonctionne parce que la plupart de la 3D, les jeux vidéo, j'ai écrit a travaillé de cette façon.
Astuces:
Fantastique réponse! Cela résout beaucoup de problèmes que j'ai eu (avec rotation des erreurs via trig) tout ce temps. Je pense que j'ai besoin de prendre une algèbre linéaire cours.
OriginalL'auteur Nosredna
Comment sur:
Décomposer le vecteur normal en un vecteur dans le plan XY et Z du vecteur. Ensuite, appliquez une rotation autour de l'axe Z à la ligne XY vecteur avec l'un des axes. Ensuite, trouver le produit scalaire de la normale à l'axe Z, et faire pivoter le long de laquelle jamais de X,Y, doublée haut avec.
L'idée est d'aligner le vecteur normal jusqu'à Z, et, par le fait que votre avion est maintenant le plan XY.
OriginalL'auteur freespace
Bien qu'il y avait d'autres réponses intéressantes, c'est la solution que nous avons trouvé lors de l'attente pour les réponses:
(Elle retourne un espoir de corriger double matrice de rotation)
La faille que nous avions avant et fixe ici était de l'esp. traiter avec le signe de la composante X, qui n'était pas couvert dans les cosinus des calculs. Cela nous a fait tourner dans le mauvais sens une fois (rotation de 180° - angle).
J'espère aussi trouver le temps d'essayer Nosredna la solution! Il est toujours bon d'éviter la trigonométrie.
Oui, atan2 est génial et il m'a sauvé beaucoup de temps avant. Un bon indice.
OriginalL'auteur ypnos