Object Builder – Création d’un véhicule terrestre

Auteur : IkåR
Publié le : 24/08/2014
Révisé le : Jamais

Version PDF

SOMMAIRE

  • AVANT-PROPOS
  • I. Préparation
  • II. Premiers pas
  • III. Animation
  • IV. Animation Complexe
  • V. Les LOD indispensables
  • VI. Les derniers points importants
  • VII. La configuration
  • VIII. Test Ingame

AVANT-PROPOS

Nous allons voir dans ce petit tutoriel la façon de créer et configurer un véhicule terrestre.
Ce tutoriel s’adresse à ceux qui connaissent déjà les bases du logiciel Object Builder for Arma3 (créer un nouveau LOD, copier, coller, rajouter un point, modifier ou donner un nom à une partie de la 3D, etc etc).

Partie 1

1. Préparation

Première des choses à faire, avant de lancer le logiciel : créer un répertoire de travail, destiné à devenir un fichier PBO.
Créez un nouveau répertoire à la racine de votre espace de travail, que vous nommerez « tuto_addon ».
Dans ce répertoire vous allez créer un autre répertoire, que vous nommerez « cars », et encore à l’intérieur un autre répertoire « data ».
A l’intérieur du répertoire « data », vous allez encore créer plusieurs répertoires qui nous seront utiles plus tard : « anims » , « sounds » et « ui ».
Il est conseillé de ne pas utiliser de majuscules dans les noms de vos répertoires.

Peu importe le type de véhicule que vous comptez réaliser, il va falloir créer un fichier nommé model.cfg au même endroit que le fichier P3D à configurer/animer. Le model.cfg va aussi servir à régler certaines propriétés de la 3D. Un fichier model.cfg est simplement un fichier texte, que vous pourrez créer et éditer avec un simple editeur de texte (par exemple le bloc-notes de Windows). Placez ce fichier à la racine du répertoire « cars », comme ceci :

Voilà un model.cfg « vierge » pour un véhicule terrestre que nous allons petit à petit configurer :
Code TEXT :

 
class CfgSkeletons 
{ 
	class Vehicle;
	class TUTO_Vehicule_Skelet: Vehicle
	{
		isDiscrete=1;
		skeletonInherit = "";
		skeletonBones[]=
		{
		};
	};
};
 
class CfgModels
{
	class Vehicle;
	class TUTO_Vehicule: Vehicle
	{
		skeletonName = "TUTO_Vehicule_Skelet";
		sectionsInherit = ""; 
 
		sections[]={};
 
		class Animations
		{
		};
	};
};

Un fichier model.cfg est divisé en 2 parties :

  • la première CfgSkeletons, c’est là que seront répertoriées toutes les parties animées de votre P3D (dans la zone SkeletonBones)
  • la seconde CfgModels, ou vous devrez faire tous les réglages de vos animations, les axes de rotations, angles de rotations, etc (dans la zone Animations), et également déclarer certaines entrées, nous le verrons tout au long de ce tutoriel.

2. Premiers pas

Nous allons maintenant créer un objet 3D très simple, qui ressemblera plus ou moins à un pickup.
Lancez Object Builder for Arma3 et créez un LOD 1.000.
Attention, lorsque vous lancez Object Builder for Arma3, celui ci va s’ouvrir avec un LOD résolution 0.000. Le premier LOD de résolution d’un objet 3D doit impérativement être 1.000. Le LOD 0.000 est surtout utilisé par des objets de grande taille à LOD unique, comme un porte avion.

Une fois votre modèle 3D terminé, enregistrez le dans le répertoire « cars » (au format P3D), au même endroit que le model.cfg, nommez le ainsi : « tuto_pickup ».

Ouvrez votre fichier model.cfg, vous devez maintenant déclarer le nom de votre P3D en rajoutant cette ligne : class tuto_pickup: TUTO_Vehicule {};
Ce qui donne :
Code TEXT :

 
class CfgSkeletons 
{ 
	class Vehicle;
	class TUTO_Vehicule_Skelet: Vehicle
	{
		isDiscrete=1;
		skeletonInherit = "";
		skeletonBones[]=
		{
		};
	};
};
 
