Základy 3D grafiky
13. Datová reprezentace modelu
Ukažme si nyní jednu z mnoha možností, jak 3D těleso uložit datově. V této kapitole se zaměříme na to, jak uložit základní geometrii.
Jedna z často používaných metod je využití dvou tabulek (matic):
- Tabulka vrcholů
- Tabulka spojnic vrcholů (plošek)
Podívejme se na obrázek:

Obr. 1 Datová reprezentace vrcholů krychle
Ukážeme si, jak tyto dvě tabulky budou vypadat pro jednoduchý model kvádru. Nejprve si ukažme tabulku vrcholů, která obsahuje vždy indexové číslo vrcholu a k němu pak jeho souřadnice v prostoru:

Podívejte se na další obrázek:

Obr. 2 Trojúhelníkové plošky
Druhá tabulka, kterou potřebujeme pro datovou reprezentaci je tabulka plošek (faces). Ta určuje, který vrchol s kterým se má spojit, aby vznikly trojúhelníky (na obrázku vidíme graficky plošky 2,3 a 4 z této tabulky):

Můžete porovnat s autentickým souborem ve formátu ASCII Scene, v němž je datově uložen kvádr z příkladu. Výpis tohoto souboru je na konci této kapitoly.
Samozřejmě existuje celá řada dalších možností datové reprezentace, jako je například pomocí vrcholů a normál:

Obr. 3 Reprezentace pomocí vrcholů a normál
Výpis souboru Kostka.ase:
*3DSMAX_ASCIIEXPORT 200
*COMMENT "AsciiExport Version 2,00 - Thu Jan 27 17:09:46 2011"
*SCENE {
*SCENE_FILENAME ""
*SCENE_FIRSTFRAME 0
*SCENE_LASTFRAME 100
*SCENE_FRAMESPEED 30
*SCENE_TICKSPERFRAME 160
*SCENE_BACKGROUND_STATIC 0.0000 0.0000 0.0000
*SCENE_AMBIENT_STATIC 0.0000 0.0000 0.0000
}
*GEOMOBJECT {
*NODE_NAME "Box01"
*NODE_TM {
*NODE_NAME "Box01"
*INHERIT_POS 0 0 0
*INHERIT_ROT 0 0 0
*INHERIT_SCL 0 0 0
*TM_ROW0 1.0000 0.0000 0.0000
*TM_ROW1 0.0000 1.0000 0.0000
*TM_ROW2 0.0000 0.0000 1.0000
*TM_ROW3 10.0000 15.0000 0.0000
*TM_POS 10.0000 15.0000 0.0000
*TM_ROTAXIS 0.0000 0.0000 0.0000
*TM_ROTANGLE 0.0000
*TM_SCALE 1.0000 1.0000 1.0000
*TM_SCALEAXIS 0.0000 0.0000 0.0000
*TM_SCALEAXISANG 0.0000
}
*MESH {
*TIMEVALUE 0
*MESH_NUMVERTEX 8
*MESH_NUMFACES 12
*MESH_VERTEX_LIST {
*MESH_VERTEX 0 0.0000 0.0000 0.0000
*MESH_VERTEX 1 20.0000 0.0000 0.0000
*MESH_VERTEX 2 0.0000 30.0000 0.0000
*MESH_VERTEX 3 20.0000 30.0000 0.0000
*MESH_VERTEX 4 0.0000 0.0000 50.0000
*MESH_VERTEX 5 20.0000 0.0000 50.0000
*MESH_VERTEX 6 0.0000 30.0000 50.0000
*MESH_VERTEX 7 20.0000 30.0000 50.0000
}
*MESH_FACE_LIST {
*MESH_FACE 0: A: 0 B: 2 C: 3 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 2 *MESH_MTLID 1
*MESH_FACE 1: A: 3 B: 1 C: 0 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 2 *MESH_MTLID 1
*MESH_FACE 2: A: 4 B: 5 C: 7 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 3 *MESH_MTLID 0
*MESH_FACE 3: A: 7 B: 6 C: 4 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 3 *MESH_MTLID 0
*MESH_FACE 4: A: 0 B: 1 C: 5 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 4 *MESH_MTLID 4
*MESH_FACE 5: A: 5 B: 4 C: 0 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 4 *MESH_MTLID 4
*MESH_FACE 6: A: 1 B: 3 C: 7 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 5 *MESH_MTLID 3
*MESH_FACE 7: A: 7 B: 5 C: 1 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 5 *MESH_MTLID 3
*MESH_FACE 8: A: 3 B: 2 C: 6 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 6 *MESH_MTLID 5
*MESH_FACE 9: A: 6 B: 7 C: 3 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 6 *MESH_MTLID 5
*MESH_FACE 10: A: 2 B: 0 C: 4 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 7 *MESH_MTLID 2
*MESH_FACE 11: A: 4 B: 6 C: 2 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 7 *MESH_MTLID 2
}
}
*PROP_MOTIONBLUR 0
*PROP_CASTSHADOW 1
*PROP_RECVSHADOW 1
}