Gestion avancées des modèles

À force de travailler avec Ultimate 3D, vous comprendrez l'importance des objets de modèle très rapidement. À l'instar des objets primitifs, les objets de modèles sont extrêmement flexibles. Toutefois, calculer le rendu d'un objet de modèle prend plus de temps et les modèles comportants un nombre important de triangles, peuvent grandement ralentir les performances de vos jeux. C'est pourquoi ce tutorial parlera de l'ensemble des fonctionnalités qui peuvent être utilisées pour calculer le rendu des modèles plus efficacement.


Gérer des fichiers de modèles

Parfois il arrive qu'il y ait des objets dans votre jeu qui n'existent pas depuis le début de la partie, mais qui sont créés pendant celle-ci. Si ces objets sont chargés au moment où ils sont requis, cela peut donner lieu à un petit ralentissement. Les fichiers *md2 et *.an8 peuvent prendre particulièrement plus de temps à se charger. Pour cette raison, il vous est possible de précharger les modèles en utilisant, la fonction suivante:

PreloadMesh(
File,
Password
)

File
Le fichier qui contient le modèle que vous souhaitez précharger.

Password
Si File est modèle 3d Ultimate 3d encrypté, vous pouvez passer le mot de passe pour le décryptage à ce paramètre. Sinon, vous avez le choix de mettre une chaîne vide ou même rien du tout.


Une fois que vous avez appelé cette fonction pour un modèle, créer un objet de modèle à partir du résultat de celle-ci ne prendra plus aucun temps de calcul significatif, en plus. De cette façon vous pouvez éviter un lag singulièrement ennuyeux. Lorsque vous chargez un modèle avec LoadMesh() et que vous détruisez l'objet après cela, vous obtenez le même effet. Ultimate 3D ne chargera jamais le même modèle deux fois parce qu'il garde les données du modèle en mémoire, même si les objets basés sur ce modèles sont détruits. Ainsi cela évite les temps de chargement interminables d'une façon sûre. Bien sûr, ce comportement n'est pas toujours apprécié. Si vous passez d'un niveau de jeu à un autre, ce serait un gaspillage de mémoire d'avoir toujours tous les modèles du dernier niveau en mémoire. C'est pourquoi Ultimate 3D vous permet de libérer les modèles de la mémoire explicitement.

La fonction suivante libère le fichier de modèle donné de la mémoire, et retourne vrai si cela réussit. Si il y a toujours un objet basé sur ce modèle lorsque vous appellez cette fonction, cela ne libèrera pas le modèle de la mémoire, dans l'idée d'éviter d'éventuels conflits et messages d'erreur. Dans ce cas la fonction retourne faux.

ReleaseModel(
File
)

File
Le fichier de modèle que vous souhaitez libérer de la mémoire.


Exportation de fichiers *.u3d

Il s'agit là d'une tâche facile. Il n'y a qu'une seule fonction permettant l'exportation de fichiers de modèles et elle ne prend que trois paramètres. Ainsi vous avez:

Cette fonction, exporte le modèle de l'objet, par lequel elle est appellé vers le fichier donné. Le fichier de modèle Ultimate 3d comprendra une réprésentation du modèle tel qu'il était au moment où cette fonction fut appellée. Les seules informations qui ne seront pas sauvegardées seront celles qui peuvent être modifiées à l'aide de variables.

ExportToU3DFile(
OutputFile,
Password,
ExportResources
)

OutputFile
Le fichier de sortie désiré pour le modèle de l'objet. Si l'appel à cette fonction se termine avec succès, ce fichier contiendra le fichier de modèle Ultimate 3D.

Password
Le mot de passe qui doit être utilisé pour crypter le fichier modèle Ultimate 3D. Si c'est une chaîne vide ou nulle, le fichier sera exporté en clair. Plus le mot de passe est long, plus sûre sera la protection.

ExportResources
Ce paramètre peut prendre pour valeur: true ou false. Si vous lui passez false, le fichier de modèle Ultimate 3D ne contiendra pas les textures et les effets. Ceux-ci seront chargés à partir des fichiers comme d'usage. Seules les données des fichiers *.ufx seront exportées. Si vous passez true, le fichier sera un fichier de modèle ne nécessitant aucun appel complémentaire. Toutes les textures et shaders seront inclus. Notez que les modèles utilisants une texture de rendu (render target texture) en tant que texture pour un des matériaux, ne peuvent exporter leurs ressources.

Bien entendu, aucune garantie ne peut être donnée sur la sûreté du mecanisme de cryptage par mot de passe d'Ultimate 3D. Les spécialistes seront probablement capable de décrypter des modèles Ultimate 3D. Cependant, cela peut être suffisamment sécurisé pour tenir éloigné les développeurs de jeux occasionels ou les hackers. Même si je possède le code qui fait le décryptage des modèles Ultimate 3D, je serai incapable d'en décrypter un seul sans le bon mot de passe.


