Domanda

Voglio proiettare il mio poligono lungo un vettore su un piano nello spazio 3D.Preferirei utilizzare un'unica matrice di trasformazione per farlo, ma non so come costruire una matrice di questo tipo.

Dato

  • i parametri dell'aereo (ax+by+cz+d),
  • le coordinate mondiali del mio Poligono.Come affermato nel titolo, tutti i vertici del mio poligono giacciono su un altro piano.
  • il vettore di direzione lungo il quale proiettare il mio Poligono (attualmente il vettore normale del piano del poligono)

obiettivo-una matrice di trasformazione 4x4 che esegue la proiezione richiesta,

O

  • qualche intuizione su come costruirne uno da solo

AGGIORNAMENTO

Grazie per la risposta, funziona come previsto.

Un avvertimento alle persone che hanno trovato questo:Se la normale del piano di proiezione è parallela al vettore di proiezione, il denominatore D diventerà (quasi) 0, quindi per evitare che accadano cose strane, è necessaria una sorta di gestione per questo caso speciale.L'ho risolto controllando se D < 1e-5 e, in tal caso, trasla semplicemente il mio poligono lungo il vettore di estrusione.

È stato utile?

Soluzione

Supponiamo che uno dei vertici del poligono lo sia (x0, y0, z0), e il vettore di direzione è (dx,dy,dz).

Un punto sulla linea di proiezione è: (x,y,z) = (x0 + t*dx, y0 + t*dy, z0 + t*dz).

Vuoi trovare l'intersezione di questa linea con il piano, quindi inseriscila nell'equazione del piano ax+by+cz+d = 0 e risolvi per t:

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

E poi hai il vertice di destinazione: x = x0+dx*t, eccetera.

Poiché questa è una trasformazione affine, può essere eseguita da una matrice 4x4.Dovresti essere in grado di determinare gli elementi della matrice scrivendo le tre equazioni per x,y,z in funzione di x0,y0,z0 e prendendo i coefficienti.

Ad esempio, per 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

Dove D = a*dx + b*dy + c*dz è il denominatore dall'alto.yez funzionano in modo simile.

Matrice dei risultati:

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

(Nota:Su Direct3D questa matrice dovrebbe essere trasposta, perché utilizza vettori riga anziché vettori colonna).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top