Comment Créer un circuit

Les circuits sont composés de la piste et d’éléments de décor.

La piste est un chemin (décrit par des points de contrôle) qu’on modifie dans l’editeur) sur lequel on empile un ensemble de track pieces. Comme un collier de perles.

J’ai développé le prototype avec 3dsmax 2008. Tout est exporté par collada. Un plugin collada pour Maya existe.

A noter que j’emploie indifféremment les mots ‘brique’ ou ‘track piece’ pour désigner la même chose.

Unité

L’unité est le mètre et est paramétré ainsi dans 3dsmax :

Créer des ‘track pieces

Voici un mesh de base de circuit. Le pivot doit être sur le plateau et centré latéralement au milieu du mesh.

Pour bien modifier le pivot par rapport au mesh, on fait reset sur le pivot depuis le menu hierarchie. Ensuite, on modifie les vertex du mesh (modifier Edit Mesh) pour caller les vertex par rapport au pivot). On ne peut pas modifier le pivot pour les briques. Par contre, on peu bouger l’objet, ca bougera le pivot et changera la matrice de l’objet.

Les faces avant et arrière (capping) doivent être enlevées vu qu’elles ne seront jamais visibles.

Le mesh est tesselé sur la longueur idéalement toutes les 2.5m.

La longueur et la largeur du mesh sont arbitraires.

J’empile les mesh grâce à leur bounding box. Attention donc a ne pas avoir de vertex/face qui empechent un bon epilement sur l’axe Y.

L’empilement se faire suivant l’axe Y (Z etant vers le haut et X vers les cotés/bords)

La hauteur des bordures est arbitraire. Même si il n’y en avait pas, ca marcherait tout de même.

Les mesh doivent tiler un à un sur l’axe Y.

Si on fait des mesh avec des bords carrés et des mesh avec des bords arrondis (comme sur les screens), il doit y avoir au moins un mesh ayant des bords carrés à un bout et des bords arrondis à l’autre bout. Et cela pour permettre les transitions d’un type de mesh a l’autre.

Comme ceci :

 

Voici des exemples pas corrects :

 

La hauteur des mesh est arbitraires tant que le pivot est à la bonne place exemple :

 

Il peut y avoir des submeshes (plusieurs sous matériaux). Pas d’animation sur ces briques.

Seulement une map diffuse supportée par matériau. Pas de normal/spec/… pour l’instant

Il peut y avoir un ou plusieurs mesh de brique par scène exportée.

Une fois qu’on a fait la modélisation, les textures et les UVs, il faut exporter dans le répertoire correspondant au monde.

 

ATTENTION , toutes les textures doivent être dans le répertoire ou le .DAE est exporté. Les matériaux maya ou max doivent utiliser les textures de ce repertoire.

 

Pour l’instant, on met les mesh/textures dans ProtoType\Worlds\Earth\TrackPieces

 

La(les) Brique(s) ‘Start

Ce sont chez briques qui déterminent les points de spawn sur la piste.

Le point de spawn est calculé pour être au mileu de la longeur et au milieu de chaque coté de la piste.

Il n’y a donc que 2 points de spawn par brique.

On peut faire des pistes pour 4joueurs (avec 2 briques) ou pour 16 joueurs (avec 8 briques).

Les 2 points sont a la même hauteur. Il n’y a pas de décalage comme sur le startup d’une course de Formule 1.

Fichier de paramètrage

Une fois les mesh exporté, il faut les décrire au moteur. Pour ca, il faut ouvrir le fichier EarthTracks.lua avec notepad (ou un autre éditeur).

 

Le fichier ressemble a ca :

 

function LoadTrackPieces_Earth()

 

     Zenith.Merge("ProtoType\\Worlds\\Earth\\TrackPieces\\trackpieces1.dae")

end

 

 

Zenith.GetGameContent():AddContent("World|Earth", "TrackPieces")

 

trackPieces = "World|Earth|TrackPieces"

-- list of pieces

Zenith.GetGameContent():AddContent(trackPieces, "Default")

Zenith.GetGameContent():AddContent(trackPieces, "Pillar")

Zenith.GetGameContent():AddContent(trackPieces, "turn0deg")

Zenith.GetGameContent():AddContent(trackPieces, "turn90deg")