Créer plusieurs niveaux de détails

Les modèles peuvent être extrêmement complexes. Leur complexité est directement liée à leur nombre de triangles. De fait, les modèles possèdant un nombre réellement important de triangles réduiront les performances de votre jeu, vous obtiendrez subséquemment un framerate moins élevé. Pour cette raison il est important de toujours utiliser le moins de triangles possible. Souvent les versions comportant tous les détails des modèles n'est pas requise à distance. Si l'objet est loin de la caméra, son niveau de détail peut être diminuée. Cette technique est appellée communément LoD (Level of Detail / Niveau de détails). Ultimate 3D peut créer des niveaux de détails automatiquement et les utiliser pour des distances données. L'image suivante montre un exemple de modèle simplifié, en usant du générateur de niveau de détail intégré à Ultimate 3d.

ManageModelLOD.png

La différence entre la première et la seconde version du modèle est à peine perceptible, mais le nombre de triangles a été diminué de 40%. La troisième version du modèle a un nombre de triangles équivalent à  30% du premier modèle.
Cependant, la forme de base du modèle est toujours reconnaissable. À une très longue distance ce bas niveau de détails est parfaitement utilisable, même pour les jeux possédants des graphismes de grandes qualité. Utiliser les niveaux de détails est extrêmement simple. Vous appellez simplement une fonction dans laquelle vous dîtes à Ultimate 3d le niveau de détail que vous souhaitez utiliser et à quelle distance. Voici la syntaxe:

Cette fonction crée les niveaux de détails avec le pourcentage de triangles donné pour l'objet de modèle qui appelle la fonction et l'utilise pour une distance donnée :

CreateLODChain(
CameraDistance1, LoD1,
CameraDistance2, LoD2,
CameraDistance3, LoD3,
CameraDistance4, LoD4,
CameraDistance5, LoD5
)

CameraDistance1, CameraDistance2, ..., CameraDistance5
Les distances, de l'objet jusqu'à la caméra, où il faudra utiliser le niveau de détail. Ainsi le niveau de détail original est utilisé à des distances allant de 0 à CameraDistance1LoD1 est utilisé à des distances allant de CameraDistance1 à CameraDistance2 et ainsi de suite.

LoD1, LoD2, LoD3, LoD4, LoD5
Les niveaux de détail qui doivent être créés. C'est une valeur sous forme de pourcentage, ainsi 100 équivaut à ne pas changer le nombre de triangles du modèle, et 0 le plus petit nombre de triangle possible (usuellement 3 triangles). Les paramètres doivent se suivre de cette manière:LoD1>LoD2>=LoD3>=LoD4>=LoD5. Si une de ces valeurs est 0, cela indique à Ultimate 3D de cesser de créer des niveaux de détails additionnels.

Les niveaux de détails peuvent considérablement augmenter la vitesse de défilement (le framerate) de votre jeu, mais ils requéreront de la mémoire et du temps de calcul (pour les créer). Souvenez vous que vous ne devez pas créer de niveaux de détails pour les fichiers *.md2. En créer pour chaque frame peut prendre quelques minutes. Pour finir, voici un petit code exemple pour créer des niveaux de détail pour un modèle. Ce code doit être utilisé à la fin d'un évènement create d'un objet de modèle:

CreateLODChain(100,70,500,40,1000,20);

Création d'animations à partir de plusieurs fichiers

Si vous le souhaitez, vous pouvez créer des animations à partir de plusieurs fichiers au lieu d'utiliser des formats de fichiers supportant les squelettes d'animation (*.3ds, *.x ou *.an8) ou des fichiers *.md2. Pour faire cela, vous devrez ajouter chaque frame de l'animation en appellant les fonction suivante, après la création de l'objet avec LoadMesh():

AddFrame(
File,
Password
)

File
Le fichier qui contient la frame qui doit être ajoutée.

Password
Si File est un fichier modèle Ultimate 3D crypté, vous pouvez lui donner le mot de passe correct pour le décryptage. Sinon, vous pouvez soit lui passer une chaîne vide ou rien.

Etant donné que vous aurez besoin d'un nombre important de frames pour obtenir une animation fluide, il est possible d'activer le vertex tweening pour les animations (le vertex tweening est la technique activée par défaut pour les modèles de type *.md2). Cela ne fonctionnera que si toutes les frames ajoutées auront le même nombre de meshs, vertices et triangles. La fonction qui active le vertex tweening s'appelle EnableVertexTweening() et ne prend pas de paramètres.


