Grafika 3D
 
  Zarejestruj się
::  Newsy  ::  Pliki  ::  Twoje Konto  ::  Forum  ::
Menu
· Strona główna
· Forum
· Linki
· Lista u?ytkowników
· O nas...
· Pliki
· Statystyki
· Twoje Konto
Tutoriale
· API
· Matematyka
· Teoria
· Direct3D
· OpenGL
· Techniki
Kto Jest Online
Aktualnie jest 37 gość(ci) i 0 użytkownik(ów) online.

Jesteś anonimowym użytkownikiem. Możesz się zarejestrować za darmo klikając tutaj
Tutoriale - Techniki - 3D Max Exporter, czę?ć pierwsza

Witam w kolejnym, zarówno arcyciekawym jak i bardzo ważnym tutorialu. Dzisiaj mianowicie dowiemy się takich rzeczy, które bez przesady będzie można nazwać poważnymi narzędziami, które będą mogły być użyte przy budowie bardziej złożonego projektu, że o engine gry nie wspomnę. Dzisiaj żadna licząca się gra, poza nielicznymi przebłyskami geniuszu niektórych projektantów nie może się obejść bez świata 3D. Wiadomo oczywiście co to za sobą pociąga - w świecie 3D istnieją oczywiście w większości przypadków obiekty 3D. Mówiąc 3D mam na myśli obiekty w pełni zasługujące na to miano - czyli bryły bardzo ładnie zamodelowane, z super kolorowymi teksturami i wyglądające bardzo realistycznie. Zanim jednak ujrzymy to wszystko na ekranie naszego monitora przyjdzie nam przebyć dość długą i męczącą drogę. Ale wcale nie nam przyjdzie te drogę rozpocząć. Nie musze nikomu tłumaczyć, że dzisiaj sam programista gry po prostu nie jest w stanie zrobić - dobra gra to praca bardzo wielu ludzi, którzy reprezentują bardzo wiele dziedzin. Niewątpliwie, jednymi z głównych autorów sukcesu gry są graficy pracujący nad tym, czym my interesujemy się najbardziej - czyli stroną wizualną gry. To oni wymyślają jak mają wyglądać postacie, projektują modele, tekstury, często animują bohaterów gry. Narzędzia ich pracy często nas, programistów przyprawiają o gęsią skórkę i jak widzimy takiego Photoshopa, Corela, 3Dmaxa czy Lightwave to aż zimno się robi.

Z własnego doświadczenia wiem, że często początkujący autorzy enginów zarzucają swoje dość dynamicznie rozwijające się produkcje, czasem bardzo obiecujące i doskonale przemyślane argumentując, że wszystko brzydko wygląda i nie jest to tak, jak oni by chcieli, że brakuje im grafiki albo że maja problem z modelami i geometrią. Powstające pakiety do tworzenia grafiki 3D czasu rzeczywistego z początku nie oferowały żadnego wsparcia dla nas, programistów aby taką sytuację zmienić. Mieliśmy do dyspozycji tylko metody pozwalające na rysowanie prostych trójkątów, ewentualnie jakiś prostych prymitywów w stylu kwadratów, kul i torusów. Ale wiadomo, że na dłuższą metę taki świat nam nie wystarczy, bo chciałoby się mieć coś , co bardziej nam przypomina świat nas otaczający.

Graficy, z którymi często przyjdzie nam współpracować powiedzą - nie ma problemu, my zaprojektujemy wszystko co chcecie. Tylko, że powstanie tutaj problem - świat przez nich stworzony będzie istniał tylko w postaci plików zjadliwych przez ich programy do tworzenia świata. Mówię to oczywiście głównie o programach do modelowania świata 3D, takich jak 3Dstudio, 3Dmax, LightWave, Maya i wielu, wielu innych. Kiedy graficy skończą swoją pracę i przedstawią nam swoje wizje pokrywające się z naszymi oczekiwaniami wtedy stajemy przed zadaniem przeniesienia tego wszystkiego do naszych aplikacji, żeby można było sobie to pooglądać z trochę z innej perspektywy. Problem oczywiście nie jest banalny i to z kilku powodów:
  • Wiemy doskonale, że każdy program do modelowania 3D używa własnego formatu zapisu modeli,
  • Często gęsto formaty takich programów są chronione prawami autorskimi i nie można ich używać w komercyjnych produkcjach,
  • Format taki po prostu się nie nadaje do użycia, ponieważ może nie zawierać bezpośrednio interesujących nas informacji.