class CfgModels
{
	class Vehicle;
	class TUTO_Vehicule: Vehicle
	{
		skeletonName = "TUTO_Vehicule_Skelet";
		sectionsInherit = ""; 
 
		sections[]={};
 
		class Animations
		{
		};
	};
	class tuto_pickup: TUTO_Vehicule {};
};

Nous allons maintenant animer les roues et procéder à quelques réglages.

3. Animation

Donnez un nom à chaque roue de votre LOD 1.000, comme ceci :

  • tuto_roue_avant_gauche
  • tuto_roue_avant_droite
  • tuto_roue_arriere_gauche
  • tuto_roue_arriere_droite


Comme vous le voyez, nous pouvons nommer les différentes parties de notre addon comme bon nous semble.

Vous allez maintenant créer un nouveau LOD, et choisir le type : Memory
Dans ce LOD Memory, nous allons créer l’axe de chaque roue. Un axe, c’est tout simplement 2 points dans l’espace 3D. Un axe devra être parfaitement centré par rapport à sa roue, bien entendu.
Nommez chaque axe de manière à vous rappeler à quelle roue il appartient, comme ceci :

  • tuto_axe_roue_avant_gauche
  • tuto_ axe_roue_avant_droite
  • tuto_ axe_roue_arriere_gauche
  • tuto_ axe_roue_arriere_droite

A ce stade, votre modèle 3D n’est pas encore animé, il faut encore rajouter quelques lignes dans le fichier model.cfg.
Dans la première partie du model.cfg, CfgSkeletons, nous allons déclarer les noms des roues dans la zone skeletonBones :
Code TEXT :

 
		skeletonBones[]=
		{
				"tuto_roue_avant_gauche","",
				"tuto_roue_avant_droite","",
				"tuto_roue_arriere_gauche","",
				"tuto_roue_arriere_droite","",
 
		};

Dans la deuxième partie, CfgModels, nous allons configurer chaque roue dans la zone Animations :
Code TEXT :

 
		class Animations
		{
			class TUTO_roue_avant_gauche
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_avant_gauche";
				axis = "tuto_axe_roue_avant_gauche";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
 
			class TUTO_roue_avant_droite
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_avant_droite";
				axis = "tuto_axe_roue_avant_droite";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
 
			class TUTO_roue_arriere_gauche
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_arriere_gauche";
				axis = "tuto_axe_roue_arriere_gauche";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
 
			class TUTO_roue_arriere_droite
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_arriere_droite";
				axis = "tuto_axe_roue_arriere_droite";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
		};

Le fichier model.cfg complet :
Code TEXT :

 
class CfgSkeletons 
{ 
	class Vehicle;
	class TUTO_Vehicule_Skelet: Vehicle
	{
		isDiscrete=1;
		skeletonInherit = "";
		skeletonBones[]=
		{
				"tuto_roue_avant_gauche","",
				"tuto_roue_avant_droite","",
				"tuto_roue_arriere_gauche","",
				"tuto_roue_arriere_droite","",
 
		};
	};
};
 
class CfgModels
{
	class Vehicle;
	class TUTO_Vehicule: Vehicle
	{
		skeletonName = "TUTO_Vehicule_Skelet";
		sectionsInherit = ""; 
 
		sections[]={};
 
		class Animations
		{
			class TUTO_roue_avant_gauche
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_avant_gauche";
				axis = "tuto_axe_roue_avant_gauche";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
 
			class TUTO_roue_avant_droite
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_avant_droite";
				axis = "tuto_axe_roue_avant_droite";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
 
			class TUTO_roue_arriere_gauche
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_arriere_gauche";
				axis = "tuto_axe_roue_arriere_gauche";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
 
			class TUTO_roue_arriere_droite
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_arriere_droite";
				axis = "tuto_axe_roue_arriere_droite";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
		};
	};
 