Zenith.GetGameContent():AddContent(trackPieces, "turn180deg")

Zenith.GetGameContent():AddContent(trackPieces, "turn270deg")

Zenith.GetGameContent():AddContent(trackPieces, "PillarWithAd")

Zenith.GetGameContent():AddContent(trackPieces, "Start")

 

-- piece name, mesh name

Zenith.GetGameContent():AddContent(trackPieces.."|Default", "default")

Zenith.GetGameContent():AddContent(trackPieces.."|DefaultDim", "32-32")

Zenith.GetGameContent():AddContent(trackPieces.."|Pillar", "pillar")

Zenith.GetGameContent():AddContent(trackPieces.."|PillartDim", "32-32")

Zenith.GetGameContent():AddContent(trackPieces.."|turn0deg", "Turn0deg")

Zenith.GetGameContent():AddContent(trackPieces.."|turn0degDim", "32-32")

Zenith.GetGameContent():AddContent(trackPieces.."|turn90deg", "turn90deg")

Zenith.GetGameContent():AddContent(trackPieces.."|turn90degDim", "32-32")

Zenith.GetGameContent():AddContent(trackPieces.."|turn180deg", "turn180deg")

Zenith.GetGameContent():AddContent(trackPieces.."|turn180degDim", "32-32")

Zenith.GetGameContent():AddContent(trackPieces.."|turn270deg", "turn270deg")

Zenith.GetGameContent():AddContent(trackPieces.."|turn270degDim", "32-32")

Zenith.GetGameContent():AddContent(trackPieces.."|PillarWithAd", "pillarpub")

Zenith.GetGameContent():AddContent(trackPieces.."|PillarWithAdDim", "32-32")

Zenith.GetGameContent():AddContent(trackPieces.."|Start", "StartingUp")

Zenith.GetGameContent():AddContent(trackPieces.."|StartDim", "32-32")

Zenith.GetGameContent():AddContent(trackPieces.."|Bigger1", "big01")

Zenith.GetGameContent():AddContent(trackPieces.."|Bigger1Dim", "32-64")

Zenith.GetGameContent():AddContent(trackPieces.."|Bigger2", "big2")

Zenith.GetGameContent():AddContent(trackPieces.."|Bigger2Dim", "64-32")

Zenith.GetGameContent():AddContent(trackPieces.."|BigArch", "arche1")

Zenith.GetGameContent():AddContent(trackPieces.."|BigArchDim", "64-64")

Dans la fonction LoadTrackPieces_Earth on met toutes les commandes de chargement. Dans notre cas, il n’y a qu’un fichier Collada avec tous les mesh dedans.

 

Les 2 lignes suivantes ne doivent pas changer

Zenith.GetGameContent():AddContent("World|Earth", "TrackPieces")

trackPieces = "World|Earth|TrackPieces"

 

On passe à la liste des track pieces. Pour l’heure, seulement deux sémantiques sont indispensables :

Zenith.GetGameContent():AddContent(trackPieces, "Default")

Zenith.GetGameContent():AddContent(trackPieces, "Start")

Il faut au minimum une brique par défaut noméeDefault’ et une brique de spawnStart’.

Ensuite, a part ces 2 briques, si on a 10 autres briques, on doit avoir 10 lignes donnant le nom de ces briques.

Viennent les lignes suivantes ou on fait l’association ‘nom de brique’ et le nom du mesh.

Exemple :

Zenith.GetGameContent():AddContent(trackPieces.."|Start", "StartingUp")

Zenith.GetGameContent():AddContent(trackPieces.."|StartDim", "32-32")

 

La brique ‘Start’ est associée au mesh qui s’appelle ‘StartingUp’ dans le scène de 3dsmax.

Pour donner la largeur de la piste, on ajoute ‘Dim’ au nom de la brique. En valeur on met la largeur en mètres de début et de fin de brique séparé par un tiret.

La largeur de début de piste correspond la la largeur avec le Y le plus faible.

Problèmes de positionnement des briques dans l’éditeur.

Le plus gros problème qui peut arriver dans l’éditeur est que les briques, une fois ajoutée, ne tilent pas. La brique apparaît décalée et/ou a une rotation étrange.