Pozostaje więc nam oczywista sprawa, jaką jest albo znalezienie formatu, który nam w zupełności odpowiada i spełnia wszystkie założone przez nas warunki lub opracowanie własnego takiego formatu i napisanie dla konkretnego programu exportera takich plików. Pamiętajmy, że w kwestii oprawy graficznej nie jesteśmy zdani na siebie a właściwie to jesteśmy zależni od grafików - to oni decydują jakiego programu używają i w jaki sposób pracują. Dzisiaj na rynku istnieje obok siebie wiele programów do modelowania i animacji - są lepsze lub gorsze, a największe toczą pomiędzy sobą bardzo ostra rywalizacje. Nie da się ukryć także faktu, że Ci najwięksi imają się rożnych sposobów na przyciągnięcie potencjalnych klientów. Jakiś czas temu stało się bardzo modne takie pisanie programów, żeby była możliwa bardzo łatwa ich rozbudowa, ale w sposób taki, jaki życzy sobie tego użytkownik. Powstały więc tzw. SDK, czyli Software Developments Kids - coś w stylu DirectX SDK właśnie - czym to jest powinniśmy doskonale wiedzieć. Takie zestawy bibliotek zawierają wszystko co jest potrzebne aby mieć możliwość napisania dodatku do programu, który po jego załadowaniu automatycznie rozpozna typ rozszerzenia i odpowiednio zareaguje na wykorzystanie w programie tegoż właśnie rozszerzenia. Ponieważ możliwości dzisiejszych programów do modelowania i animacji mogą przyprawić o ból głowy, więc i możliwości różnorakich rozszerzeń są też przeogromne. Można pisać moduły renderujące, wspomagające modelowanie czy teksturowanie obiektów. Nas jednak najbardziej będzie interesować tematyka tzw. Exporterów i importerów modeli - czy w skrócie mówiąc konwerterów plików używanych przez nas najnowszy engine tak abym była możliwość głównie eksportowania z programu do modelowania do naszego własnego. Takie możliwości na pewno oferują dzisiaj najwięksi i najpopularniejsi - czyli 3Dmax, LighWave, Maya, XSI i kilka innych - bo każdy zdaje sobie sprawę, że bez tego konkurencja go wyprzedzi. Dla nas użytkowników jest to jak najbardziej wskazane i nic tylko się cieszyć :).

Niektórzy pewnie mnie ukamienują za to stwierdzenie, ale z wieloletnich doświadczeń i obserwacji wynika, że obecnie największą popularność w Polsce wykazuje osławiony już 3Dmax, którego protoplasta jest chyba jeszcze sławniejszy 3Dstudio. Program należy do ścisłej czołówki, jeśli chodzi o modelery i animacje i ma tyle samo zaciekłych zwolenników co i wrogów. Uzbrojony w cale tony dodatkowych modułów rozszerzających nazywanych pluginami staje się naprawdę potężnym narzędziem dla grafika, który potrafi wyczarować z niego prawdziwe cudeńka. Dzisiaj więc nauczymy się, jak pisać pluginy eksportujące z 3Dmax-a.

