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.
Dziękujemy za kompletne rozwiązanie. Spróbuję tego od razu. – sum1stolemyname
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
@ 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