Pour palier ce problème, il faut dans 3dsmax :

Sélectionner le mesh, cliquer ‘Reset Pivot ‘

Dans l’image qui suit, le pivot est réinitialisé (reset pivot) mais le mesh n’est pas à la bonne position.

 

Choisir ‘edit mesh’ dans le menu des modifieurs du mesh. Sélectionner tous les vertex et les déplacer pour que le pivot soit à la bonne place.

 

Créer des éléments de décor

Un élément de décor par scène et donc par DAE. Seulement une map diffuse par mesh. Il peut y avoir plusieurs meshs dans une scène si ils sont liés par un élement de parenté.

L’intérêt de ce lien de parenté réside seulement dans l’animation.

 

Dans cet exemple, le piston ‘Box01’ est lié et animé a Line02.

Le mesh Root ne doit pas être animé.

Ces scènes exportées doivent juste être présentes dans le répertoire ProtoType\Worlds\Earth\Decor .

Comme pour les briques, les textures doivent être présentes dans ce répertoire. Et les matériaux Max/Maya doivent avoir leur maps qui pointent vers les textures de ce repertoire.

L’editeur

Déplacement de la souris dans la fenêtre 3D avec le bouton droit enfoncé bouge la caméra en mode FPS.

En mode FPS, les flêches du clavier permettent de bouger la caméra.

Déplacement de la souris avec le bouton du milieu enfoncé bouge la caméra haut/bas et latéralement.

On sélectionne et on bouge les gizmo avec le bouton gauche.

La molette avance/recule la caméra quand la fenêtre 3D a le focus (il faut faire un click gauche dedans pour qu’elle l’ait)

 

La console

On tape le texte dans la combo (entouré en rouge).

Entrée pour valider/executer la commande.

Toutes les commandes sont en fait du script lua.

Par exemple :

 

     Zenith.GetSky():LoadCubeMap("./ZenithDatas/OceanWater/cubemap-evul.dds")

 

Peut être utilisé dans le script de paramètre d’envirronement pour une piste. Ou simplement en test en vu de l’inclure dans un script.

Les fleches de direction haut/bas ainsi que la sauvegarde de l’historique des commandes dans la combobox ne marche pas.

Le résultats et erreurs sont affichés dans la console.

 

Créer un circuit

Par défaut, quand on lance l’editeur, il y a un petit circuit par défaut. Ce circuit est l’empilage d’une brique ‘Start’ et de 50 briques ‘Default’.

La bande grise avec les flêches rouges indique le sens du circuit.

Les boîtes blanches sont les points de contrôle de la piste.

On doit selectionner un point de contrôle pour le bouger ensuite. Pour cela, il faut selectionner un modifieur (move ou rotate) dans la toolbar puis selectionner une boite.

On peut aussi modifier la rotation pour chaque point de controle.

Il faut cliquer sur les boutons remove/insert before/insert after pour respectivement supprimer, inserer avant ou inserer apres le point de contrôle selectionné.

La piste est updatée en temps réel.

Si la longueur des briques ne correspond pas a la longueur de la piste avec les points de contrôle (par exemple 3 briques pour une piste de 10Km de long), les mesh sont stretchés en longeur.

Une fois le circuit fait avec les points de contrôle, il faut modifier les briques.

Ca se fait grâce a ce panneau.

Exemple :

Je sélectionne une brique du circuit, une boite grise apparaît autour. On ne peut ni le déplacer ni le tourner.

Si je veux le supprimer, je clique sur ‘Remove Mesh’.

Je choisi ‘PilarWithAd’ dans la liste. Si je veux inserer PilarWithAd avant ou après cette brique, je clique sur Add Mesh After ou Add Mesh Before.

Si je veux juste le remplacer, je clique sur Replace Mesh

Et voila le résultat.

 

Les bonus de piste

Les bonus sont des mesh de 4.5m X 4.5m. et quelques dizaines de centimètres de haut. Le mesh doit être centré sur l’origine (0,0,0).

C’est un mesh normal a part ca (sub materials, shaders,…). Pas d’animtion supportée.

Une fois les mesh de bonus faits, il faut les paramètrer.

Dans le fichier ProtoType\Worlds\Earth\World_Earth.lua on trouve:

function LoadBonusesEarth()

            Zenith.GetRoad():LoadBonus("./ProtoType/Worlds/Earth/Bonus/BonusSpeed.DAE", 1)

            Zenith.GetRoad():LoadBonus("./ProtoType/Worlds/Earth/Bonus/Bonusbonus.DAE", 2)

 

 

            Zenith.GetRoad():ClearBonusFunction()

 

            Zenith.GetRoad():SetBonusFunction(1,"BonusSpeed")

            Zenith.GetRoad():SetBonusFunction(2,"BonusShield")

End

Le nom de cette fonction est la concaténation de ‘LoadBonuses’ et le nom du monde.

Les 2 premières lignes chargent les fichier collada dans les slot de bonus (0 = bonus nul = pas de bonus). Maximum 254 bonus.

La fonction ClearBonusFunction est nécessaire et remet les fonctions de trigger de bonus à zéro.

Pour chaque bonus chargé, on donne une fonction lua qui sera appelée quand un vaisseau passe dessus.

 

Pour ajouter ces bonus dans une piste, il faut procéder ainsi :

Quand une brique est selectionnée, on peut lui spécifier 2 bonus.

 

On sauve dans le répertoire ProtoType\Worlds\Earth\Tracks

 

 ATTENTION : Il n’y a pas de popup de confirmation si on essaie de quitter l’application alors qu’on a modifier la scène.

 

Ajouter un élément de décor

On double click dans la liste des prefabs sur l’elément qu’on désire ajouter.

Celui-ci apparaît dans la scène 3D.

En cliquant dessus on peut le sélectionner.

Si on effectue une opération dessus (move/rotate/scale) avec Shift gauche enfoncé, le mesh est cloné.

Pour supprimer un mesh, il faut appuyer sur la touche DEL.

Le StartupMovie

 

En général dans les jeux de course, on a des popup à l’écran qui affichent 3..2..1..Go.

Je trouve que ca casse l’immersion. Pour changer ca, j’ai décidé que ces popups sont remplacés par des textures animées dans le monde.

On peut coller cette ou ces textures dans des briques ou des mesh de decor. Les mesh utilisant cette (ces) textures doivent être visible de tous les points de spawn( brique ‘start’)

Ces textures doivent faire au moins 5 secondes et découpées ainsi :

1 seconde d’intro

1 seconde avec ‘3’

1 seconde avec ‘2’

1 seconde avec ‘1’

1 seconde avec ‘Go’ ou un autre terme au choix de l’artiste

N secondes de fin

C’est le programme qui contrôle le début de playback ce ces animations.  L’avi ne loop pas.

 

Ces textures, pour les différencier des autres textures XVID qui bouclent et qui ne sont pas controlées par le début de la course doivent avoir ‘StartupMovieTexture’ dans leur nom.

Si on utilise 3 textures de démarrage, on peut les appeler ‘StartupMovieTexture1’ ‘StartupMovieTexture2’ totoStartupMovieTexture’ .

Ces textures sont gérées comme les autres textures et doivent donc être le repertoire Decor ou TrackPieces.

 

Paramètres du circuit

Il faut créer une fonction LUA qui etablisse les paramètres (skybox, couleur/direction du soleil, presence ou pas de la mer,…)

Ces paramètres ne sont pas persistants (on ne peut pas les sauver/charger).

Ce script lua doit être dans le repertoire de la piste. Par exemple, pour la piste ‘Monaco3000.track’ qui se trouve dans le repertoire ProtoType\Worlds\Earth\Tracks

Il doit y avoir un fichier lua qui s’appelle Monaco3000.lua dedans on trouvera quelque chose comme ca :

function SetupEnvMonaco3000()

 

     Zenith.GetSky():LoadCubeMap("./ZenithDatas/OceanWater/cubemap-evul.dds")

 

end

Le nom de la fonction est la concaténation de SetupEnv et du nom de la piste. Attention SetupEnvXXXX est case-sensitive. sEtUpENvmonaco3000 n’est donc pas correct.

Attention donc a bien concaténer le nom case-sensitive du nom de la piste aussi.

 

Que peut-on modifier dans ce script ?

Principalement la skybox, les paramètres de l’eau (couleur, affichage ou non,…),…