Zanim przejdziemy do konkretów parę słów o samym Maxie. Ci co widzieli to wiedza jak wygląda i co potrafi więc na jego interfejsie nie będę się skupiał. Na jedną rzecz jednak trzeba zwrócić uwagę - tzw. stos modyfikacji. 3DMax charakteryzuje się tym, że na danym obiekcie, nawet bardzo prymitywnym, można przeprowadzić szereg rożnych operacji, zwanych modyfikatorami, które mogą diametralnie wpłynąć na wygląd całego obiektu i zmienić go zupełnie. Dlaczego o tym pisze? Otóż - Max ma jedną, ale bardzo denerwującą wadę - format jego plików. Jest tak skonstruowany, że bez udziału samego 3Dmax-a jego odczytanie i odtworzenie jest praktycznie niemożliwe - po prostu się nie nadaje do użycia. Nawet spopularyzowane ostatnio przeglądarki plików 3D nie radzą sobie z tak podstawowa rzeczą. Dzieje się tak dlatego, ponieważ 3Dmax zapisując plik z modelem zapisuje tylko jego podstawową geometrię oraz wszystkie modyfikatory do niej zastosowane wraz z ich parametrami. Ponieważ zewnętrzny program odczytujący taki plik nie ma pojęcia jak interpretować takie właśnie parametry po prostu się zgubi i nie będzie wiedział co z tym zrobić - do ich odczytu będą potrzebne funkcje modyfikatorów z 3DMaxa. Dlatego nie zdziwcie się, że nieraz po eksporcie nie zobaczycie tego, co byście chcieli tak naprawdę - trzeba wziąć pod uwagę mnóstwo rzeczy i sporo się nakombinować zanim z takiego pliku wyciągnie się co trzeba. Podejście takie ma swoje zalety i wady oczywiście. Zaleta jest niewątpliwe taka, że zawsze można wrócić do pewnego etapu pracy nad modelem (modyfikatora na stosie) i cos tam zmienić jeśli nam się nie podobało, można zamieniać je miejscami i otrzymywać rożne ciekawe efekty. Wada to oczywiście niemożliwość wykorzystania takiego pliku w naszym engine. Wyjściem jest więc opracowanie własnego formatu, napisanie do 3Dmaxa odpowiedniego plugina typu exporter, skopiowanie go do katalogu 3Dmaxa i próba wyeksportowania takiej geometrii. Aby tego dokonać potrzebne będzie nam oczywiście kilka rzeczy:
  • Na pewno jakiś kompilator języka C++ (max posługuje się klasami, więc czyste C w tym momencie odpada), całkiem dobrym wyborem może być np. VisualC++ z firmy Microsfot, którego 3Dmax darzy szczególną sympatią ;)
  • Sam program 3Dmax, bez którego oczywiście nie będziemy w stanie uruchomić naszego plugina,
  • 3Dmax SDK - czyli biblioteka służąca do pisania różnorakich rozszerzeń do 3DMx-a. Jest ona dostarczana wraz z płytami zawierającymi program.
Pierwsze co należy zrobić (jeśli mamy już zainstalowany kompilator) to zainstalować samego 3Dmaxa i wraz z nim SDK. W opcjach instalacji na pewno będzie do wyboru, więc żeby potem nie kombinować więc lepiej zrobić to od razu. Potem oczywiście istnieje możliwość doinstalowania odpowiednich rzeczy.

// wtrące tu swoje 3 grosze - Domino
Chciałem przy okazji powiedzieć, żebyście uważali przy używaniu AppWizarda i ustalaniu wszystkich ścieżek dostępu. Max ma jakąś dziwną wadę (przynajmniej wersja 4.2) i jeśli macie Max'a zainstalowanego w katalogu np. ../3D Studio MAX to niestety, ale nie będzie się wam chciał skompilować plug-in. Nie wiem czemu, ale jeśli podajecie ścieżkę dla MaxSDK to nigdzie po drodze nie mogą wystąpić katalogi ze spacją (to samo tyczy się ścieżki w której ma zostać umieszczony plug-in :). Najlepiej jak jest cos w stylu ../Programy/3dstudioMAX/. Inaczej możecie się bardzo zdenerwować na początku, kiedy się okaże, że kompilator trąbi, że mu brakuje np. Studio.obj (ja miałem Max'a w katalogu "3D Studio MAX" - kompilator potraktował 3D jako katalog, a resztę to chyba jako pliki :).
Druga sprawa na ktora chcialem zwrócić uwagę, to możliwość pojawienia się (występuje tylko u niektórych) komunikatu o błędzie linkera, który wygląda mniej więcej tak:
error LNK2001: unresolved external symbol "public: virtual char * __thiscall ClassDesc::GetRsrcString(long)" (?GetRsrcString@ClassDesc@@UAEPADJ@Z)
To kolejny bląd SDK maxa. Nie wiem czy metoda owa jest w ogóle używana gdziekolwiek w maxie. Wygląda na to że nie, ponieważ można problem rozwiązać w sposób bardzo prosty, a mianowicie w klasie która dziedziczy z ClassDesc2 dopisać sobie metode char* GetRsrcString(long) { return NULL; }; co skutecznie eliminuje problem - nie występują rzadne skutku uboczne w postaci dziwnych błędów w działaniu maxa :).
// reszta należy już do robala

