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
}