The Saphira's Wiki
Advertisement

Exportation[]

Blender offre la possibilité d’exporter en COLLADA.

Créez une nouvelle scéne :

Blender export1

Nouvelle scène


Exportons maintenant le cube en COLLADA : Sélectionnez le cube puis allez dans le menu File/Export/COLLADA 1.4(.dae) Dans le champ Export file, choisissez le fichier a créer (dans la suite du tutoriel cube.dae).

Blender export2

Export file


Enfin, réglez les options comme ceci :

Blender export3

Options


Puis cliquez sur Export ; normalement, Blender a crée un fichier cube.dae.

Introduction au COLLADA[]

Le contenu de cube.dae devrait être similaire :

 <?xml version="1.0" encoding="utf-8"?>
 <COLLADA version="1.4.0" xmlns="http://www.collada.org/2005/11/COLLADASchema">
 	<asset>
 		<contributor>
 			<author>Illusoft Collada 1.4.0 plugin for Blender - http://colladablender.illusoft.com</author>
 			<authoring_tool>Blender v:248 - Illusoft Collada Exporter v:0.3.160</authoring_tool>
 			
 			<copyright></copyright>
 			<source_data>file://</source_data>
 		</contributor>
 		<created>2009-09-22T23:19:04.414509</created>
 		<modified>2009-09-22T23:19:04.414554</modified>
 		<unit meter="0.01" name="centimeter"/>
 		<up_axis>Z_UP</up_axis>
 	</asset>
 	<library_geometries>
 		<geometry id="Cube-Geometry" name="Cube-Geometry">
 			<mesh>
  					<float_array count="24" id="Cube-Geometry-Position-array">1.00000 1.00000 -1.00000 1.00000 -1.00000 -1.00000 -1.00000 -1.00000 -1.00000 -1.00000 1.00000 -1.00000 1.00000 1.00000 1.00000 1.00000 -1.00000 1.00000 -1.00000 -1.00000 1.00000 -1.00000 1.00000 1.00000</float_array>
  					<technique_common>
  						<accessor count="8" source="#Cube-Geometry-Position-array" stride="3">
  							<param type="float" name="X"></param>
  							<param type="float" name="Y"></param>
  							<param type="float" name="Z"></param>
  						</accessor>
  					</technique_common>
  					<float_array count="18" id="Cube-Geometry-Normals-array">0.00000 0.00000 -1.00000 0.00000 -0.00000 1.00000 1.00000 -0.00000 0.00000 -0.00000 -1.00000 -0.00000 -1.00000 0.00000 -0.00000 0.00000 1.00000 0.00000</float_array>
  					<technique_common>
  						<accessor count="6" source="#Cube-Geometry-Normals-array" stride="3">
  							<param type="float" name="X"></param>
  							<param type="float" name="Y"></param>
  							<param type="float" name="Z"></param>
  						</accessor>
  					</technique_common>
 				<vertices id="Cube-Geometry-Vertex">
 					<input semantic="POSITION" source="#Cube-Geometry-Position"/>
 				</vertices>
 				<triangles count="12">
 					<input offset="0" semantic="VERTEX" source="#Cube-Geometry-Vertex"/>
 					<input offset="1" semantic="NORMAL" source="#Cube-Geometry-Normals"/>

