3d studio max og OpenGL

Tags:    c++

Hey.. Hvordan gør profesionelle spilfirmaer osv. når de skal have en 3d figur (for det meste, fra 3d studio max) over i deres OpenGL kode? Kan man få et program der kan lave en max fil om til OpenGl kode?
Hilsen
Khristian...



4 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 6 karma
Sorter efter stemmer Sorter efter dato
Hey.. Hvordan gør profesionelle spilfirmaer osv. når de skal have en 3d figur (for det meste, fra 3d studio max) over i deres OpenGL kode? Kan man få et program der kan lave en max fil om til OpenGl kode?
Hilsen
Khristian...


Typisk anvender spilfirmaerne sit eget format til at beskrive objekter og sekvenser, og derfor programmerer de et program som kan konverterer 3d studio, maya eller lignende formater til deres eget format. Spilfirmaet har så en 3dmotor som kan afvikle deres egne formater.

Mvh. Thomas Lykke Petersen



Hey.. Hvordan gør profesionelle spilfirmaer osv. når de skal have en 3d figur (for det meste, fra 3d studio max) over i deres OpenGL kode? Kan man få et program der kan lave en max fil om til OpenGl kode?
Hilsen
Khristian...


Det bliver eksporteret til et format, det kan være et "offentligt" format som .3ds(3DS Max), .x(D3D) osv. eller du kan lave en eksporter til dit modelleringsprogram som skriver i dit eget format.

Du har normalt en klasse(eller flere) som så ved hjælp af standard C++ funktioner som ifstream, ofstream, fopen osv.(kan i nogle tilfælde være gemt bag klasser) til at loade filen.

Et (simpelt) eksempel på en statisk(stillestående) model fil kunne være.

106110010100100010000

Dette repræsenterer et kvadrat. Vi kan se lidt nærmere på det, formattet(som jeg lige selv har fundet på) fungerer på denne måde:
Første tal(1) er enten 1 eller 0, 1 indikerer at positionen ligger i filen. Så nu ved vi at filen indeholder position informationer.
Andet tal(0) er enten 1 eller 0, 1 indikerer at normalerne ligger i filen. Så vi ved at filen IKKE indeholder normaler. En normal indikerer den direkte vej væk fra et punkt og bruges til at regne lys ud(og ting som "culling").
Tredje tal(6) indikerer hvor mange punkter filen indeholder, den indeholder 6.
Så har vi 110010100100010000 tilbage. Dette er punkterne vi ved at hvert punkt har tre tal (til at beskrive positionen, x, y og z) og der er 6, så de næste 18 tal er punkt-informationer.
Vi kan så dele punkterne op i:
110, x=1, y=1, z = 0
010, x=0, y=1, z = 0
100, x=1, y=0, z = 0
100, x=1, y=0, z = 0
010, x=0, y=1, z = 0
000, x=0, y=0, z = 0
Vi har ikke specificeret dette i filen (det ville man skulle i en mere avanceret en), men 3 punkter repræsenter en trekant altså har vi 6/3=2 trekanter.
Trekant 1 = [1, 1, 0], [0, 1, 0], [1, 0, 0]
Trekant 2 = [1, 0, 0], [0, 1, 0], [0, 0, 0]

Dette format jeg her har vist er langtfra optimalt, et langt bedre format kunne være noget lignende dette:
Første double word er flags. Bit 1(2 forskellige værdier) indikerer om modellen er statisk(0), animeret(1).
Andet bit indikerer om vi skal "culle" med eller mod uret.
Tredje bit indikerer om vi bruger et højre eller venstre håndet koordinatsystem.
Flagsne fortsætter på denne måde, der er 32 bit, her ville også blevet specificeret om vi bruge en "index buffer" eller ren "vertex buffer", om vi har normaler, en diffus/specular farve osv.
Det næste byte(8 bit på en normal pc) indikerer hvilken version af formattet dette er, vi kunne for eksempel tilføje noget til Flags double worded senere, og man ville så se om man skulle se tage højde for disse ting ved at checke versionen.
Det næste 32 bit vil indikere hvor mange vertexes(punkter) der vil være.
De næste AntalVertexes*EnVertexStørrelse vil være vertex data, EnVertexStørrelse vil kunne regnes ud, ud fra flagsne for eksempel skal der tilføjes 3*sizeof(float) hvis vi har normaler.
Hvis vi bruger en indeks buffer( bliver specificeret i Flagsne) vil de næste 32 bit indikere hvor mange indexes vi har. Og de næste AntalIndexes*EnIndexStørrelse være index data, EnIndexStørrelse kan regnes ud fra Flagsne og er enten 16 eller 32 bit.
Herefter vil animations data komme, men det vil tage for lang tid for mig at forklare hvordan dette skal organiseres.

Jeg har skrevet lidt meget og det er nok lidt rodet hvis der er noget du ikke forstår så bare spørg.

Forresten med hensyn til 3d engines kan Ogre downloades gratis(open source) fra www.ogre3d.org, den har sit eget model format og en eksporter for 3ds max, maya og blender(mener jeg), sikker også mange flere. Ogre er dog ikke en 3d game engine, kun en 3d grafik engine og er også meget kompliceret hvis du ikke kender så meget til OOD, C++ og/eller grafik teknikker.

[Redigeret d. 22/07-05 22:34:39 af Ebnuv]



Hmm.. Er der nogen som har lagt noget lign. det ud på nettet som kan downloades, eller evt. købes?

Mvh.
Christian



Hmm.. Er der nogen som har lagt noget lign. det ud på nettet som kan downloades, eller evt. købes?

Mvh.
Christian


Tja, tag en tur på Google. Jeg er ret sikker på at der findes 3dengines som kan købes.

Mvh. Thomas Lykke Petersen



t