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.
L’unité est le mètre et est
paramétré ainsi dans 3dsmax :


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
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.
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ée ‘Default’
et une brique de spawn ‘Start’.
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.

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.

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.

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)

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.
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.

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 :

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 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.

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.
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.
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é)
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).

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’.
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 lua ‘CreateDebugTestShip’. 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.
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.

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 :
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()
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.
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))
-
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)
En cours de rédaction
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)
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 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