A ce titre, les classes modifiables sont dans ce cas, principalement :

Sky : http://www.azoted.com/DocZenith/html/class_i_sky.html

Ocean : http://www.azoted.com/DocZenith/html/class_i_ocean_water.html

On peut aussi régler les post-process (voir le chapitre concerné)

 

Comment Créer un vaisseau

Création du mesh

Il faut regarder le fichier DebugProto.Max pour avoir les mêmes échelles.

Les vaisseaux sont composés d’un objet Root (ici Box01) et de mesh enfants.

Le nom du mesh Root importe peu. Par contre le nommage des enfants est important.

Si un mesh enfant a dans son nom ‘AeroD’ ‘AeroG’ ou ‘AeroM’ il sera considéré dans le moteur comme respectivement un frein Droit, Gauche ou Milieu.

On peut avoir plusieurs freins a gauche/droite/milieu.

Le(s) frein(s) gauche se lève quand on freine a gauche. Le(s) droit se lève quand on freine à droite. Le(s) frein(s) du milieu se lève quand on freine a droite ET à gauche.

On peut avoir plusieurs LensFlare. Pour cela, les mesh concernés doivent avoir ‘lens’ dans leur nom. Ce sont juste des Quads avec un mapping UV (0,0) a (1,1).

Ces mesh de Lens doivent avoir un ShaderDirectX appliqué (lens.fx). Il est nécessaire de recopié ce shader dans le repertoire du vaisseau. Tout comme les textures.

Un problème de matrice (en cours de correction) fait qu’une fois que ce shader est appliqué au quad il n’est plus visible dans 3dsmax.

Le pivot pour chaque frein doit être bien posé sur l’axe de rotation. La rotation est fixée sur l’axe X.

Les limites et vitesse de rotation de ces freins sont fixées dans le fichier de configuration (voir la suite).

 

Organisation des fichiers

Les vaisseaux sont organisés par Team. ‘TeamTest’ dans notre cas dans le sous-répertoire ‘Teams’. Un répertoire par vaisseau. Par exemple ‘TestShip1’ pour le vaisseau de test.

Tous les textures/shaders doivent être dans le repertoire. Il y a aussi un script lua ‘TestShip1.lua’.

Fichier de configuration et Paramétrage

C’est dans le script LUA qu’on décrit les paramètres physiques du vaisseau.

 

function CreateDebugTestShip()

 

     local ship = Zenith.GetGame():AddShip()

     ship:LoadShipMesh("./ProtoType/Teams/TeamTest/TestShip1/tdebugship_fx.DAE")

     local sp = ship:GetPhysics()

 

 

-- Vitesse d'interpolation des aerofreins

ship:SetBrakeLerpSpeed(10)

-- Angles en radians des aerofreins gauche/droite

ship:SetAeroAngleLeftRight(1.5)

-- Aerofreins du milieu s'il y en a

ship:SetAeroAngleMid(1.5)

 

 

     ship:Init()

     return ship

end

 

     Zenith.GetGameContent():AddContent("Team|TeamTest","DebugShip")

     Zenith.GetGameContent():AddContent("Team|TeamTest|DebugShip","CreateFunction")

     Zenith.GetGameContent():AddContent("Team|TeamTest|DebugShip|CreateFunction","CreateDebugTestShip")

 

En détails, on commence par la fin :

     Zenith.GetGameContent():AddContent("Team|TeamTest","DebugShip")

     Zenith.GetGameContent():AddContent("Team|TeamTest|DebugShip","CreateFunction")

     Zenith.GetGameContent():AddContent("Team|TeamTest|DebugShip|CreateFunction","CreateDebugTestShip")

C’est pour indiqué au moteur le nom de la fonction de création du vaisseau ‘CreateDebugTestShip’ ainsi que son nom ‘DebugShip’.

Ces 2 noms doivent être uniques (pas 2 fois le même nom de fonction).

On crée donc la fonction luaCreateDebugTestShip’. Cette fonction est logiquement appelée quand on a besoin de ce vaisseau.

 

local ship = Zenith.GetGame():AddShip()

     ship:LoadShipMesh("./ProtoType/Teams/TeamTest/TestShip1/tdebugship_fx.DAE")

