Usuwanie niewidocznych faceów [OPENGL] ale bez opengl

0

jak mam tablice z faceami (w niej wekotr normalny i tablica z wierzcholkami) + jakies swiatlo to czy robie juz wszystko czy nie bo nie wiem czy zabrac sie za pisanie kodu jak to ma nie dzialac.
Usuwam wszystkie facey ktore sa odwrocone tylem do swiatla.
Robie test dla kazdego face'a ktory znajduje sie blizej od innego, jak face dalszy znajduje sie wewnatrz projekcji 2d, która wyznacza wektor punkt przeciecia blizeszego face'a z promieniem swiatla (pod katem prostym) [wtedy z tego chce normalna stworzyc, która powie nam ktorego wymiaru nie rzutować], w sumie to wszystko czy cos pominalem ? :X bo jeszcze nigdy tego nie robilem :C

0

Usuwanie ścian niewidocznych odbywa sie zwykle w kilku etapach:

  1. Algorytm potencjalnych widocznych ścian( PVS ), można również używać po prostu BSP + PORTALE. Dzięki temu otrzymujemy zbiór potencjalnie widocznych ścian z każdej pozycji w "świecie".

  2. View frustum culling - czyli usuwamy ściany nie mieszczące sie w "piramidzie widzenia" obserwatora.

  3. Back face culling - ort! ścian odwróconych "tyłem" do obserwatora, czyli masz wektor normalny ściany i wektor z punktu kamery do ściany liczysz ich iloczyn skalarny i sprawdzasz jego znak, jeżeli jest < 0 (albo >=0 - zależy od orientacji ścian jakiej używamy )to nie rysujesz ściany w innym wypadku rysujesz. OpenGL robi to standardowo za nas pod warunkiem że to włączymy.

Z punktem 3 trzeba być ostrożnym, niektóre ściany muszą być widoczne z jednej jak i drugiej strony.

0

ja chce postawic lightmapy i musze wiedziec jak jeden face pokrywa drugi mam do tego teze ale nic mi nie pomogles : ]

0

Z tego co ja rozumiem mają to być cienie rzucane przez ściany na inne ściany? =]

Jeżeli tak to dobrze jest skorzystać z Drzewa BSP ( i ewentualnie portali ), dlaczego? ponieważ drzewo bsp tworzy zamknięte lokacje ( coś jak pokój itd ). oczywiście drzewo musi sie składać tylko ze ścian lokacji bez obiektów ( takich jak np krzesła, stoły itd ). teraz jeżeli mamy źródło światła wewnątrz takiego pomieszczenia to wiadomo że żadna ze ścian nie rzuci na inną cienia itd. możemy w takim razie rzucić na wszystkie ściany w tym pomieszczeniu światło(z tego źródła) uwzględniając kierunek padania itd, ( po prostu rzutować na płaszczyznę ). Druga sprawa jest nieco trudniejsza, ściana z jednego pomieszczenia może rzucić cień na drugie pomieszczenie! i tutaj przydałyby się portale. wtedy mamy listę lokacji powiązanych i łatwo nam ocenić gdzie powinniśmy rzutować światło / cień. Ostatnia istotna rzecz to wrzucenie wszystkich statycznych elementów mapy do drzewa ( tak teraz kolej na te elementy jak krzesła, skrzynie itd ), one powpadają do konkretnych pomieszczeń i oczywiście tylko w nich mogą rzucać cienie ( no i jeszcze do lokacji połączonych portalami ). Zostaje kwestia rzucania cienia przez np krzesło na skrzynie itd tutaj należy posłużyć się prostą zasadą, jeżeli mamy źródło światła i dwie ściany to jedna rzuci cień na drugą tylko wtedy gdy jedna z nich stoi pomiędzy źródłem światłą a druga ścianą ( logiczne :P ). wtedy rzutujemy wierzchołki cienia na płaszczyznę ściany i jeżeli jakikolwiek wierzchołek drugiej ściany zawiera się w tej "piramidzie" cienia no to generujemy lightmapę.

Ważna sprawa przy tworzeniu cienia na podstawie obiektu i źródła światła, nie rzucamy cienia za pomocą każdego mesh'a face'a, generuje się najpierw listę krawędzi obiektu ( w końcu tylko one rzucają cień! ) a na ich podstawie tworzy schadow volume ( taka piramida )

1 użytkowników online, w tym zalogowanych: 0, gości: 1