Strona 1 z 1

Ukrywanie ścian dla wektorów z perspektywą

: 30 paź 2012, 23:17
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.

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

: 31 paź 2012, 00:35
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!

: 01 lis 2012, 00:06
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.