Strona ta opisuje tworzenie modeli 3D dla potrzeb symulatora MaSzyna EU07-424 przy pomocy programu 3dstudiomax lub gmax.
Strona nie jest podręcznikiem na temat programu 3dsmax (bo musiała by być wielokrotnie większa, zresztą autor strony zna tylko 10% mozliwości 3dsmax ;-) zakładam pewną znajomość programu do edycji 3d.
Jeśli jednak masz kłopoty z roieniem poprawnych modeli, przygotowałem mały tutorial

Jeśli używasz innego programu niż 3dstudiomax, bylibyśmy wdzięczni gdybyś napisał jakiś konwerter z tego programu do formatu .t3d uzywanego przez nasz symulator.

Na wstępie pewne reguły które są istotne niezaleznie czy tworzymy model dla tego programu, czy też dla MSTS, TrainZ itp.
Otóż model lokomotywy lub wagonu lub budynku, wraz z innymi modelami pojazdów, budynków, słupów itp, musi być wyswietlany minimum 20 razy na sekunde, aby uzyskać wrażenie płynności ruchu.

Program musi posortować poszczególne płaszczyzny aby je móc wyswietlać w odpowiedniej kolejności (uwzględniając że jeden obiekt moze zasłonic inny), obliczyć naężenie padającego światła, potem musi te płaszczyzny narysować wraz z przypisaną im teksturą.
Im bardziej złożony obiekt, tym więcej takich operacji, więcej też miejsca w pamięci zajmuje taki model.
Wydajność komputera siada, mamy mało FPS (frame per second), animacja sie rwie a program może się zawiesić.

Dlatego fundamentalna zasada którą powinnismy sie kierować budując model brzmi:

model musi być jak najprostszy!

Jak to osiągnąć?

Na sieci można znaleźć kilka bardzo ładnych modeli, np. Pt47. Niestety nadają sie one tylko do pooglądania w programie do edycji 3d, ilość szczegółów dyskwalifikuje je dla potrzeb symulatora.

wireframe Pt47 model piękny ale zbyt skomplikowany

Tymczasem można stworzyć model nawet o 10x mniejszej ilości płaszczyzn ale tak samo ładnie wyglądajacy, przynajmniej z odległości z jakiej na ogół patrzymy na lokomotywę.

Efekt ten można uzyskać operując odpowiednio teksturami.
Nie ma potrzeby odtwarzania każdego nitu, wyczystki, kątownika itp w trójwymiarze. Takie coś ładnie wygląda w programie renderującym statyczne sceny, ale symulatory ruchu pociągu i tak nie policzą cieniowania takich detali a oświetlenie ich policzą błędnie (bez raytracingu).

Lepiej takie detale po prostu namalować na danej powierzchni, innymi słowy kocioł robimy płaski a drobne detale osprzętu są nałozone jako tekstura - na ogół nie trzeba jej rysować, można ja uzyskać metodą fotograficzną, ale to temat na osobny opis.

Za pomocą tekstur można też upraszczać skomplikowane ale płaskie kształty - wózki, tarcze zderzaków, koła itp.

Nalezy tu zwrócić uwagę, ze wszelkie powierzchnie są zawsze tworzone z trójkątów (jedynych brył o ścisle zdefiniowanej płaszczyźnie), i to te trójkaty musi program przetwarzać w każdej ramce obrazu. Jeśli rysujemy okrągłą tarczę zderzaka to w programie 3d musimy zdefiniować ilość segmentów którymi będzie aproksymowany ten okrąg. wieksza ilość segmentów to ładniesze kółko ale gorsza wydajność symulatora - tzw. kwadratura koła...

Tymczasem możemy narysować kwadrat który będzie wyglądał jak kółko ;-)

Jest to możliwe jesli zastosujemy teksturę z maską przeźroczystości, tzn obrazek w którym pewne obszary są zdefiniowane jako transparentne.
Przykładowo nie trzeba rysować okrągłej tarczy zderzaka, wystarczy na kwadrat nałozyć teksturę (obrazek) z rysunkiem koła na przeźroczystym tle:
Buffer tarcza bufora będzie wyświetlana jako okrągła.