Następnie w opcjach kompilatora (to już zależnie od każdego) należy dodać mu ścieżki do katalogów zawierających pliki nagłówkowe i biblioteki exportowe w SDK 3DMax-a. Po tej czynności nasz kompilator będzie gotów zmierzyć się z kodem źródłowym naszego pierwszego plugina i stworzyć go na nasze potrzeby.

Weźmy dla przykładu konfigurację naszego ulubionego kompilatora, czyli VC6.0 firmy ulubionej ;). Przebiega ona zupełnie podobnie do instalacji DirectX SDK, które jak pamiętamy, wymagało podobnych zabiegów. Poniższe obrazki pokazują znaną nam już poniekąd procedurę dodawania odpowiednich ścieżek w opcjach kompilatora - analogicznie dla plików nagłówkowych jak i bibliotek lib. Dla oszczędności miejsca przedtsawie jeden rysunek, ale wszyscy powinni doskonale wiedzieć o co chodzi.


Ponieważ jestem w posiadaniu wersji 5.0 3DMax-a więc nieuniknione jest, że posługiwać się będziemy właśnie taka a nie inna wersja programu. Jeśli ktoś takowej nie posiada a ma starsze niech nie rozpacza. Mogą oczywiście wystapić drobne rozbiezności, ale ogólnie powinno być to samo. Pisze o tym dlatego, ponieważ nie wiem czy w poprzednich wersjach 3DMax-a wystepuje pewne udogodnienie, które nam, programistom powinno znacznie ulatwic prace. Otoz w katalogu, gdzie zainstalowany zostal 3DMax i jego SDK, czyli standardowo powinno to być coś na kształt: dysk:\ 3dsmax5\maxsdk\ znajdziemy podkatalog o nazwie Help a w nim cos, co posiadaczy VC powinno szczególnie ucieszyć. W spakowanym pliku o nazwie sdkapwz.zip znajdziemy.. gotowego wizarda dla VC, który będzie nam generował podstawowy kod aplikacji plugina dla Max-a! Tak więc ponad połowa roboty po prostu nam odpadnie, bo tak naprawdę plugin wygeneruje się sam - to dlatego wspominałem, że 3DMax darzy specjalnymi względami właśnie VC ;). Nie zwlekając kopiujemy więc plik o nazwie sdkapwz.awx do katalogu, gdzie VC przechowuje dodatkowe wizardy (procz swoich standardowych oczywiście), czyli coś na kształt "dysk:\ Microsoft Visual Studio\Common\MSDev98\Template\". Po uruchomieniu VC oczywiście ujrzymy w okienku, w którym będziemy tworzyć nowy projekt dodatkową ikonę, widać ją na zamieszczonym poniżej rysunku:


No i cóż - wielkiej filozofii już teraz nie ma - po zaznaczeniu tego typu projektu jako aktywnego możemyy wyruszyć do tworzenia pluginów do 3DMax-a, jakie nam się tylko zamarzą. Wpisujemy więc nazwę naszego nowego plugina - tutaj należy zadbać aby była ona w miarę oryginalna, bo potem się może okazać, że na przykład 3DMax posiada już plugin o takiej nazwie i będzie problem. Wymyślamy więc nazwę iście oryginalną i idziemy dalej. Po wciśnięciu OK. dostaniemy pierwsze okienko naszego wizarda, w którym będziemy mogli wybrać rodzaj tworzonego dla 3DMax-a plugina:


Ponieważ nam zależy na eksporcie, więc zaznaczamy pokazaną na rysunku opcję kreowania plugina służącego do eksportu plików i klikamy klawisz "Next". W tym miejscu warto zwrócić uwagę jak przebogate możliwości rozbudowy ma 3DMax - wystarczy spojrzeć na listę dostępnych rodzajów pluginów. Jeśli posiądziemy wiedzę pisania jednych pluginów, to nic już nas nie powstrzyma przed rozbudowaniem Max-a o drugie tyle narzędzi, które posiada aktualnie ;).