<p>0 0 1 0 2 0 2 0 3 0 0 0 4 1 7 1 6 1 6 1 5 1 4 1 0 2 4 2 5 2 5 2 1 2 0 2 1 3 5 3 6 3 6 3 2 3 1 3 2 4 6 4 7 4 7 4 3 4 2 4 4 5 0 5 3 5 3 5 7 5 4 5

 				</triangles>
 			</mesh>
 		</geometry>
 	</library_geometries>
 	<library_visual_scenes>
 		<visual_scene id="Scene" name="Scene">
 			<node layer="L1" id="Cube" name="Cube">
 				<translate sid="translate">0.00000 0.00000 0.00000</translate>
 				<rotate sid="rotateZ">0 0 1 0.00000</rotate>
 				<rotate sid="rotateY">0 1 0 -0.00000</rotate>
 				<rotate sid="rotateX">1 0 0 0.00000</rotate>
 				<scale sid="scale">1.00000 1.00000 1.00000</scale>
 				<instance_geometry url="#Cube-Geometry"/>
 			</node>
 		</visual_scene>
 	</library_visual_scenes>
 	<library_physics_materials>
 		<physics_material id="Cube-PhysicsMaterial" name="Cube-PhysicsMaterial">
 			<technique_common>
 				<dynamic_friction>0.5</dynamic_friction>
 				<restitution>0.0</restitution>
 				<static_friction>0.5</static_friction>
 			</technique_common>
 		</physics_material>
 	</library_physics_materials>
 	<library_physics_models>
 		<physics_model id="Scene-PhysicsModel" name="Scene-PhysicsModel">
 			<rigid_body name="Cube-RigidBody" sid="Cube-RigidBody">
 				<technique_common>
 					<dynamic>false</dynamic>
 					<mass>0</mass>
 					<instance_physics_material url="#Cube-PhysicsMaterial"/>
 					<shape>
 						<instance_geometry url="#Cube-Geometry"/>
 					</shape>
 				</technique_common>
 			</rigid_body>
 		</physics_model>
 	</library_physics_models>
 	<library_physics_scenes>
 		<physics_scene id="Scene-Physics" name="Scene-Physics">
 			<instance_physics_model url="#Scene-PhysicsModel">
 				<instance_rigid_body body="Cube-RigidBody" target="#Cube"/>
 			</instance_physics_model>
 		</physics_scene>
 	</library_physics_scenes>
 	<scene>
 		<instance_physics_scene url="#Scene-Physics"/>
 		<instance_visual_scene url="#Scene"/>
 	</scene>
 </COLLADA>

Il est important de comprendre comment est constitué un fichier COLLADA car l’on peut avoir à faire des modifications directement dedans. Nous allons nous efforcer dans le futur de mettre en œuvre des outils qui évite les manipulations mais celle-ci sont actuellement nécessaire pour traité le fichier.

On constate d’abord qu’un fichier COLLADA est un fichier XML d’élément racine COLLADA. Le fichier est divisé en 7 grandes parties :

  • asset
  • library_geometries
  • library_visual_scenes
  • library_physics_models
  • library_physics_scenes
  • scene
  • asset contient des informations générales et qualitatives sur le document comme le nom de l’auteur …
  • library_geometries est une banque de modèle. Ici, elle ne contient que notre cube.
  • library_visual_scenes décrit la scène. Ici, la position et l’orientation du cube. Cette partie nous intéresse peu car seul le cube nous intéresse réellement. Il y a cependant un élément d’intérêt dedans : instance_geometry que nous verrons plus loin.
  • library_physics_models, library_physics_scenes et scene ne nous intéresse pas du tout et peuvent même être supprimer du fichier.

Nous nous intéresserons dans la suite qu’à la partie library_geometries. Il s’agit ici d’un présentation plus informelle que rigoureuse ; l’objectif étant d’avoir une vague idée des possibilités et de l’organisation d’un fichier COlLADA. D’autres tutoriel aborderont les autres parties d’un fichier COLLADA.

<library_geometries>[]

L’élément library_geometries est une collection de modèles. Examinons cette partie de plus près dans cube.dae :