Standardowe pliki bitmapowe (.BMP) nie posiadaja przeźroczystości, przeźroczystość tekstury w naszym symulatorze mozna uzyskać definiując kanał alpha w pliku Targa Bitmap (.TGA) albo uzywając specjalnego formatu .TEX (w tym celu plik .BMP trzeba skonwertować specjalnym programem podając kolor przeźroczystości).

Ponizsze rysunki ilustrują w jaki sposób w wagonie towarowym zostaly odzwierciedlone detale takie jak ściągi podwozia, prowadniki maźnic, resory, klocki hamulcowe oraz wystające poza płaszczyznę nadwozia kątowniki. Wszzystkie te elementy zostały po prostu narysowane na niebieskim tle które potem zdefiniowałem jako przeźroczyste:
WireFrame tzw. szkielet drutowy pokazujący krawędzie wszystkich elementów,
Render wygląd modelu w oknia renderowania 3DStudio (niebieski kolor będzie przeźroczysty),
Symulator końcowy wygląd modelu w symulatorze

Do definicji tła uzyłem koloru niebieskiego aby się wyróżniał, ma to jednak te wadę, że na krawędziach kolor ten wyłazi wskutek filtracji tekstury.
Efekt ten nie jest tak widoczny w przypadku czarnego koloru przeźroczystości, ale nie jest to zbyt wygodny kolor, można więc filtrację tekstury wyłączyć w symulatorze dając jej nazwę zaczynającą sie od znaku # (hash).
Ale wtedy nie będzie rozmywania pikseli - coś za coś.

Teraz kilka uwag odnośnie zasad budowy modelu, aby mógł być poprawnie skonwertowany do pliku .T3D:

  1. należy uzywać jednostek metrycznych, długość pojazdu wraz ze zderzakami musi byc identyczna jak w pliku .chk, oś Y skierowana wzdłuż pojazdu.
  2. wszystkie obiekty muszą byc skonwertowane do Editable Mesh:
    Convert menu uzyskane po kliknięciu prawym klawiszem myszy w obiekt
  3. na jeden obiekt można nałozyć jedną teksturę, wskazane jest połączyć drobne obiekty w całość, np. wszystkie cztery burty zaznaczyć i połączyć w jeden obiekt, ogranicza to ilość plików z teksturami;
  4. musi być ustalona hierarchia obiektów, np. obiekt nadrzędny nazywa się ostoja i do niego należą sprzęgi, koła itp.:
    Hierarchy okno Shematic View otwierane ikonką SV
  5. przy definiowaniu rodzaju materiału oprócz tekstury (definiowanej jako diffuse color) należy prawidłowo zdefiniować kolory ambient, diffuse, specular, ponieważ w odróżnieniu od 3DStudio symulator bierze te kolory pod uwagę równiez gdy nałożona jest tekstura (na tej zasadzie są zrobione kolorowe lampki w kabinie mimo ze tekstura jest jedna - czarno-biała).
    Convert Edytor materiału - tu się definiuje kolory i tekstury
  6. Jesli na jednej teksturze jest kilka rysunków odnoszących się do różnych płaszczyzn (tak jak w poniższym przykładzie gdzie są rozrysowane burty, podłoga, ostoja i inne elementy wagonu), można zaznaczyć interesujący nas obiekt lub jedna z jego płaszczyzn po czym uzyć funkcji Unwrap UVW w celu prawidłowego nałożenia fragmentu tekstury:
    Unwrap okno edytora UVW - nakładanie fragmentu tekstury
  7. Aby tekstura była samoświecąca należy zaznaczyc SelfIllum (wtedy jej jasność nie będzie zależeć od oświetlenia zewnętrznego).
  8. Nie nalezy robić odbić zwierciadlanych - wskutek błedu w 3Dstudio takie tranformacje sa źle konwertowane - zamiast tego należy użyć obrotu o 180deg.
  9. Aby koła się obracały, nalezy je nazwać np. Wheel0* gdzie *=1...9, obrót będzie następował wokół osi X z szybkością zależną od średnicy podanej w pliku .chk (sprawa małych osi tocznych np. w parowozie będzie w przyszłości definiowana w pliku *.mmd).
  10. Inne podobiekty których słowa kluczowe są zarezerwowane:
  11. W celu optymalizacji modelu nalezy zdefiniować maksymalną odległość z jakiej widoczny jest dany element - w zakładce User Properties nalezy wpisać np.
    MaxDistance = 150 wtedy ten obiekt nie będzie rysowany w odległości większej niż 150m od obserwatora. Im mniejszy element tym mniejsza powinna być graniczna odległość. Mozna też zdefiniować MinDistance poniżej której obiekt też nie będzie widoczny (dzieki temu można miec np. dwie wersje wagonu - szczegółową do ogladania z bliska i pudełkowatą do oglądania z daleka).
  12. Wiele predefiniowanych obiektów ma standardowo kilka segmentów (np. płaszczyzna ma 4), co jest niepotrzebne jesli nie zamierzamy ich zniekształcać - należy wpisać 1. Moje pierwsze koło było zrobione ze standardowego walca, po zrobieniu nowego bardziej optymalnego (tylko dwie sekcje) rozmiar 5cio osiowego wagonu piętrowego zmniejszył się dwukrotnie!

