2010-03-23 9 views
6

Je souhaite projeter mon polygone le long d'un vecteur sur un plan dans l'espace 3D. J'utiliserais de préférence une matrice de transformation unique pour ce faire, mais je ne sais pas comment construire une matrice de ce genre.Comment projeter un polygone planaire sur un plan dans un espace 3D

Compte tenu

  • paramètres de l'avion (hache de + de + cz + d),
  • le monde les coordonnées de mon Polygon. Comme indiqué dans le titre, tous les sommets de mon polygone se trouvent dans un autre plan.
  • le vecteur de direction le long de laquelle projeter mon polygone (actuellement le vecteur normal de l'avion du polygone)

but de matrice de transformation 4x4 -a qui réalise la projection requise,

ou

  • un aperçu de la façon d'en construire un moi-même

MISE À JOUR

Merci pour la réponse, cela fonctionne comme prévu. Un mot d'avertissement aux personnes qui ont trouvé ceci: Si le plan de projection normal est parallèle au vecteur de projection, le dénominateur D deviendra (presque) 0, ainsi pour éviter des choses étranges de se produire, une sorte de manipulation pour ce cas particulier est nécessaire. Je l'ai résolu en vérifiant si D < 1e-5, et si oui, traduisez simplement mon polygone le long du vecteur d'extrusion. Supposons que l'un des sommets du polygone soit (x0, y0, z0) et que le vecteur de direction soit (dx,dy,dz).

Répondre

12

Un point sur la ligne de projection est: (x,y,z) = (x0 + t*dx, y0 + t*dy, z0 + t*dz).

Vous voulez trouver l'intersection de cette ligne avec le plan, donc le brancher dans l'équation du plan ax+by+cz+d = 0 et résoudre T:

t = (-a*x0 - b*y0 - c*z0 - d)/(a*dx + b*dy + c*dz) 

Et puis vous avez votre sommet cible: x = x0+dx*t, etc.

Comme il s'agit d'une transformation affine, elle peut être réalisée par une matrice 4x4. Vous devriez être capable de déterminer les éléments de la matrice en écrivant les trois équations pour x, y, z en fonction de x0, y0, z0 et en prenant les coefficients.

Par exemple, pour x:

x = x0 - (a*dx*x0 + b*dx*y0 + c*dx*z0 + d*dx)/D 
x = (1 - a*dx/D)*x0 - (b*dx/D)*y0 - (c*dx/D)*z0 - d*dx/D 

D = a*dx + b*dy + c*dz est le dénominateur d'en haut. y et z fonctionnent de manière similaire.

matrice Résultat:

1-a*dx/D -b*dx/D -c*dx/D -d*dx/D 
-a*dy/D 1-b*dy/D -c*dy/D -d*dy/D 
-a*dz/D -b*dz/D 1-c*dz/D -d*dz/D 
    0   0   0   1 

(Remarque: Direct3D cette matrice doit être transposée, car il utilise des vecteurs de ligne au lieu de vecteurs de colonne).

+0

Merci pour la solution complète. Je vais essayer tout de suite – sum1stolemyname

+0

J'ai implémenté votre solution. Cependant, j'ai rencontré des problèmes car mon vecteur de direction est (1 | 0 | 0) et l'avion est à un angle de 45 °: Vue latérale: '| ---->/'où | est le polygone et/est l'avion sur lequel il faut se lancer. Dans ce cas, un * dx/D = 1, où les deux autres entrys dans la première colonne sont 0 (dy = dzt = 0). cela conduit à l'ensemble du coumn étant 0, effaçant effectivement mon polygone à 0. Mon application ne aime pas cela. Connaissez-vous une solution de contournement pour cela? – sum1stolemyname

+1

@ sum1: La première colonne étant nulle signifie que la coordonnée x des sommets d'origine sera ignorée. Ceci est attendu puisque votre direction de projection est parallèle à l'axe x. Il ne sera pas à l'échelle de votre polygone à 0. – interjay