<library_geometries>
	<geometry id="Cube-Geometry" name="Cube-Geometry">
		<mesh>
 				<float_array count="24" id="Cube-Geometry-Position-array">1.00000 1.00000 -1.00000 1.00000 -1.00000 -1.00000 -1.00000 -1.00000 -1.00000 -1.00000 1.00000 -1.00000 1.00000 1.00000 1.00000 1.00000 -1.00000 1.00000 -1.00000 -1.00000 1.00000 -1.00000 1.00000 1.00000</float_array>
 				<technique_common>
 					<accessor count="8" source="#Cube-Geometry-Position-array" stride="3">
 						<param type="float" name="X"></param>
 						<param type="float" name="Y"></param>
 						<param type="float" name="Z"></param>
 					</accessor>
 				</technique_common>
 				<float_array count="18" id="Cube-Geometry-Normals-array">0.00000 0.00000 -1.00000 0.00000 -0.00000 1.00000 1.00000 -0.00000 0.00000 -0.00000 -1.00000 -0.00000 -1.00000 0.00000 -0.00000 0.00000 1.00000 0.00000</float_array>
 				<technique_common>
 					<accessor count="6" source="#Cube-Geometry-Normals-array" stride="3">
 						<param type="float" name="X"></param>
 						<param type="float" name="Y"></param>
 						<param type="float" name="Z"></param>
 					</accessor>
 				</technique_common>
			<vertices id="Cube-Geometry-Vertex">
				<input semantic="POSITION" source="#Cube-Geometry-Position"/>
			</vertices>
			<triangles count="12">
				<input offset="0" semantic="VERTEX" source="#Cube-Geometry-Vertex"/>
				<input offset="1" semantic="NORMAL" source="#Cube-Geometry-Normals"/>

<p>0 0 1 0 2 0 2 0 3 0 0 0 4 1 7 1 6 1 6 1 5 1 4 1 0 2 4 2 5 2 5 2 1 2 0 2 1 3 5 3 6 3 6 3 2 3 1 3 2 4 6 4 7 4 7 4 3 4 2 4 4 5 0 5 3 5 3 5 7 5 4 5

			</triangles>
		</mesh>
	</geometry>
</library_geometries>

Chaque modèle est décrit par un élément <geometries>.


Chaque modèle est décrit par un élément <geometry>. Ici la bibliothèque ne possède qu’un seul modèle. On peut qu’un grand nombre d’élément possède un attribut « id », celui-ci est un identifiant unique qui permet de faire référence à l’objet.

L’élément <geometry> contient ici un élément <mesh>, celui-ci permet de définir un modèle à l’aide de vertices formant des polygones. Il existe d’autres méthodes pour décrire un modèle, en utilisant par exemple des courbes, cependant, seul la représentation par vertices est gérée par le moteur de jeu.

Source[]

Chaque modèle possède une ou plusieurs sources décrite par un élément <source>, chaque sources contient de l’information sur un flux particulier, celui-ci peut être assez classique (position, coordonnées de texture, couleur, normale, …) ou plus original (binormale, tangente, poids, coefficient de réflexivité, …). Certaines sources peuvent également faire référence à d’autres sources.

Points d’entrée[]

<vertices> permet de relier certains éléments de base ( notamment la position) aux sources correspondantes. <triangles> permet de décrire une liste de triangle formant le mesh. Un vertex est décrit par une série de <input> donnant les différents composantes du vertex. Ici, un vertex du groupe de triangle est formé d’un VERTEX et d’une NORMAL. La semantic VERTEX fait référence aux données décrite par <vertex>, c’est à dire ici, une position. Nous avons donc en définitive une POSITION ainsi qu’une NORMAL pour chaque vertex.

<p> est une liste d’indice. C’est ici que les choses se gâtent un peu. Chaque <input> possède un attribut « offset », celui-ci donne le repére dans la liste <p> des indices associés à <input>

Ici, pour POSITION, offset = 0, et pour NORMAL, offset = 1, cela veut dire que l’on doit lire la liste <p> comme suit :

POSITION NORMAL POSITION NORMAL POSITION NORMAL POSITION NORMAL POSITION NORMAL POSITION
<p> 0 0 1 0 2 0 2 0 3 0 0


Si l’on avait :

<triangles count="12">
	<input offset="0" semantic="VERTEX" source="#Cube-Geometry-Vertex"/>
	<input offset="1" semantic="NORMAL" source="#Cube-Geometry-Normals"/>
	<input offset="2" semantic="TEXCOORD" source="#Cube-Geometry-TexCoords"/>

