Autor Wątek: Wczytywanie modeli 3D z blendera do mojej gry - pytania  (Przeczytany 6394 razy)

Offline DarkPeter

  • Użytkownik

# Grudzień 03, 2011, 14:40:59
Witam,
od dłuższego czasu staram się stworzyć gierkę na własnym silniku. Kiedyś napisałem  skrypt który miał za zadanie wyświetlić w mojej grze 3D modele stworzone w blenderze.
Niestety z tym mam dosyć duży problem. Otóż problem tak naprawdę dotyczy kwestii zrozumienia tworzenia pliku OBJ (bo do takiej postaci konwertuję stworzony już projekt).
Do tej pory robiłem to tak, że pobierałem dane z pliku, wrzucałem odczytane współrzędne do tablicy i wyświetlałem wszystko jak leci jako trójkąty...
Efekt, niestety był fatalny. Co prawda dało się utworzyć sześcian, czy prosty korytarz, ale żeby cokolwiek było widać, musiałem ten model podzielić na kwadraty w blenderze (każdy kwadrat to osobny obiekt). Co gorsza przy bardziej skomplikowanych modelach wszystko wyglądało fatalnie nawet po podzieleniu tego na kwadraty.
Do czego zmierzam:
Nie proszę tutaj o gotowy kod, gdyż ja wolę mieć władzę nad całym swoim kodem. Chodzi mi o to żeby ktoś wytłumaczył mi krótko jak tworzony jest plik OBJ i jak z niego wskrzesić model, taki jakiego widzimy w blenderze :)
Pozdrawiam!

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline JasonVoorhees

  • Użytkownik
    • FotoGry

# Grudzień 04, 2011, 00:40:47
http://www.wotsit.org/list.asp?al=O - tutaj masz opis formatu, Wavefront Object files (Acrobat)

ogólnie to przy samej geometrii: vertexy, normale, tex coordy, po prostu czytasz do tablicy wierzchołków wszystkie wiersze zaczynające się od v, do tablicy normalnych od vn, to tablicy tex coordów od vt.
Na koniec patrzysz sobie na face'y (linie zaczynające się od f) np. f 1/2/3 2/3/4 5/4/3
nie pamiętam, czy indeksy są numerowane od 0, czy od 1 (sobie w razie czego przestawisz), ale ten zapis znaczy, że face składa się z trzech wierzchołków, z czego pierwszy ma pozycję z v[1], normala z vn[2] i koordynaty tekstur z vt[3] itd. analogicznie.

Jak będziesz renderował model, to po prostu po kolei każdy face rysujesz. Jak to sobie zoptymalizujesz to Twoja sprawa, ja pisałem kiedyś prosty, amatorski loader obj w C++, tutaj jest kod: http://forum.warsztat.gd/index.php?topic=15458.msg187052#msg187052
« Ostatnia zmiana: Grudzień 04, 2011, 00:49:21 wysłana przez JasonVoorhees »

Offline DarkPeter

  • Użytkownik

# Grudzień 04, 2011, 20:07:58
http://www.wotsit.org/list.asp?al=O - tutaj masz opis formatu, Wavefront Object files (Acrobat)

ogólnie to przy samej geometrii: vertexy, normale, tex coordy, po prostu czytasz do tablicy wierzchołków wszystkie wiersze zaczynające się od v, do tablicy normalnych od vn, to tablicy tex coordów od vt.
Na koniec patrzysz sobie na face'y (linie zaczynające się od f) np. f 1/2/3 2/3/4 5/4/3
nie pamiętam, czy indeksy są numerowane od 0, czy od 1 (sobie w razie czego przestawisz), ale ten zapis znaczy, że face składa się z trzech wierzchołków, z czego pierwszy ma pozycję z v[1], normala z vn[2] i koordynaty tekstur z vt[3] itd. analogicznie.

Jak będziesz renderował model, to po prostu po kolei każdy face rysujesz. Jak to sobie zoptymalizujesz to Twoja sprawa, ja pisałem kiedyś prosty, amatorski loader obj w C++, tutaj jest kod: http://forum.warsztat.gd/index.php?topic=15458.msg187052#msg187052
Być może to podstawy, jednak pozwolę sobie zadać wam pytanie co to są ten normale i fejsy?

Offline Oti

  • Użytkownik