	class tuto_pickup: TUTO_Vehicule {};
 
};

Lancez le Viewer en utilisant l’icone rouge, Start/Restart, et en faisant tourner la molette de la souris vous pourrez vérifier que vos roues sont parfaitement animées (le bouton central et le bouton droit servent également à sélectionner une autre animation lorsque votre modèle en possède plusieurs, ce qui n’est pas encore le cas bien sûr).

Passons maintenant à la direction.
Les deux roues avants sont déjà correctement nommées, il nous faut simplement rajouter 2 axes verticales dans le LOD Memory (un pour chaque roue) que nous allons nommer :

  • tuto_axe_direction_avant_gauche
  • tuto_ axe_direction_avant_droite

Ces 2 axes seront placés du coté intérieur de chaque roue, comme ceci :

Comme précédemment, il nous faut maintenant rajouter quelques lignes au model.cfg pour que ça puisse fonctionner, donc dans la partie CfgModels, nous allons configurer la direction dans la zone Animations en rajoutant ces lignes :
Code TEXT :

 
			class TUTO_direction_avant_gauche
				{
				type = "rotation";
				source = "drivingWheel";
				selection = "tuto_roue_avant_gauche";
				axis = "tuto_axe_direction_avant_gauche";
				memory = true;
				sourceAddress = "mirror";
				minValue = -1;
				maxValue = 1;
				angle0 = rad 40;
				angle1 = rad -40;
				};
 
			class TUTO_direction_avant_droite
				{
				type = "rotation";
				source = "drivingWheel";
				selection = "tuto_roue_avant_droite";
				axis = "tuto_axe_direction_avant_droite";
				memory = true;
				sourceAddress = "mirror";
				minValue = -1;
				maxValue = 1;
				angle0 = rad 40;
				angle1 = rad -40;
				};

Le fichier model.cfg complet :
Code TEXT :

 
class CfgSkeletons 
{ 
	class Vehicle;
	class TUTO_Vehicule_Skelet: Vehicle
	{
		isDiscrete=1;
		skeletonInherit = "";
		skeletonBones[]=
		{
				"tuto_roue_avant_gauche","",
				"tuto_roue_avant_droite","",
				"tuto_roue_arriere_gauche","",
				"tuto_roue_arriere_droite","",
 
		};
	};
};
 
class CfgModels
{
	class Vehicle;
	class TUTO_Vehicule: Vehicle
	{
		skeletonName = "TUTO_Vehicule_Skelet";
		sectionsInherit = ""; 
 
		sections[]={};
 
		class Animations
		{
			class TUTO_roue_avant_gauche
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_avant_gauche";
				axis = "tuto_axe_roue_avant_gauche";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
 
			class TUTO_roue_avant_droite
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_avant_droite";
				axis = "tuto_axe_roue_avant_droite";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
 
			class TUTO_roue_arriere_gauche
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_arriere_gauche";
				axis = "tuto_axe_roue_arriere_gauche";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
 
			class TUTO_roue_arriere_droite
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_arriere_droite";
				axis = "tuto_axe_roue_arriere_droite";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
 
			class TUTO_direction_avant_gauche
				{
				type = "rotation";
				source = "drivingWheel";
				selection = "tuto_roue_avant_gauche";
				axis = "tuto_axe_direction_avant_gauche";
				memory = true;
				sourceAddress = "mirror";
				minValue = -1;
				maxValue = 1;
				angle0 = rad 40;
				angle1 = rad -40;
				};
 
			class TUTO_direction_avant_droite
				{
				type = "rotation";
				source = "drivingWheel";
				selection = "tuto_roue_avant_droite";
				axis = "tuto_axe_direction_avant_droite";
				memory = true;
				sourceAddress = "mirror";
				minValue = -1;
				maxValue = 1;
				angle0 = rad 40;
				angle1 = rad -40;
				};
		};
	};
 
	class tuto_pickup: TUTO_Vehicule {};
 
};