Tutaj dostajemy okienko, które ze spokojnym sumieniem na razie możemy sobie pominąć. Dla naszej nauki nie będzie ono nam kategorycznie potrzebne, choć może warto tutaj kilka słów. Po pierwsze - w pierwszym okienku możemy sobie wpisać nazwę naszej klasy, którą będziemy się posługiwać w pluginie aby osiągnąć zamierzone efekty - jak zwykle nazwa zależy od naszej kreatywności. Następnej pozycji nie możemy zmienić - to klasa po której dziedziczymy - zawiera ona podstawowe metody, które umożliwią eksport danych z 3DMax-a. Dwa ostatnie pola mogą posłużyć do opisu naszego plugina, który potem będzie dostępny w opcjach lub do umieszczenia plugina w odpowiednich paskach narzędziowych. Nam na razie nie jest to potrzebne do szczęscia, więc klikamy bez zastanowienia klawisz "Next".


Ostatnim krokiem w tworzeniu szkieletu naszego plugina będzie określenie gdzie znajduje się ścieżka do zainstalowanego SDK z 3DMaxa-a oraz w jakim katalogu ma być umieszczony nasz plugin. Jak widzicie ja ustawiłem wszystko, tak aby sprawiać Max-owi jak najmniej problemów - co do ścieżki do SDK to raczej wielkiego wyboru nie ma, natomiast pluginy możemy sobie posiać, gdzie nam się żywnie podoba. Ale lepiej nie robić wielkiego bałaganu, żeby potem nie szukać w gąszczu plików co i jak.

Po wciśnięciu klawisza "Finish" dostaniemy informację co nam się wygeneruje (jakie pliki), coś zamiga, zaszaleje na dysku i w edytorze VC otworzą nam się pliki zawierające podstawowy kod żródłowy naszego plugina. Jeśli wszystko dobrze poustawialiśmy to powinno nam się wszystko ładnie skompilować i utworzy nam się plik wynikowy o rozszerzeniu *.dle w katalogu, który podaliśmy w ostatnim okienku jako docelowy dla naszego plugina.

Tak, wiem - teraz pytanie co dalej? Najpierw spróbujmy uruchomić 3DMax-a i sprawdzić co nam się zrobiło... Tutaj drogi mamy dwie - odpalamy max-a z ikonki na pulpicie i czekamy aż się wszystko załaduje. Ale znając życie na pewno nie zdołamy za pierwszym razem napisać wszystkiego dobrze, więc musi istnieć jakiś sposób aby móc ten nasz wynalazek jakoś debugować. Można oczywiście sobie radzić starym harcerskim sposobem wpisując dane do plików i w momencie wyłożenia się programu sprawdzać jakie wartości miała dana zmienna, ale my nie będziemy się posługiwać metodami rodem z epoki kamienia łupanego. Mamy przecież wspaniałe narzędzie, jakim jest VC, więc ono nam wybitnie w tym pomoże. Otóż, jeśli się dobrze przyjrzeć to pluginy 3DMax-a są tak naprawdę po prostu zwykłymi bibliotekami dll, które program dynamicznie ładuje i których używa w sobie wiadomy tylko sposób. Tak więc posłużymy się doskonałym mechanizmem dostępnym w VC do debugowania bibliotek dll.


Otwieraqmy właściwości projektu (Alt+F7) lub szukamy opcji w menu ;), następnie udajemy się do zakładki o nazwie "Debug" i klikamy klawisz oznaczony strzałką w prawo, obok okna oznaczonego jako "Executable for debug session". Po prostu my wybierzemy sobie tutaj, jaki program ma być uruchamiany, kiedy my wyrazimy chęć uruchomienia naszej biblioteki poprzez naciśnięcie odpowiedniej kombinacji (F5, Ctrl+F5 itp.). Doskonale wiemy, że samej biblioteki uruchomić nie można, więc coś musi jej pomóc - u nas będzie oczywiście to sam 3DMax. Efekt będzie tego taki, że kiedy my uruchomimy niby naszą bibliotekę to tak naprawdę załaduje się do pamięci 3DMax i on będzie korzystał (jeśli będzie potrafił) z naszej biblioteki a my będziemy mogli wstawiać w naszym programie breakpointy i sprawdzać co i jak... sami przyznacie, że to bardziej cywilizowany sposób, prawda? ;-).