Ces 2 lignes sont obligatoires. La 1ere crée le vaisseau dans le moteur. La 2eme ligne charge le fichier collada. Le chemin est relatif par rapport au répertoire Bin.

 

local sp = ship:GetPhysics()

 

On recupère la physique pour pouvoir la modifier

 

-- Vitesse d'interpolation des aerofreins

ship:SetBrakeLerpSpeed(10)

-- Angles en radians des aerofreins gauche/droite

ship:SetAeroAngleLeftRight(1.5)

-- Aerofreins du milieu s'il y en a

ship:SetAeroAngleMid(1.5)

Et la, on modifie les paramètres physique.

La liste complète des paramètres est décrite dans la doc technique dans la classe IShipPhysics.

Comment tester un vaisseau?

Avant de tester un vaisseau/une piste, il est nécessaire de configurer ses controls.

Pour cela, il faut taper « Zenith.GetProtoGui():BuildConfig() » dans la console. Le résultat ressemblera à ca :

 

On lance l’éditeur et on charge le script du vaisseau ainsi qu’un circuit.

Ensuite, la procédure pour modifier la physique du vaisseau est :

On Modifie le script.

On sauve et on appuie sur la fleche verte.

On appuie sur F5 ou par le menu Game pour lancer le pilotage.

On teste

On appuie sur ESC pour arreter la simulation.

On retourne sur le script.

Pour l’instant, on ne peut tester que le debug ship.

Réglage des post-process

On règle le post-process par script. On peut donc le faire a tout moment (trigger de bonus, script de piste,…)

L’interface à modifier est IDisplayDevice que l’on récupère ainsi : Zenith.GetDD()

 

Pour le bloom :

      virtual void SetPPLuminance(float aval) = 0;

      virtual void SetPPMiddleGray(float aval) = 0;

      virtual void SetPPWhiteCutoff(float aval) = 0;

Les valeurs par défaut sont respectivement:

            Luminance = 0.04f;

            fMiddleGray = 0.18f;

            fWhiteCutoff = 0.78f;

Pour le Sepia :

      virtual void SetSepiaStrength(float aStrength) = 0;

      virtual void SetSepiaColor(const tcolor& col) = 0;

Je passe sur SepiaColor. Le SepiaStrength est la valeur d’interpolation entre la couleur du frame buffer et la (luminance multipliée par la couleur du Sepia).

 

Pour le Screen Space Ambient Occlusion :

 

HUD

Le HUD fonctionne ainsi :

-         on a un fichier DDS 1024x1024 nommé HUD2.DDS placé dans ProtoType\Common\HUD

-         Ce fichier (et uniquement ce fichier) est utilisé pour faire un rendu to texture. On découpe dedans des quads que l’on rend a différents endroits dans le RTT.

-         Cette texture de RTT est découpée en 4 et est mappé sur 4 quads chacun ayant une rotation sur les axes Y/Z. (Le quart en haut à gauche de la texture est pour le quad 3D en haut à gauche)

Le HUD est codé mi C++/ mi LUA. Je ne m’intéresserai ici qu’au code LUA : ProtoType\Common\HUD\hud.lua

Source (hud2.dds)

 

Rendu to texture

Résultat

 

 

Pour avoir l’interface IProtoHUD, il faut appeler : Zenith.GetHUD()

Il y a plusieurs fonction pour modifier les angles, tailles, etc des 4 quads 3D du HUD.

Dans ce script, il y a deux fonction importantes :

SetHUDRects() et UpdateHUD()

SetHUDRects

A part quelques petites init, on trouve plein de lignes qui ressemblent a ça:

hud:SetRectSource(0, vector4( 22, 20,  65, 76))

Cette ligne permet de décrire un rectangle source.

Le 1er paramètre (le 0) est l’index du rectangle que l’ont veut décrire. Le Vector4 est le X source en pixel, le Y source en pixel, le X de fin en pixel et le Y de fin en pixel.

Il suffit de regarder avec photoshop pour connaître ces coordonnées.

On fait ainsi pour chaque éléments du HUD : chiffres, jauges,….

Attention aux ombres et autre : chaque élément doit entièrement tenir dans le rectangle.

Les numéros de rectangles 50 et plus sont réservés aux bonus. Les rectangles bonus doivent aussi être déclarés dans cette fonction.

