Pytanie do koderów...
Jaki macie sposób na ukrywanie niewidocznych ścian dla wektorów rysowanych z perspektywą. Tradycyjne podejście z obliczaniem wektora prostopadłego do danej ściany i sprawdzaniu, czy jego współrzędna z jest większa niż 0 nie zawsze zdaje w takim przypadku egzamin, bo fizycznie ściana może być jeszcze zwrócona minimalnie w kierunku obserwatora, jednak perspektywa powoduje, że wierzchołki znajdujące się dalej od niego zostaną pomniejszone i w wyniku tego ukryta musi zostać cała ściana.
Załączam obrazek, aby łatwiej unaocznić sytuację, o której mówię...
Będę wdzięczny za wszelkie porady. Pozdr.
Ukrywanie ścian dla wektorów z perspektywą
-
- Posty: 1457
- Rejestracja: 16 wrz 2008, 20:04
Re: Ukrywanie ścian dla wektorów z perspektywą
Trzeba, dla każdej ściany:
1) policzyć wektor normalny ściany (wektor N)
2) policzyć wektor skierowany od jednego z wierzchołków tejże ściany do obserwatora (wektor R)
3) sprawdzić czy kąt pomiędzy tymi dwoma wektorami jest mniejszy czy większy od 90 stopni.
Można tego dokonać mnożąc skalarnie wektory N i R a potem sprawdzić czy wynik jest większy od zera.
SK = N razy (skalarnie) R = n1*r1+n2*r2+n3*r3
gdzie n1,n2,n3 to składowe wektora N
oraz r1,r2,r3 to składowe wektora R
Ostateczny warunek:
Jeżeli SK > 0 to ściana widoczna, więc rysuj ścianę.
ewentualnie: Jeżeli SK < 0 to rysuj ścianę (przy odwrotnej kolejności
w definicji ściany, tzn. odwrotnej kolejności wierzchołków ściany)...
Ogólnie trzeba uważać na orientację, clockwise czy anti-clockwise, sporo sobie przy tym krwi napsułem
Powodzenia!
1) policzyć wektor normalny ściany (wektor N)
2) policzyć wektor skierowany od jednego z wierzchołków tejże ściany do obserwatora (wektor R)
3) sprawdzić czy kąt pomiędzy tymi dwoma wektorami jest mniejszy czy większy od 90 stopni.
Można tego dokonać mnożąc skalarnie wektory N i R a potem sprawdzić czy wynik jest większy od zera.
SK = N razy (skalarnie) R = n1*r1+n2*r2+n3*r3
gdzie n1,n2,n3 to składowe wektora N
oraz r1,r2,r3 to składowe wektora R
Ostateczny warunek:
Jeżeli SK > 0 to ściana widoczna, więc rysuj ścianę.
ewentualnie: Jeżeli SK < 0 to rysuj ścianę (przy odwrotnej kolejności
w definicji ściany, tzn. odwrotnej kolejności wierzchołków ściany)...
Ogólnie trzeba uważać na orientację, clockwise czy anti-clockwise, sporo sobie przy tym krwi napsułem
Powodzenia!
Bardzo ładnie mi tutaj, Splatterpunk, poradziłeś. Sposób szybki, zgrabny i co najważniejsze skuteczny. Nie napotkałem żadnych problemów z orientacją, clockwise czy anti-clockwise, natomiast chwilę mi zeszło z poprawnym określeniem wektora R (obserwatora) - nie mogłem zrozumieć, chociaż powinno się to wydawać oczywiste, gdzie ja tego obserwatora ulokowałem. ;) Niemniej jednak wszystko ładnie zaimplementowane, śmiga. Dziękuję za pomoc, bez której pewnie długo bym się jeszcze zmagał z problemem. Temat do zamknięcia.