Ukrywanie ścian dla wektorów z perspektywą

Szukasz drobnej pomocy przy kodowaniu, albo chcesz przedstawić światu swoją gotową lub w trakcie realizacji produkcję? To właściwy dział.
Wiadomość
Autor
DJ Gruby

Ukrywanie ścian dla wektorów z perspektywą

#1 Post autor: DJ Gruby »

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ę...

Obrazek

Będę wdzięczny za wszelkie porady. Pozdr.

splatterpunk
Posty: 1457
Rejestracja: 16 wrz 2008, 20:04

Re: Ukrywanie ścian dla wektorów z perspektywą

#2 Post autor: splatterpunk »

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!

DJ Gruby

#3 Post autor: DJ Gruby »

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.

ODPOWIEDZ