Une fois vos modifications enregistrées, lancez le Viewer pour vérifier que la direction fonctionne bien. Notez que l’angle de braquage est réglé ici à 40°, modifiez ces valeurs si besoin.

4. Animations Complexes

Nous allons maintenant voir comment créer une animation un peu plus complexe, à savoir : une animation faisant partie d’une autre animation.
Nous allons créer la suspension des roues.

Avant tout, une petite modification 3D de notre pickup s’impose, nous allons rajouter les amortisseurs et les ponts :

Nous allons ensuite nommer certaines parties de cette nouvelle 3D :

  • tuto_suspension_avant_gauche
  • tuto_suspension_avant_droite
  • tuto_suspension_arriere_gauche
  • tuto_suspension_arriere_gauche

Nous devons également donner ces mêmes noms aux roues du LOD 1.000, ce qui fait que, par exemple, la roue avant gauche aura maintenant 2 noms :

  • tuto_roue_avant_gauche
  • tuto_suspension_avant_gauche

Ce n’est pas terminé, nous devons également donner ces mêmes noms aux axes des roues, dans le LOD Memory, donc comme tout à l’heure, l’axe de la roue avant gauche aura aussi 2 noms :

  • tuto_axe_roue_arriere_gauche
  • tuto_suspension_avant_gauche



Pour terminer cette nouvelle animation, il nous faut maintenant modifier (encore) le model.cfg.

Cette fois, les choses deviennent un peu plus compliquées, car comme je le disais plus haut, nous voulons créer une animation faisant partie d’une autre animation ; les roues font partie du pont, si le pont devient animé, l’animation des roues fera donc partie de l’animation du pont. C’est ce que nous devons déclarer dans notre model.cfg, dans la partie CfgSkeletons, nous allons modifier les lignes existantes de la zone skeletonBones et en rajouter d’autres comme ceci :
Code TEXT :

 
		skeletonBones[]=
		{
				"tuto_suspension_avant_gauche","",
				"tuto_suspension_avant_droite","",
				"tuto_suspension_arriere_gauche","",
				"tuto_suspension_arriere_droite","",
 
				"tuto_roue_avant_gauche","tuto_suspension_avant_gauche",
				"tuto_roue_avant_droite","tuto_suspension_avant_droite",
				"tuto_roue_arriere_gauche","tuto_suspension_arriere_gauche",
				"tuto_roue_arriere_droite","tuto_suspension_arriere_droite",
 
		};

Explications :
– La ligne « tuto_suspension_avant_gauche », » », veut simplement dire que la 3D de la suspension avant gauche ne dépend d’aucune autre partie 3D animée.
– La ligne « tuto_roue_avant_gauche », »tuto_suspension_avant_gauche », veut dire que la roue avant gauche se trouve à l’intérieur de la 3D de la suspension avant gauche.

Bref, c’est juste une question de logique, vous l’avez compris.

Il nous faut également rajouter quelques lignes dans la partie CfgModels, dans la zone Animations :
Code TEXT :

 
			class TUTO_direction_avant_droite
				{
				type = "rotation";
				source = "drivingWheel";
				selection = "tuto_roue_avant_droite";
				axis = "tuto_axe_direction_avant_droite";
				memory = true;
				sourceAddress = "mirror";
				minValue = -1;
				maxValue = 1;
				angle0 = rad 40;
				angle1 = rad -40;
				};
 
			class TUTO_suspension_avant_gauche
				{
				type="translationY";
				source = "damper";
				selection = "tuto_suspension_avant_gauche";
				axis="";
				animPeriod=0;
				minValue=-1000;
				maxValue=1000;
				};
 
			class TUTO_suspension_avant_droite
				{
				type="translationY";
				source = "damper";
				selection = "tuto_suspension_avant_droite";
				axis="";
				animPeriod=0;
				minValue=-1000;
				maxValue=1000;
				};
 
			class TUTO_suspension_arriere_gauche
				{
				type="translationY";
				source = "damper";
				selection = "tuto_suspension_arriere_gauche";
				axis="";
				animPeriod=0;
				minValue=-1000;
				maxValue=1000;
				};
 
			class TUTO_suspension_arriere_droite
				{
				type="translationY";
				source = "damper";
				selection = "tuto_suspension_arriere_droite";
				axis="";
				animPeriod=0;
				minValue=-1000;
				maxValue=1000;
				};