Pas plus de 99 rectangles possibles.

UpdateHUD

Cette fonction est appelée 25fois par secondes, c’est a dir a chaque fois qu’on veut updater le RTT.

Le fonctionnement est très simple. On dis qu’on commence a Pusher des Quads par StartQuads(), on push des rectangles, on termine par EndQuads().

 

hud:PushQuad(10,tvector2(0.53  ,0.25), tvector2(0.18,0.16))

 

Le 1er paramètre est le numéro de quad précédement décrit par SetRectSource.

Le 2eme parametre est la coordonnée X,Y dans les coordonnées de la texture ( 0..1, 0..1).

Le 3eme paramètre est la taille, toujours en coordonnées de texture (une taille de 1,1 correspond a l’ensemble de la texture).

Le 4eme paramètre, optionnel, est un facteur sur la longeur. 0.5 en valeur signifie qu’on ne dessine que la moitié gauche du quad. C’est notamment utile pour les jauges de vitesse et d’énergie.

 

Avec quoi dessine-t’on ces quads ?

On récupere aussi les valeurs depuis l’interface du HUD (voir la documentation de scripts) Comme la vitesse, le temps courant,…

Pour décomposer une valeur (vitesse par exemple) en une suite de chiffres (de 0 a 9), puis en quad, on utilise les fonctions script  function DecompNumber(aspeed)

et function DecompTime(atime).

Vu qu’on a chargé les bitmaps de chiffres 0 a 9 dans les rectangles N° 0 à 9,la conversion est très simple.

Ex :

 

centaine, dizaine, unit = DecompNumber(hud:GetSpeed())

 

            hud:PushQuad(centaine,tvector2(0  + 0.5, 0.40*0.5 + 0.5), tvector2(0.1,0.1))

            hud:PushQuad(dizaine,tvector2(0.1+ 0.5, 0.40*0.5 + 0.5), tvector2(0.1,0.1))

            hud:PushQuad(unit,tvector2(0.2+ 0.5, 0.40*0.5 + 0.5), tvector2(0.1,0.1))

 

 

 

Annexes :

 

Création d’une vidéo XVID pour intégration dans le jeu 

-         Créer la vidéo et l’encoder dans n’importe quel format.

-         Utiliser VirtualDubMod pour la re-encoder au format XVID

-         Il ne doit y avoir QUE la piste vidéo

La vidéo ne doit pas être trop grande (256x256 max) et avoir les dimensions en puissance de 2 (256x128 par exemple)

 

Shaders

En cours de rédaction

 

Export depuis Maya/Max

Il est nécessaire de reseter les scales et le pivot (pour uniformiser les matrices).

Pour cela, il faut ouvrir le panel suivant et cliquer dans l’ordre sur les 3 boutons encadrés de rouge.

Pour les éléments de décor, il faut cliquer sur AffectPivot Only et ‘ResetPivot’. En outre, suite à un problème de design de l’importeur collada.

Il est interdit d’avoir une animation de translation sur un seul axe. Pour résoudre ce soucis, une animation de translation très légère est demandée sur un autre axe.

 

Il faut utiliser l’exporteur collada de Feeling software

http://www.feelingsoftware.com/content/view/16/30/

Ne pas cocher Bake Matrices

Cocher Relatives paths, Normals, Triangulate et XRefs

Tangents/Binormals doit être coché si lesmesh utilisent un shader avec normal maps (ce qui n’est pas le cas pour l’instant)

Cocher Enable Export et Sample Animation si on a une animation sur les mesh (seulement pour les mesh de decors)

 

Prendre un screenshot

Dans la console, il faut taper TakeScreenShot(« nom complet du fichier »)’

Attention aux \ qui doivent être doublés.

Exemple : TakeScreenShot(« d:\\temp\\myscreen.dds »)

Le format est seulement en DDS

LUA

Lua est le langage de script utilisé pour plusieurs choses dans le moteur/jeu.

Il n’est pas nécessaire de connaître parfaitement le langage pour faire des assets.

Néanmoins pour en connaître davantage, je conseille vivement de parcourir le site http://www.lua.org

Et pout l’api du moteur, consulter : http://www.azoted.com/DocZenith/html