Trójkątyzacja

2008-01-21 23:03

Wyświetlanie pojedynczych trójkątów – nawet najpiękniej pokolorowanych – to oczywiście dopiero początek. Niezależnie od tego, czy uczymy się obsługi jakiejś biblioteki 3D czy też piszemy własną, chcemy zająć się przede wszystkim wyświetlaniem brył. Rodzajów możliwych brył jest oczywiście sporo, ale te często używane i “regularne” ich rodzaje charakteryzują się przede wszystkim tym, że dają się opisać równaniami matematycznymi i zależnościami geometrycznymi. Wiemy na przykład, że sfera jest taką figurą, która składa się ze wszystkich punktów znajdujących się dokładnie w określonej odległości od danego – środka.
Problem w tym, że takich punktów jest “dość” dużo, bo nieprzeliczalnie wiele. Zarówno tą, jak i każdą inną bryłę w tradycyjnym renderingu zwykło się więc przybliżać automatycznie generowanymi trójkątami (jest to różnica np. w stosunku do raytracingu, czyli śledzenia promieni). Nazywa się to triangulacją i wymaga kilku operacji, takich jak:

  1. Wyznaczenie odpowiedniej liczby punktów należących do powierzchni. Ich ilość powinna być regulowana – tak, aby w razie potrzeby otrzymywać siatki o różnych gęstościach punktów, a więc wpływać na jakość obrazu wynikowego (i, oczywiście, szybkość rysowania).
  2. Połączenie wygenerowanych wierzchołków w trójkąty. W przypadku stosowania backface cullingu, czyli eliminowania powierzchni zwróconych przeciwnie do obserwatora, należy zadbać o właściwą kolejność wierzchołków w tych trójkątach.
  3. Obliczenie wektorów normalnych dla wierzchołków. Wiadomo, że w gotowych siatkach możliwe jest przybliżone wyznaczenie tych wektorów w oparciu o sam rozkład trójkątów i kilka iloczynów wektorowych, lecz sposób ten jest niedokładny. Nie powinniśmy też z niego korzystać, gdy mamy dodatkową informację o powierzchni, którą nasze trójkąty przybliżają. W sferze na przykład dokładnie wiadomo, że normalne muszą być równoległe do wektorów biegnących od środka do punktu na powierzchni sfery.

Przykładowa scena (siatka) Przykładowa scena (cieniowanie Gouraud)

I to w zasadzie wszystko. Warto oczywiście natychmiast sprawdzić rezultat przy pomocy renderowania w trybie wireframe, czyli rysowania tylko konturów figur. Jeśli wszystko dobrze pójdzie, to można się już pochwalić czymś więcej niż tylko jednym trójkątem, co też niniejszym czynię :)

Tags: , ,
Author: Xion, posted under Programming »


7 comments for post “Trójkątyzacja”.
  1. puchaty/I:
    January 22nd, 2008 o 13:01

    Trójkąty to zło…

  2. MrMister:
    January 22nd, 2008 o 18:03

    Yeah różowe tło :)

  3. Xion:
    January 22nd, 2008 o 19:00

    Nie różowe, tylko w karmazynowe – czyli magenta :)

  4. SirMike:
    January 22nd, 2008 o 22:24

    Za kolory masz u mnie “dopuszczajacy” :P

  5. spaxio:
    January 23rd, 2008 o 11:21

    Ładne kolory, ile SPF? ;)

  6. Reg:
    January 27th, 2008 o 12:07

    Piękne, tylko oświetlenie mi się nie podoba. Coś się tu nie zgadza w obliczeniach. Jeśli to jest światło Directional, czyli dot(DirToLight, Normal), to masz coś źle. Prawdopodobnie któryś z wektorów nie jest znormalizowany tylko za długi.

  7. Xion:
    January 27th, 2008 o 14:43

    Są tu dwa światła punktowe: o ile pamiętam jedno jest pomiędzy walcami pionowymi, bliżej rogu podstawy; drugie jest bezpośrednio nad walcem poziomym. Poza tym wierzchołki podstaw są zdublowane – raz z normalnymi prostopadłowymi do pow. bocznej, a raz do podstaw, więc stąd wynika ostra krawędź między światłem a cieniem przy podstawie.
    Tak czy siak sprawdzę jeszcze te normalne.

Comments are disabled.
 


© 2019 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.