No ale... skoro już ustawiliśmy wszystko, to spróbujmy - co się stanie, jeśli wciśniemy na przykład klawisz F5... Na sam początek dostaniemy informację od VC, że program, którego używamy do załadowania bliblioteki nie posiada informacji dla debuggera - całkiem logiczne w sumie, no bo żadna firma na świecie nie daje użytkownikowi do ręki programu w wersji Debug. Nie przejmujmy się więc tym i ruszajmy dalej... klikamy OK. i czekamy. No i zgodnie z naszymi oczekiwaniami ładuje się nam 3DMax - jak do tej pory więc całkiem nieźle. Teraz pasuje sprawdzić co naszym pluginem - 3DMax jako dosyć inteligentny program powinien załadować naszego plugina i mieć o nim jakieś informacje - oczywiście jeśli umieściliśmy wykonywalny plik w katalogu, który podlega standardowo przeszukiwaniu pluginów przy starcie maxa - ten, który ustawiliśmy my niewątpliwie takim jest. Co zatem zrobić, żeby dowiedzieć się czy nasz plugin istnieje ijest załadowany?

Idzeimy do głównego menu Max-a, otwieramy opcję "Customize" i odpalamy "Plug-in Manager". Ukazuje nam się okienko z listą wszystkich załadowanych pluginów:


I jak widać na załączonym obrazku - jest cały i zdrowy. Załadowany, rozmiar może trochę duży jak na nic nie robiącego jak na razie plugina, no ale to tylko wersja debug. Tak więc Max naszego plugina zobaczył i ma prawo on działać. A jak odpalić nasz twór? Skoro wiemy, że ma być to plugin eksportujący geometrię, więc trzeba gdzieś szukać możliwości w okolicach obsługi plików. Otwieramy więc menu "File" i widzimy nader interesującą opcję o nazwie "Export" :). Odpalamy i widzimy...


No i tutaj także się znalazł - patrzcie no jaki ten Max mądry ;). Na razie nie wygląda to zbyt okazale, no ale początki są zawsze trudne. Sprawdźmy zatem, co uda nam się wyeksportować. Wybieramy ten nasz nie wiadomo co, wciskamy "Save" i dostajemy na ekranie:


Jest to okienko wstawione przez twórców plugina. Pełni ono w zasadzie dwie role - po pierwsze stanowi niejako bazę wypadową do tego, abyśmy mogli na jego podstawie zbudować ewentualne możliwości obudowania naszego plugina eksportowego w dodatkowe opcje a po drugie, jako skutek uboczny daje nam w kodzie od razu miejsce, od którego powinniśmy zacząć poszukiwania co do reszty wstawianego kodu. Bowiem wiadomo, że nie w każdym miejscu możemy zacząć nasze eksportowe szaleństwo.

Po zamknięciu tego okna 3DMax poinformuje nasz jeszcze, że nasz plugin nie zadzaiał zbyt dobrze, ale to wszystko przez to, że pewne funkcje nie zwracają odpowiednich wartości no i nie ma zupełnie kodu, który cokolwiek by robił z danymi obecnymi w Maxie.
No ale rozmiary tego tutka i tak są rekordowe z tego co widzę, więc aby nie nadwyrężać naszych umysłów za bardzo na razie zakończymy ten odcinek. W następnym omówimy sobie już dokładnie cały proces eksportu danych geometrii z 3DMax-a do plików w naszym formacie oraz dowiemy się jak obudować plugin w przydatniejsze rzeczy.

©Copyright by Robal   



Tutoriale - Techniki
Nasze newsy s� w RSS: backend.php
PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Tworzenie strony: 0.05 sekund

:: Layout strony został stworzony przez www.nukemods.com w oparciu o styl phpbb2 Helius, którego autorem jest Cyberalien ::