2010-03-23 15 views
6

Chcę wyświetlić mój wielokąt wzdłuż wektora do płaszczyzny w przestrzeni 3D. W tym celu korzystałbym najlepiej z pojedynczej macierzy transformacji, ale nie wiem, jak zbudować matrycę tego rodzaju.Howto rzut płaskiego wielokąta na płaszczyznę w przestrzeni trójwymiarowej

Podane

  • parametry samolotu (ax + by + cz + d),
  • świat koordynuje mojego Wielokąt. Jak stwierdzono w nagłówku, wszystkie wierzchołki mojego wielokąta leżą w innej płaszczyźnie.
  • wektor wzdłuż którego wystają mi wielokąt (obecnie wektor normalny wielokąta samolotu)

celem -a 4x4 macierz transformacji, która wykonuje żądany występ,

lub

  • trochę informacji o tym, jak je zbudować:

UPDATE

Dziękuję za odpowiedź, to działa zgodnie z przeznaczeniem.

Słowo ostrzeżenia dla osób, które to znalazły: Jeśli płaszczyzna normalnej projekcji jest równoległa do wektora rzutowania, mianownik D stanie się (prawie) 0, więc aby uniknąć dziwnych rzeczy, jakiś rodzaj manipulacji bo ten specjalny przypadek jest potrzebny. Rozwiązałem go sprawdzając, czy D < 1e-5, a jeśli tak, po prostu przetłumacz mój wielokąt wzdłuż wektora wytłaczania.

Odpowiedz

12

Załóżmy, że jednym z wierzchołków wielokąta jest (x0, y0, z0), a wektor kierunkowy to (dx,dy,dz).

Punkt na linii rzutu wynosi: (x,y,z) = (x0 + t*dx, y0 + t*dy, z0 + t*dz).

Chcesz znaleźć punkt przecięcia tej linii z płaszczyzną, więc podłączyć go do równania płaszczyzny ax+by+cz+d = 0 i rozwiązania dla t:

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

A potem masz swój wierzchołek docelowy: x = x0+dx*t itd

Ponieważ jest to transformacja afiniczna, można ją wykonać za pomocą macierzy 4x4. Powinieneś być w stanie określić elementy macierzy, pisząc trzy równania dla x, y, z jako funkcję x0, y0, z0 i przyjmując współczynniki.

Na przykład, 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 

przypadku D = a*dx + b*dy + c*dz jest mianownik z góry. y i z działają podobnie.

Wynik matrix

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 

(Uwaga: W Direct3D macierz należy transpozycji ponieważ wykorzystuje wektorów rzędu zamiast wektorów kolumny).

+0

Dziękujemy za kompletne rozwiązanie. Spróbuję tego od razu. – sum1stolemyname

+0

Zaimplementowałem twoje rozwiązanie. Jednakże mam problem, ponieważ mój wektor kierunkowy jest (1 | 0 | 0), a płaszczyzna jest pod kątem 45 °: Widok z boku: '| ---->/"gdzie | jest Wielokątem i/jest płaszczyzną, na którą prject. W tym przypadku a * dx/D = 1, gdzie pozostałe dwie pozycje w pierwszej kolumnie to 0 (dy = dzt = 0). to prowadzi do tego, że cały coumn jest 0, efektywnie skalując mój wielokąt do 0. Moja aplikacja tego nie lubi. Czy znasz sposób obejścia tego problemu? – sum1stolemyname

+1

@ sum1: Pierwsza kolumna oznaczająca zero oznacza, że ​​współrzędna x oryginalnych wierzchołków zostanie zignorowana. Jest to oczekiwane, ponieważ twój kierunek projekcji jest równoległy do ​​osi X. To nie będzie skalować twojego wielokąta do 0. – interjay