Vous l’avez certainement remarqué, nous n’avons pas rajouté d’axe pour la suspension, nous n’en avons pas besoin dans ce cas précis puisque l’animation de la suspension se fera sur un axe parfaitement vertical (Y), c’est pour cette raison que dans les dernières lignes que nous venons de rajouter, le type d’animation est réglé de cette manière : type= »translationY » , et l’axe : axis= » »

Le fichier model.cfg complet :

Code TEXT :

 
class CfgSkeletons 
{ 
	class Vehicle;
	class TUTO_Vehicule_Skelet: Vehicle
	{
		isDiscrete=1;
		skeletonInherit = "";
		skeletonBones[]=
		{
				"tuto_suspension_avant_gauche","",
				"tuto_suspension_avant_droite","",
				"tuto_suspension_arriere_gauche","",
				"tuto_suspension_arriere_droite","",
 
				"tuto_roue_avant_gauche","tuto_suspension_avant_gauche",
				"tuto_roue_avant_droite","tuto_suspension_avant_droite",
				"tuto_roue_arriere_gauche","tuto_suspension_arriere_gauche",
				"tuto_roue_arriere_droite","tuto_suspension_arriere_droite",
 
		};
	};
};
 
class CfgModels
{
	class Vehicle;
	class TUTO_Vehicule: Vehicle
	{
		skeletonName = "TUTO_Vehicule_Skelet";
		sectionsInherit = ""; 
 
		sections[]={};
 
		class Animations
		{
			class TUTO_roue_avant_gauche
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_avant_gauche";
				axis = "tuto_axe_roue_avant_gauche";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
 
			class TUTO_roue_avant_droite
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_avant_droite";
				axis = "tuto_axe_roue_avant_droite";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
 
			class TUTO_roue_arriere_gauche
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_arriere_gauche";
				axis = "tuto_axe_roue_arriere_gauche";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
 
			class TUTO_roue_arriere_droite
				{
				type = "rotation";
				source = "wheel";
				selection = "tuto_roue_arriere_droite";
				axis = "tuto_axe_roue_arriere_droite";
				memory = true;
				sourceAddress = "loop";
				minValue = 0;
				maxValue = 1;
				angle0 = 0;
				angle1 = "rad -360";
				};
 
			class TUTO_direction_avant_gauche
				{
				type = "rotation";
				source = "drivingWheel";
				selection = "tuto_roue_avant_gauche";
				axis = "tuto_axe_direction_avant_gauche";
				memory = true;
				sourceAddress = "mirror";
				minValue = -1;
				maxValue = 1;
				angle0 = rad 40;
				angle1 = rad -40;
				};
 
			class TUTO_direction_avant_droite
				{
				type = "rotation";
				source = "drivingWheel";
				selection = "tuto_roue_avant_droite";
				axis = "tuto_axe_direction_avant_droite";
				memory = true;
				sourceAddress = "mirror";
				minValue = -1;
				maxValue = 1;
				angle0 = rad 40;
				angle1 = rad -40;
				};
 
			class TUTO_suspension_avant_gauche
				{
				type="translationY";
				source = "damper";
				selection = "tuto_suspension_avant_gauche";
				axis="";
				animPeriod=0;
				minValue=-1000;
				maxValue=1000;
				};
 
			class TUTO_suspension_avant_droite
				{
				type="translationY";
				source = "damper";
				selection = "tuto_suspension_avant_droite";
				axis="";
				animPeriod=0;
				minValue=-1000;
				maxValue=1000;
				};
 