# Grudzień 04, 2011, 20:16:43
Fejs to wielokąt, ścianka. Z fejsów są zbudowane wszystkie modele 3D. Face to standardowo trójkąt(3 wierzchołki), od czasu do czasu czworokąt(który tak czy siak trzeba przerobić na trójkąt by go wyrenderować). Natomiast normalna to 'wektor prostopadły' potrzebny do liczenia oświetlenia. W najprostszym przypadku normalna jest po prostu wektorem prostopadłym do danego face'a, ale by uzyskać lepszy efekt często liczy się je w bardziej złożony sposób, uśredniając normalne fejsów do których należy dany wierzchołek.

Czyli przykładowo:
struct VERTEX
{
     VECTOR3 pos;
     VECTOR3 normal;
     VECTOR2 texC;
};

struct FACE
{
     VERTEX vertices[3];
};

Offline DarkPeter

  • Użytkownik

# Grudzień 04, 2011, 20:23:11
Mam jeszcze jedną wątpliowść ^^
Otóż skoro face'y to trójkąty, czasem czworokąty to co w takim razie oznaczają liczby 2, 1, 5?
Cytuj
f 1/2/3 2/3/4 5/4/3
Rozumiem, że te liczby nie oznaczają ilości wierzchołków w danym wielokącie?

Offline JasonVoorhees

  • Użytkownik
    • FotoGry

# Grudzień 04, 2011, 20:27:24
Ilość takich ciągów typu 1/1/1 wskazuje ile face ma wierzchołków.
Ja akurat przykładowo dałem 3 (trójkąt), ale może być ich więcej, a nawet mniej (dla linii)

Te liczby wskazują indeksy w tablicach jak sobie już wczytasz.

Offline Oti

  • Użytkownik

# Grudzień 04, 2011, 20:29:21
Indeksy(liczone od 1, nie od 0).

indeks wierzchołka/indeks texcoorda/indeks normalnej
lub
indeks wierzchołka/indeks texcoorda
lub
indeks wierzchołka//indeks normalnej

v 1 2 3 //1
v 4 5 6 //2
v 7 8 9 //3
v 10 11 12 //4

t 0.1 0.2 //1
t 0.3 0.4 //2

n 101 102 103  //1
n 104 105 106  //2
n 107 108 109  //3
n 110 111 112  //4
n 113 114 115  //5
Byś użył googla i przeczytał parę zdań na angielskiej wikipedii to byś od razu wiedział.

Offline Avaj

  • Użytkownik

# Grudzień 04, 2011, 20:31:43
olej OBJ i wczytuj PLY (masz eksporter wbudowany w blendera).

Offline MrKaktus

  • Użytkownik

# Grudzień 06, 2011, 11:03:26
Cytuj
http://www.wotsit.org/list.asp?al=O - tutaj masz opis formatu, Wavefront Object files (Acrobat)

Zaden z Download linkow na tej stronie nie dziala (probowalem na kilku kompach, zawsze tcp_error).
Czy ktoś wie gdzie jeszcze mozna znalezc pelna specyfikacje formatu OBJ ( najlepiej 3.0 ) ?

Offline JasonVoorhees

  • Użytkownik
    • FotoGry

# Grudzień 06, 2011, 11:26:09
Ano rzeczywiście, sorry, nie sprawdzałem, jak ja pisałem odczyt obj te kilka lat temu, to działało :(
« Ostatnia zmiana: Grudzień 06, 2011, 11:28:17 wysłana przez JasonVoorhees »

Offline MrKaktus

  • Użytkownik

# Grudzień 06, 2011, 11:44:24

Offline DarkPeter

  • Użytkownik

# Grudzień 07, 2011, 18:11:14
mam jeszcze jedno pytanie:
czy w grach zwykle wczytuje się mapę jako jeden obiekt, czy też każdy budynek, drzewo itp. są osobnymi modelami które potem ustawia się na scenie?

Offline Kos

  • Użytkownik
    • kos.gd

# Grudzień 07, 2011, 18:18:06
Ogólnie to statyczną geometrię można i tak i tak.

Offline DarkPeter

  • Użytkownik

# Grudzień 07, 2011, 18:21:08
Ogólnie to statyczną geometrię można i tak i tak.
Nie ma różnic międzmy takimi rozwiązaniami? Chodzi mi tutaj o ilość klatek na sekundę :)
No bo skoro wczytam na raz całą mapę to boję się że jednak gra będzie potrzebowała troszkę więcej mocy kompa.

Offline Syriusz

  • Użytkownik

# Grudzień 07, 2011, 18:31:47
A kto powiedział że musisz wczytywać całą mapę na raz? I nie musisz też całej wyświetlać ;P Oba rozwiązania mają pewne wady i zalety jak to zwykle bywa ale wątpię by różnice były bardzo znaczące.