Na końcu zapraszam do ściagniecia omawianego przykładu modelu węglarki 9W w formacie 3dStudioMax4.
Dołączone są też tekstury ale być może trzeba zdefiniować na nowo ścieżki dostępu.
Jest to mój pierwszy i w związku z tym nie najlepiej zrobiony model, np. maźnice powinny być walcami tymczasem zdefiniowałem je jako prostopadłościan
Wystarczy zdefiniować czterościenny walec który wygląda jak prostopadłościan, ale symulator wygładzi sobie oświetlenie symulując obłą powierzchnię walca. Oczywiście dno walca będzie nadal wyglądać jak kwadrat, tak więc tę metodę można stosować raczej do słupów itp brył których końce nie są widoczne.
Przykład wielościennego walca z wygładzaniem i bez widzianego przez symulator poniżej:
Cylinder
Im mniejszy obiekt, tym mniej płaszczyzn powinno być użytych do jego rysowania.
Pamiętajmy, że duża ilość płaszczyzn to nie tylko mniejsza ilość klatek na sekunde ale i dłuższe wczytywanie pliku *t3d.

Na zakończenie eksport do pliku t3d.
Uruchom skrypt main.ms (menu Scripts->Run Script).
Wybierz Export T3D, wpisz nazwe pliku i gotowe.
Plik należy umieścic w katalogu katalog_symulatora/models,
chyba że jest to plik obiektu ruchomego, wtedy musi być w katalog_symulatora/dynamic/.../typoszeregpojazdu.
Na razie skrypty ucinają wszelkie ścieżki, więc defaultowo tekstury będa szukane w katalogu /textures lub w przypadku obiektu ruchomego, w katalogu /dynamic/.../typoszeregpojazdu.
Można to mienić edytując plik .t3d i dopisując odpowiednie ścieżki, np.
Map: metal/MetalFrictionPattern1.tga w pliku /dynamic/PKP/eu07/kabina-eu07a.t3d
oznacza że program wczyta teksturę z pliku textures/metal/MetalFrictionPattern1.tga.
Chodzi o to, żeby tekstury ogólnego zastosowania nie były powielane. W katalogach /dynamic/... powinny być tekstury typowe dla konkretnego pojazdu.

Z powrotem - na główną stronę

Zarezerwowane identyfikatory obiektów
Edycja Tekstur
Edycja Scenerii

Ostatnia modyfikacja: