2010-02-21 3 views
3

J'ai un plan défini par une normale (n) et une distance (d) (depuis l'origine). Je voudrais le transformer en un nouveau système. Le chemin long est comme ceci: 1) multiplier la distance (d) par la normale (n) résultant en un vecteur (p) 2) tourner (R) et traduire (v) le vecteur (p) pour obtenir (p ') 3) normaliser (p «) pour obtenir le 4) normale utiliser un autre algorithme pour trouver la plus petite distance (d ») entre le nouveau plan et l'origineComment faire pivoter et translater efficacement un plan en 3D

Je n'ai pas essayé, mais je suppose qu'il devrait travail. QUESTION: N'y at-il pas un moyen plus rapide d'obtenir n 'et d'? Si la traduction (v) est 0 que je peux passer 4). Mais si ce n'est pas 0? Y at-il un moyen plus facile d'obtenir le nouveau d'?

Répondre

5

Vous devez être prudent, car Normales ne transforment pas nécessairement comme des points le font, et la distance est la perpendiculaire distance par rapport à l'origine, donc vous devez calculer d'= d + n.v. Si tout ce que vous faites est la translation et la rotation, alors vous pouvez faire tourner la normale et calculer une nouvelle distance perpendiculaire. Mais, si vous mettez à l'échelle vos axes différemment ou effectuez une transformation projective générale, vous devez traiter les choses différemment.

La façon dont fonctionne pour tout est d'utiliser les coordonnées homogènes, donc toutes vos transformées sont des matrices 4x4, et à la fois vos points et vos avions sont 4-vecteurs:

point p=(x,y,z)  -> homogeneous (x,y,z,1), equiv. to (x*W, y*W, z*W, W) 
plane q=[n=(a,b,c), d] -> homogeneous [a,b,c,d], equiv. to [a*K, b*K, c*K, d*K) 

    -> point p is on plane q iff: p.q=0 (using homogeneous coords, as above) 

Généralement, vous multipliez tous vos Transformer les matrices en une matrice T 4x4 et utiliser cette matrice sur chaque point pour déterminer sa position finale transformée. L'astuce est, vous devez utiliser le inverse transposer de T pour transformer vos coordonnées planes. De ce qui suit, vous pouvez voir que cela préserve l'incidence entre les points et les avions:

point p' = T p 
plane q' = (T^-1)^t q 

    -> point p' is on plane q' when: p'.q'=0 

    then, note: p'.q' = p^t T^t (T^-1)^t q = p^t q = p.q 
    so: p'.q'=0 whenever p.q=0 
+0

Oui, je ne fais que la rotation et la traduction. D'une manière ou d'une autre, j'espérais trouver un moyen simple de calculer la distance perpendiculaire en fonction de la normale ou de quelque chose de rotatif. Mais encore une fois, le calcul de la distance n'est pas si coûteux. Merci! – Golom

0
n' = n*R^T 
d' = d - n*R^T*trans 
+1

S'il vous plaît ajouter quelques commentaires sur votre solution sur pourquoi et comment il résout le problème –

Questions connexes