			class TUTO_suspension_arriere_gauche
				{
				type="translationY";
				source = "damper";
				selection = "tuto_suspension_arriere_gauche";
				axis="";
				animPeriod=0;
				minValue=-1000;
				maxValue=1000;
				};
 
			class TUTO_suspension_arriere_droite
				{
				type="translationY";
				source = "damper";
				selection = "tuto_suspension_arriere_droite";
				axis="";
				animPeriod=0;
				minValue=-1000;
				maxValue=1000;
				};
		};
	};
 
	class tuto_pickup: TUTO_Vehicule {};
 
};

 Enregistrez votre travail et lancez le Viewer, sélectionnez l’animation damper et forcez l’animation avec la molette de la souris, si tout se passe bien, vous pourrez actionner une à une les 3 animations que nous venons de créer.

Vous pouvez télécharger l’exemple que nous venons de construire ensemble si vous pensez vous être trompé quelque part : tutoriel_addonmaking_partie1.7z

Nous verrons dans la prochaine partie comment configurer notre véhicule pour l’utiliser dans ArmA3.
Et non, votre addon n’est pas encore utilisable en jeu, nous avons encore du travail…

 

Partie 2

Dans cette deuxième partie, nous allons procéder à certains réglages / ajustements pour que notre véhicule puisse être utilisé dans ArmA3.

5. Les LOD indispensables

Nous allons commencer par créer un LOD très important : Geometry
Ce LOD est la partie physique de votre modèle 3D, c’est là que vous allez régler sa masse et son comportement en jeu (collision, stabilité, maniabilité).
Dans ce LOD, vous devez reproduire approximativement la forme de votre véhicule. La méthode la plus simple, et la plus efficace pour que votre LOD Geometry fonctionne, et de recréer la forme du LOD 1.000 avec quelques cubes et cylindres, c’est à dire assez grossièrement.
Surtout n’essayez pas de créer une forme trop complexe, elle doit être la plus simple possible.
Chaque forme, ou composant, du LOD Geometry devra être convexe.

Important : en recréant la forme des roues de votre véhicule, vous devrez également leur donner le même nom que dans votre LOD 1.000. En fait non pas tout à fait, vous n’avez besoin que de la suspension, il est inutile que les roues du LOD Geometry tournent.

Une fois que vous avec terminé, passez par le menu Structure, puis Convexity et cliquez sur Component Convex Hull. Le programme va rendre convexe chaque composant (si ils ne sont pas trop complexe) et les nommer correctement. Si vous opérez la moindre modification sur la 3D de ce LOD par la suite, il est préférable de refaire cette manipulation.

Sélectionnez maintenant toute la 3D du LOD Geometry, et dans le champ Mass entrez le chiffre 2000. Cliquez sur Apply.

Nous allons répartir un peu mieux le poids, pour que le centre de gravité (représenté par une petite croix bleue) soit plus haut.
Sélectionnez uniquement la caisse de votre véhicule, ne sélectionnez pas les roues.
Modifiez ensuite la masse de cette sélection, disons 1500. Dès que vous cliquerez sur Apply, vous verrez le centre de gravité changer d’endroit, si vous sélectionnez toute la 3D, vous verrez que la masse est toujours de 2000, elle est simplement repartie différemment.
Notez également les points sélectionnés plus lourds mis en évidence. Vous pouvez donc donner plus de poids à certains points pour mieux repartir la masse.

Rajoutons maintenant un LOD lui aussi très important : LandContact
Ce LOD représente tout simplement le contact avec le sol.
Il est très simple à réaliser, il vous suffit de créer 4 points à l’endroit ou les 4 roues toucheront le sol.
Vous devrez également nommer ces points de la même façon que la suspension.

6. Les derniers points importants

Nous allons terminer la partie 3D par quelques rajouts.
Nous allons commencer par créer le proxy du conducteur (proxy driver), un proxy est simplement un lien vers un autre objet 3D représenté par un simple polygone. Dans le cas d’un proxy driver, il s’agira simplement de pouvoir positionner correctement le conducteur dans notre véhicule.

Passez par le menu Create, puis choisissez Proxy, dans cette nouvelle fenêtre vous allez faire le lien avec le proxy driver de votre choix. Comme nous n’avons pas de proxy personnalisé, nous allons en choisir un qui se trouve dans le répertoire data_f du jeu.

Voici le chemin complet du proxy que nous utiliserons :
A3data_fproxiesdriver_offroadDriver

Donc cliquez sur Browse et sélectionnez ce proxy.

Positionnez correctement votre proxy sur le siège conducteur tout en vérifiant dans le viewer.

Nous allons également rajouter un proxy cargo, à la place du passager, là encore nous utiliserons un proxy du jeu :
A3data_fproxiespassenger_low01Cargo01


Pour pouvoir embarquer dans notre véhicule, il nous faut aussi rajouter un point de position dans notre LOD Memory.
Donc direction le LOD Memory, ajoutez un premier point, nommez le pos driver, puis un second pos driver dir.
Positionnez le point pos driver devant la portière du conducteur, et le pos driver dir un peu plus près du siège. En jeu lorsque vous voudrez embarquer dans votre véhicule, le fait d’être a proximité du point pos driver fera apparaître l’option pour monter à bord comme conducteur. Le point pos driver dir sert à préciser dans quelle direction va se jouer l’animation pour embarquer.

Faites la même chose pour la place passager de l’autre coté, rajoutez les 2 points pos cargo et pos cargo dir

Positionnez ces 4 nouveaux points un peu plus haut que le contact avec le sol.

Dernière chose avant de passer à la configuration, faites une copie de votre premier LOD 1.000 (duplicate) et changer le type de la copie en View – Cargo
Lorsque vous serez en vue première personne, à l’intérieur du véhicule, c’est ce LOD qui sera utilisé. Généralement les LOD de vue intérieure sont plus détaillés et sont rarement de simples copies du LOD 1.000.

7. La configuration

Nous n’allons pas créer une configuration complexe, mais le stricte minimum, le but de ce tutoriel étant de vous apprendre les bases.
Nous allons rajouter un fichier nommé config.cpp, dans le même répertoire que notre P3D et model.cfg.
Un fichier de configuration est divisé en plusieurs parties, nous allons commencer par la première : CfgPatches.

Code TEXT :

 
class CfgPatches
{
	class TUTO_AddOn_Cars
	{
		units[]={"TUTO_Pickup"};
		weapons[]={};
		requiredVersion=0.1;
		requiredAddons[]={};
	};
};

Dans cette partie vous devez déclarer votre addon, et régler certaines conditions.
La ligne units sert à référencer les différents véhicules que rajoute votre addon.
La ligne weapons, à référencer les armes, donc vide pour ce tutoriel.
La ligne requiredVersion permet d’exiger une version spécifique (ou supérieur) du jeu, si par exemple une future mise à jour rajoute un élément que votre addon utilise, vous devrez alors exiger cette mise à jour pour que votre addon fonctionne correctement.
La ligne requiredAddons contient la liste des addons obligatoires pour que votre addon fonctionne, si par exemple vous utilisez des objets ou lignes de configuration d’un addon en particulier.

Vient ensuite la partie CfgVehicles, qui comme son nom l’indique. est la partie configuration des véhicules :

Code TEXT :

 
class CfgVehicles
{
	class Car;
	class Car_F: Car
	{
		class HitPoints
		{
			class HitLFWheel;
			class HitLF2Wheel;
 
			class HitRFWheel;
			class HitRF2Wheel;
			class HitBody;
 
			class HitGlass1;
			class HitGlass2;
			class HitGlass3;
			class HitGlass4;
		};	
	};
 
	class TUTO_Pickup_base: Car_F
	{
		model 	= "tuto_addoncarstuto_pickup";
		picture	= "A3Weapons_FDataplaceholder_co.paa";
		Icon	= "A3Weapons_FDataplaceholder_co.paa";	
 
		displayName = "TUTO - Pickup";
 
		transportMaxBackpacks = 3;
		transportSoldier = 1;
 
		class Turrets{};
 
		driverAction 		= driver_offroad01;
		cargoAction[] 		= {passenger_low01};
		getInAction 		= GetInLow;
		getOutAction 		= GetOutLow;
		cargoGetInAction[] 	= {"GetInLow"};
		cargoGetOutAction[] = {"GetOutLow"};				
	};
 
	class TUTO_Pickup: TUTO_Pickup_base
	{	
		scope = 2;
		side = 3;
		faction = CIV_F;
		crew = "C_man_1";
	};	
};

La méthode reste toujours la même, nous déclarons un nouvel élément en commençant par class
Dans ce tutoriel, nous n’allons pas créer une configuration complète, nous allons utiliser la configuration existante d’un véhicule du jeu.

Nous commençons par une class de base du jeu :
class Car;
Le point virgule (;) sert à faire le lien avec cette class du jeu, nous ne la modifions pas.

Nous continuons avec une autre base du jeu, qui possède ses propres réglages de base :
class Car_F: Car
Les 2 point (:) signifie que la class Car_F dépend de la class Car

Enfin nous créons notre propre class de base qui va dépendre de la précédente :
class TUTO_Pickup_base: Car_F
C’est là que nous allons paramétrer notre véhicule.

La première ligne, model, pointe vers le P3D de notre véhicule.
La ligne displayName permet de donner un nom à notre véhicule.
etc etc

Nous terminons notre configuration par une dernière class qui va dépendre de notre propre base :
class TUTO_Pickup: TUTO_Pickup_base
C’est cette class qui sera visible dans ArmA3 (scope = 2)

Le fichier config.cpp complet :
Code TEXT :

 
class CfgPatches
{
	class TUTO_AddOn_Cars
	{
		units[]={"TUTO_Pickup"};
		weapons[]={};
		requiredVersion=0.1;
		requiredAddons[]={};
	};
};
 
class CfgVehicles
{
	class Car;
	class Car_F: Car
	{
		class HitPoints
		{
			class HitLFWheel;
			class HitLF2Wheel;
 
			class HitRFWheel;
			class HitRF2Wheel;
			class HitBody;
 
			class HitGlass1;
			class HitGlass2;
			class HitGlass3;
			class HitGlass4;
		};	
	};
 
	class TUTO_Pickup_base: Car_F
	{
		model 	= "tuto_addoncarstuto_pickup";
		picture	= "A3Weapons_FDataplaceholder_co.paa";
		Icon	= "A3Weapons_FDataplaceholder_co.paa";	
 
		displayName = "TUTO - Pickup";
 
		transportMaxBackpacks = 3;
		transportSoldier = 1;
 
		class Turrets{};
 
		driverAction 		= driver_offroad01;
		cargoAction[] 		= {passenger_low01};
		getInAction 		= GetInLow;
		getOutAction 		= GetOutLow;
		cargoGetInAction[] 	= {"GetInLow"};
		cargoGetOutAction[] = {"GetOutLow"};				
	};
 
	class TUTO_Pickup: TUTO_Pickup_base
	{	
		scope = 2;
		side = 3;
		faction = CIV_F;
		crew = "C_man_1";
	};	
};

8. Test ingame

Vous pouvez maintenant créer votre PBO en utilisant AddonBuilder, et le placer dans un répertoire AddOns.

Lancez ArmA3, insérez une unité par double clic, notre véhicule se trouve du coté Civils, dans la partie Voitures.


Nous verrons dans un autre tutoriel comment améliorer notre petit véhicule, avec des réglages un peu plus poussés.
Vous pouvez télécharger l’exemple de cette deuxième partie : tutoriel_addonmaking_partie2.7z

Pour terminer, je vous conseille de parcourir le community-wiki officiel (anglais), qui est une véritable mine d’informations :
https://community.bistudio.com/wiki/Category:Arma_3:_Editing

Les commentaires sont fermés