Modele 3D
Z EGA Wiki
Spis treści |
Wstęp
Oto opis (póki co bardzo podstawowy) elementów z jakich składa się model 3D. Jest to również specyfikacja zapisu takiego modelu w pliku testowym bądź binarnym. Opisane tutaj elementy, to te które aktualnie mamy zaimplementowane bądź przynajmniej "ogarnięte". Z czasem trochę to urośnie.
Dane te są specyficzne dla naszego renderera, np. użyte jest kilka tekstur jako map światła i wybojów zamiast np. tylko jednej podstawowej tekstury.
Z czego składa się model.
Model, składa się z brył trójwymiarowych tzw. mesh'y, najczęściej implementowanych w postaci trójkątów o wspólnych (niekoniecznie, ale często) wierzchołkach. Takiej bryle nadajemy właściwości materiału z jakiego jest zrobiona oraz obklejamy teksturą. Tekstury wykorzystujemy jako mapy światła i wybojów tj. do pięciu różnie wykorzystywanych plików graficznych.
Aby narysować bryłę potrzebujemy następujących danych:
- zbiór punktów - zbiór wektorów normalnych do punktów
- listę face'ów (informację o tym jak z danych punktów utworzyć trójkąty)
Aby nakleić teksturę, dla każdego punktu potrzebujemy dodatkowo podać uv-koordynaty. U nas model może definiować kilka uv setów, dzięki czemu np. wszystkie tekstury, (a mamy ich nawet 5), nie muszą być jednakowego rozmiaru.
Informacje składające się na materiał to (przetłumaczę innym razem):
- ambient color
- diffuse color
- specular color
- shininess
I do tekstur:
- diffuse map
- bump map
- specular map
- transparent map
- self illumination map
Poniżej znajduje się specyfikacja plików z opisem modelu oraz materiału.
Binarny plik modelu. (tekstowy będzie prawie taki sam i powstanie najpewniej w celu debugowania)
unsigned int - 4 bajty
float - 4 bajty
char - 1 bajt
String zakończony bajtem zerowym
Wszystkie inty są unsigned
Klamry oznaczają pętle
Opisy przy klamrach są tylko informacyjne.
Wartości które są w pliku są oznaczone nawiasami kwadratowymi [], inne strzałki nawiasy i opisy są tylko informacyjne
- BOF
[model name] <- string
[mesh count] <- int
{meshes [mesh name] <- string [mesh material set] <- string [mesh material name] [vertex count] <- int [normal count] <- int [tex_coords sets num] <- int [face count] <- int
{vertices [x] <- float [y] <- float [z] <- float }
{normals [u] <- float [v] <- float [n] <- float }
{tex_coords sets [tex_coord count] <- int {set's coordinates [u] <- float [v] <- float }
}
{faces
[vertex index] <- int
[normal index] <- int
{for every uv set
[tex_coord index] <- int
}
}
}
- EOF //To poniżej jest nieakualne, gdyż nie obsługuje uv setów, zostanie poprawione.
Materiały, składowane są w setach (plik tekstowy):
MATERIALSET (nazwa)
material_count (ilosc materiałów)
material (nazwa)
ambient_color (r g b a) <- float
diffuse_color (r g b a) <- float
specular_color (r g b a) <- float
specular_level (wartość) <- 0-100
glossines (wartość) <- 0-128
bump_factor (wartość) <- 0-100
diffuse_map (nazwa textury)
bump_map (nazwa textury)
specular_map (nazwa textury)
transparent_map (nazwa textury)
self_illumination (nazwa textury)
Techniki specjalne
W tym dziale zostaną zaprezentowanepewne techniki stosowane do wykańczania modeli. W szczególności skupimy się na wizualnej poprawie jakości poszczególnych modeli. Jak się okazuje, nie tylko zwiększanie ilości poligonów prowadzi do poprawy efektów wizualnych.
Ambient Occlusion
Wyobraźmy sobie pochmurny dzień. Żaden przedmiot nie rzuca w taki dzień wyrażnego cienia, gdyż światło rozproszone na chmurach pada na ziemię ze wszystkich stron. Jeżeli jednak przyjrzymy się jakiemuś obiektowi (ot, chociażby ścianie budynku) to zobaczymy że wszystkie zagięcia (np. kąty) są ciemniejsze od powierzchni płaskich. Dzieje się tak dlatego, że światło nie dochodzi tak intensywnie do zagięć i zakamarków. Jak wykorzystuje się tą technikę? Tworzymy model, który oświetlamy światłem typu ambient. Następnie uzyskany efekt wypalamy do tekstury (czyli tworzymy białą teksturę z ciemnymi fragmentami odpowiedzialnymi za cień) co jest procesem automatycznym w programach do tworzenia grafiki 3D. To tyle gwoli wprowadzenia. Poniżej przedstawie przykład wykorzystania opisanej techniki wykonany w programi Maya 2010.
Zacznijmy zatem od stworzenia prostego modelu. Obiekt ten może być dowolny, jednak jeśli nie będzie on posiadać żadnych wgłębień i zagięć to efekt będzie znikomy (zwykła kostka to po prostu trochę za mało). Ja postanowiłem wykorzystać do tego celu apteczkę.
Jako że będziemy korzystać z renderera mental ray musimy pamiętać, aby włączyć Mayatomr.mll plug-in.
Teraz otwieramy "Hypershade editor". Będziemy pracować na "surfaceShader1" więc przeciągamy (przytrzymując środkowy przycisk myszki) go do obszaru roboczego. Następnie wybieramy opcję "mental ray Nodes" u szczytu rozwijanel listy z lewej strony. Do obszaru roboczego dodajemy również "mib_amb_occlusion1", który znajdziemy z lewej strony w zakładce "Textures" (patrz Rysunek 4).
Mając już te dwa elementy w obszarze roboczym, łączymy je przeciągając "mib_amb_occlusion1" na "surfaceShader1" (ponownie przytrzymując środkowy przycisk myszki oraz ctrl). Następnym etapem będzie przygotowanie sceny. W tym celu ustawiamy kolor tła na biały. W okienku perspektywy klikamy View->Select Camera w "Attribute Editor" rozwijamy zakładkę "Environment" i wybiermay kolor biały. W "Rendering Settings" wybieramy mental ray jako renderer oraz ustawiamy filtr na "Lanczos" (Rysunek 5).,
Teraz pozostaje nam jeszcze zmienić kilka ustwaien no i oczywiści przypasować materiał do naszego obiektu. W "Hypershade" przeciągamy za pomocą środkowego przycisku myszy "surfaceShader1" na naszą apteczkę. I gotowe. Teraz wystarczy wyrenderować naszą scenę. Jednym z parametrów jaki będziemy modyfikować na tym etapie jest ziarnistość, którą możemy zmieniać w "Attribute Editor" wybierając uprzednio "mib_amb_occlusion1" w "Hypershade". Ziarnistość (Samples) odpowiada za gęstość ziarna tworzącego cień. Najlepiej jest to widoczne na poniższym rysunku (Rysunek 6).
Ostatnim etapem jest oczywiście wypalenie obrazu do tekstury. Zanim to zrobimy, wpierw ustawiamy folder projektu File-> Project -> Set tak aby nie musiliśmy później szukać wyników naszej pracy w domyślnych folderach programu Maya. Musimy również rozłożyć siatkę UV. Osobiście skorzystałem w tym celu z "Create UVs" -> "Automating Mapping". Po zakończeniu tych czynnosci przechodzimy do "Lighting/Shading" -> "Batch Bake (Mental Ray)" -> "Options box" wybierając uprzednio menu "Rendering". Poniżej przedstawaim konfigurację, z której sam korzystam i która dobrze działa dla większości modeli (Rysunek 7).
Teraz pozostaje juz tylko nacisnąć Convert i poczekać na rezultat. Konwersja może potrwać kilka minut lub nawet godzin w zależności od wybranych ustawień. Opisana wyżej ziarnistość znacząco wpływa na czas konwersji (im wyższa ziarnistość tym dłużej trzeba czekać).
Otrzymaną w ten sposób teksturę należy połączyć z docelową teksturą modelu. W świecie grafiki do tego celu używa się Photoshopa jakkolwiek równie dobrze sprawdza się Gimp. W programie tym ustwaiamy naszą wypaloną teksturę jako warstwę i naszą orginalną teksturę "mnożymy" z tą wypaloną. Całość zapisujemy na przykład w formacie png. Poniżej przedstawiam wypaloną teksturę i warstwy w programie Gimp.
Na zakończenie tej sekcji pozostaje już tylko przedstwaić dwa modele z i bez ambient occlusion. Różnica jest zauważalna.
Normal maps
Już w latach 90 ubiegłego wieku zastanawiano się w jaki sposób znacząco poprawić jakość modelu nie zagęszczając jego siatki poligonów. Okazało się że można to zrobić wykożystując normal mapy. Obecnie tworzy się model (np. postaci) za pomocą zwykłego polygonal modeling, który ma kilka tysięcy poligonów, następnie model taki eksportuje się do jakiegoś programu do sculptingu (np. Mudbox). Technika sculpting polega na rzeźbieniu modelu, który musi mieć znacznie zagęszczoną siatkę. Po tym procesie nasz obiekt może mieć nawet kilka milionów poligonów. Taka ilość meshy jest nie do zaakceptowania, gdyż znacznie obniżyłaby wydajność gry. Z tego też powodu, całą pracę wykonaną w programie do sculpting zapisujemy w postaci normal map, które po połączeniu z teksturą tworzą wrażenie dużej szczegółowości. Innymi słowy w normal mapach zapisujemy wszelkiego rodzaju detale a zwłaszcza wypukłości i wklęsłości.
Poniżej przedstawię przykład użycia normal map do nadania realistycznego wyglądu ścianie zrobionej z kamieni.
Do stworzenia normal mapy potrzebujemy programu do obróbki grafiki 2D. Nadaje się do tego darmowy Gimp, którego wersja podstawowa nie posiada możliwości eksportowania obrazu jako normal mapy, jednakże jest dostępna darmowa wtyczka uzupełniająca ten brak ( http://code.google.com/p/gimp-normalmap/ ). Mając już zaistalowanego Gimp'a ze wspomnianą wtyczką możemy rozpocząć pracę. Otwieramy obraz naszej tekstury (Rysunek 1).
Pierwszym krokiem będzie zmiana obrazu na czarno-biały. Taki zabieg spowoduje że efektem końcowym nie będzie normal mapa tylko tak zwana bump mapa, która przechowuje informacje na temat wszystkich wypukłości, czyli to o co nam tak na prawdę chodzi. Klikamy menu Kolor->Desaturacja wybieramy Jasność i zatwierdzamy. Otrzymujemy czarno-biały obraz (Rysunek 2).
Następnie wybieramy Kolory->Poziomy i przesuwając widoczne trójkąty zmieniamy ilość poziomów szarości (przykładowe ustawienie poklazuje Rysunek 3).
Teraz pozostaje już tylko utworzenie właściwej normal mapy. Wybieramy Filtry->Odwzorowania->Normalmap pojawi się okienko dodatkowych ustawień, w którym to spokojnie możemy zatwierdzić domyśle ustawienia klikając OK. Rezultat prezentuje Rysunek 4.
Zanim użyjemy naszej nowo powstałej normal mapy przeprowadzimy jeszcze jeden zabieg. Wybieramy odpowiednio Filtry->Rozmycie->Rozmycie Gaussa gdzie promień rozmycia ustawiamy na 3 i 3, całość zatwierdzamy. Kolejno zmieniamy tryb warstwy jako "Połączenie ziarna" (Rysunek 5).
Teraz gdy skopiujemy naszą warstwę, zwiększy się głębokosc naszej mapy, możemy dodać więcej kopii warstwy w zależności od naszych potrzeb (Rysunek 6).
Modele w grze "Disturb 2"
W tym dziale zamieszczane są modele, które prawdopodobnie będą używane w grze Disturb 2. Wiele z nich stanowi dopiero początkowy etap pracy lub jest prototypem docelowego modelu. Wszystkie modele podzieliłem na kategorie, aby wprowadzić w tym wszystkim jakiś porządek.







