<p>0 0 1 0 2 0 2 0 3 0 0 0 4 1 7 1 6 1 6 1 5 1 4 1 0 2 4 2 5 2 5 2 1 2 0 2 1 3 5 3 6 3 6 3 2 3 1 3 2 4 6 4 7 4 7 4 3 4 2 4 4 5 0 5 3 5 3 5 7 5 4 5

</triangles>

On aurait :

POSITION NORMAL TEXCOORD POSITION NORMAL TEXCOORD POSITION NORMAL TEXCOORD POSITION NORMAL
<p> 0 0 1 0 2 0 2 0 3 0 0

Et avec :

<triangles count="12">
	<input offset="0" semantic="VERTEX" source="#Cube-Geometry-Vertex"/>
	<input offset="0" semantic="NORMAL" source="#Cube-Geometry-Normals"/>

<p>0 0 1 0 2 0 2 0 3 0 0 0 4 1 7 1 6 1 6 1 5 1 4 1 0 2 4 2 5 2 5 2 1 2 0 2 1 3 5 3 6 3 6 3 2 3 1 3 2 4 6 4 7 4 7 4 3 4 2 4 4 5 0 5 3 5 3 5 7 5 4 5

</triangles>
POSITION et NORMAL POSITION et NORMAL POSITION et NORMAL POSITION et NORMAL POSITION et NORMAL POSITION et NORMAL POSITION et NORMAL POSITION et NORMAL POSITION et NORMAL POSITION et NORMAL POSITION et NORMAL
<p> 0 0 1 0 2 0 2 0 3 0 0

Le gros souci est que Blender exporte chaque entrée avec un « offset » différent, hors l’éditeur requiert que chaque <input> utilise le même offset comme dans le dernier exemple. On ne peut donc directement charger un modèle exporter depuis Blender dans l’éditeur. Il est nécessaire de transformer le modèle à l’aide d’outils appelé « conditionneurs » pour que l’éditeur puisse lire le fichier. Dans le futur, cette transformation sera réalisée automatiquement par l’éditeur mais ce n’est toujours pas le cas.

Nous avons maintenant les indices pour chaques composantes d’un vertex. À partir de ces indices, on peut donc, déterminer la postion de chaque vertex de chaque triangle dans les sources :

Triangle 1 Triangle 2
Vertices Vertex 1 Vertex 2 Vertex 3 Vertex 1 Vertex 2 Vertex 3
Composantes Position Normal Position Normal Position Normal Position Normal Position Normal Position Normal
Indices 0 0 1 0 2 0 2 0 3 0 0 0
Valeurs X 1.00000 1.00000 -1.00000 0.00000 0.00000 -1.00000 1.00000 -1.00000 -1.00000 0.00000 0.00000 -1.00000 -1.00000 -1.00000 -1.00000 0.00000 0.00000 -1.00000 -1.00000 -1.00000 -1.00000 0.00000 0.00000 -1.00000 -1.00000 -1.00000 -1.00000 0.00000 0.00000 -1.00000 1.00000 1.00000 -1.00000 0.00000 0.00000 -1.00000
Y
Z

On peut remarquer que la normale est toujours égale à {0.00000,0.00000,-1.00000} en effet, c’est deux triangles décrivent chacun un bout du même carré. Ils sont donc orienté dans la même direction.

Conclusion[]

Nous avons vu comment exporter un modèle Blender en COLLADA, nous avons ensuite examiné la façon dont un modèle est codé en COLLADA. Le prochain tutoriel présent les conditionneurs ainsi que le programme COLLADA Factory qui permettent d’effectuer des traitements sur des fichiers COLLADA.

Tutoriel suivant : Les conditionneurs et COLLADA Refinery

Voir aussi[]

Articles connexes[]

Liens externes[]

Advertisement