Création de primitives à partir de modèles

Comme je l'ai déjà dit dans le chapitre sur les objets primitifs, ces derniers sont affichés extrêmement rapidement et efficacement. Toutes les primitives qui utilisent le même matériel et la même texture sont rendues simultanéments. De cette façon le GPU peut les traiter plus efficacement.
Durant le jeu, il arrivera souvent que vous aurez de simples objets qui seront trop complexes pour êtres représentés par les objets primitifs usuels, mais apparaissant très souvent. Ainsi, usuellement vous aurez à les créer en tant qu'objets de modèles, mais cela sera peu rapide et donc inefficace. Pour cette raison, il existe une fonction pour créer des primitives depuis des fichiers de modèles. Avant de créer les objets primitifs depuis le modèle, vous aurez à définir deux variables:

file
Le fichier qui contient le modèle dont vous voulez créer un objet primitif.

material
L'indice du matériel du modèle qui doit être utilisé pour l'objet primitif.

password (optional)
Si File se réfère à un fichier de modèle Ultimate 3D crypté, cette variable doit être une chaîne de caractères donnant le mot de passe. Sinon, vous n'aurez pas besoin de créer cette variable.

Après avoir défini ces variables vous devez appeller CreatePrimitiveFromModel() pour créer l'objet primitif. Comme pour n'importe quel autre objet primitif vous devrez mettre un appel à Step() et Destroy() dans les évènements correspondants. Les objets primitifs créés depuis des modèles ont la variable texture afin de définir la texture qui sera utilisée. Notez que seul le premier mesh du modèle sera utilisé pour créer l'objet primitif. Il est utile de faire usage de fichiers *.an8 avec cette fonction parce que lors du chargement des fichiers *.an8, Ultimate 3D crée seulement un mesh par objet.

Création de fonds customisés

Le système d'arrière-plans intégré à Ultimate 3D est sympa, mais vraiment limité. Si vous voulez des backgrounds qui changent au travers du temps, ou des backgrounds utilisant des effets spéciaux, vous ne pourrez le faire avec le système d'arrière-plans intégrés. Dans ce cas, une technique plus souple est conseillée. Les objets qui peuvent être manipulés de manière complexe sont requis. Les objets de modèle sont des objets comme ceux là. Pour cette raison, Ultimate 3D vous donne la possibilité d'utiliser des objets de modèle comme des objets de background.

Chaque objet de modèle peut être défini en mode Background. Ensuite, cet objet de modèle ne sera plus affecté par le brouillard et sera couvert par tous les autres objets. Cela fait qu'il semblera être en arrière plan. Pour éviter qu'il ne paraisse évident qu'il n'est pas réellement en arrière plan, vous devrez le faire suivre par la caméra, en redéfinissant sa position à celle de la caméra à chaque step. Il est facile d'activer le mode Background.

Cette fonction active ou déactive le mode arrière-plan pour l'objet de modèle par lequel il est appellé.

SwitchBackgroundMode(
EnableBackgroundMode
)

EnableBackgroundMode
Si ce paramètre est vrai, le mode background sera activé pour l'objet de modèle qui appelle la fonction, sinon il sera désactivé.

Dès qu'un premier objet de modèle est défini en mode background, le système d'arrière-plans intégrés est désactivé complètement. Cela paraîtra très étrange, étant  donné que tous les objets vont laisser des traînées, vous devriez donc plutôt créer votre objet de modèle de façon à ce qu'il couvre tout le champ de vision de la caméra. Vous pouvez utiliser plusieurs objets de modèle en mode background mais vous devrez être vigilants. Les objets de background sont recouverts par tout, même par les autres objets de background. Les objets de background se couvrent les uns les autres en fonction de l'ordre de rendu de ces derniers. Pour cette raison, vous devez être sûrs que les objets qui doivent avoir une plus faible profondeur (depth), seront créés plus tard. Aussi vous devez éviter que les objets de Background couvrent des parties d'eux-même, étant donné que cela donne lieu au même problème. Les meilleures formes pour les modèles de backgrounds sont définitivement les spheres et les cubes.

Si vous gardez ces éléments à l'esprit, vous pouvez obtenir d'excellents résultats avec cette fonctionnalité. Vous pouvez afficher un soleil qui se promène dans le ciel, changer les nuages, selon l'heure changer les effets, nuages éclairés en temps réel et plus encore. De bons backgrounds est une des clés pour proposer d'impressionants graphismes. Vous devriez utiliser cette fonctionnalités au maximum.



© Christoph Peters. Certains droits réservés. (Traduction FR 04/2008, Franck Vernel / Damien Buhl).

Creative Commons License XHTML 1.0 Transitional