FlightGear - Création d'avions et autres / Creation of aircraft and other

Vous désirez aider à améliorer les avions de Hangar de Helijah, c'est ici que cela se passe / You would like to help improving aircraft from Helijah's hangar, this is where it happens

Vous n'êtes pas identifié(e).

#1 2015-09-27 16:49:16

Didier1963
Developpeur
Lieu : Bordeaux
Inscription : 2012-10-24
Messages : 1 238

Chatouillage Nasal-Pompe de secours Viet (1935) MAJ 10 Oct 2015

DERNIERE MISE A JOUR : 10 Oct 2015

Bonjour à tous,

Hé oui, ENCORE un "tuto participatif" à la Didier1963 mad
J'ai mis la première ligne pour ceux que ça interesse, pour qu'ils sachent quand j'ai modifié ce message et qu'il ne relise pas tout pour rien si il n'y a rien eu de rajouté ou corrigé.

PREAMBULE

Sur le Caudron Simoun que je suis en train d'essayer de reproduire avec mes modestes connaîssences, il y à un systême de démarrage à air Viet.
Il est constitué de :
- Une bombone d'air d'une capacité de +/- 8 litres
- Un compresseur entrainé par le moteur
- Une commande type Bowden
- Un régulateur automatique
- Une pompe manuelle de secours
- Un distributeur
- et plein de teuilleaux pour relier tout ça

J'aimerai donc bien reproduire le fonctionnement de ce systême.

Comme ce sera difficilement gérable en Xml, il va falloir mettre les mains dans le moteur Nasal.
C'est là que je vais avoir besoin de l'aide de nos spécialiste Nasal, et particulièrement du Proffessueur Fabien, si il accepte, qui me corrigera au fur et à mesure que j'écris ce tuto.

Malgré ce qu'il y a de marqué à la fin de chacun de mes message, je pense que là ça devrais être possible.

INVENTAIRE

On a, dans notre réserve (fgdata/Aircraft), des fichiers intéressant à utiliser et modifier pour :

- Simuler un va-et-viens continu pour le levier de la pompe : c'est le même principe que les essuie glace.
- Simuler un vidage de réservoir d'air : c'est comme le réservoir d'oxygène, sous l'action de la commande Bowden.
- Simuler un remplissage du réservoir : là y va falloir réfléchir

Quelques éléments de référance :

- action sur la commande avant de vider les réserves :                                                                 3 à 4 fois
- contenance du réservoir :                                                                                                                  7 litres
- temps d'actionnement a chaque foi :                                                                                               5'
- pression maxi :                                                                                                                                    50 Kg/cm2
- vitesse de rotation maxi du moteur :                                                                                               2500 t/min
- temps de remplissage aproximatif du réservoir :                                                                         15"
- quantité d'air utilisée au démarage :                                                                                              à définir *
* en se servant des données ci-dessus

MISE EN PLACE DES FICHIERS NECESSAIRES

LES FICHIERS NASAL

Il va nous faloir deux fichiers nasal :
- airpumplever.nas ce sera en fait doors.nas (pour le mouvement du levier lui même)
- backupairpump.nas ce sera en fait viet-starter-motor.nas (mais vous pouvez lui donner le nom qu'il vous convient, du moment où vous dites à FG où le trouver)

Que nous allons déclarer dans le fichier
..//Aircraft/Simoun/simoun-base.xml
afin qu'ils soit lus au démarrage de FG, en ajoutant ces lignes :

 <?xml version="1.0" encoding="ISO-8859-1"?>

<PropertyList>
.......
  <nasal>
    <doors>
      <file>Aircraft/Caudron-Simoun/Nasal/doors.nas</file>
    </doors>
.......
    <viet-starter-motor>
      <file>Aircraft/Caudron-Simoun/Nasal/viet-starter-motor.nas</file>
    </viet-starter-motor>
.......
  </nasal>
   
</PropertyList>

LES FICHIERS XML

Nous allons créer un fichier qui va regrouper tout ce qui concerne la gestion de l'animation de la 3D du démarreur Viet.

LE FICHIER MOUVEMENT LEVIER DE POMPE

Regardons déjà le contenu du fichier
..//Aircraft/747-400/Nasal/wippers.nas,

qui va nous servir de modèle (et éviter de se taper toute la doc du wiki FG afraid )
et essayons de comprendre ce charabia :

C'est la partie du code que nous allons mettre dans notre fichier "doors.nas" qui gère déjà tout les objets mobile tel que portes (bhein oui, sisnon il ne s'appelerait pas comme ça siffle ), les fenêtres, les capots moteur, etc.

# =====
# Doors
# =====

Doors = {};

Doors.new = func {
   obj = { parents : [Doors],
           door1 : aircraft.door.new("controls/electric/wiperl", 0.75),
           door2 : aircraft.door.new("controls/electric/wiperr", 0.75)
         };
   return obj;
};

Doors.door1export = func {
   me.door1.toggle();
}

Doors.door2export = func {
   me.door2.toggle();
}

# ==============
# Initialization
# ==============

# objects must be here, otherwise local to init()
doorsystem = Doors.new();

# le signe dièse
ce signe sert à mettre des commentaires, comme les "<!--" en Xml.
Tout ce qui suit sur la même ligne ne sera pas pris en compte par FG.
Donc là, nous avons 3 ligne pour faire un joli cartouche en guise de titre pour la première partie.

** : Il emble qui ce fichier ai été fait sur une base du fichier d'animation des portes, l'auteur n'a donc pas changé le titre, mais pour plus de clareté et éviter les confusions, je pense qu'il serait mieux de mettre "Lever" (Levier), à la place, ainsi qu'a tout les autres endroits où il y à "Doors" (attention de respecter la case : door est différent de Door). **

On saute une ligne après ce cartouche pour plus de clareté, et façiliter la recherche

Doors = {}
On lui indique le nom de la nouvelle fonction "Doors" dont la valeur est vide pour l'instant.(hé oui, erreur de compréhention de ma part. Il semblerai que ce soit le nom de la branche dans l'arbre de propriétés, à vérifier).
Nous changerons (probablement) ce nom en "Lever" pour nos besoins.

; le point-virgule
On lui indique la fin de la ligne de commande

Une nouvelle ligne vide pour aérer,

Doors.new = func
On lui demande ce mettre une nouvelle valeur dans la fonction "Doors" [désolé, erreur d'interpretation, c'est en fait le nom d'une nouvelle variable que l'on créé], et on décris entre crochets  {} ce qu'il doit faire pour mettre/calculer cette valeur.
Pour plus de clareté, on va séparer chaque instruction par lignes, mais pour FG, ce ne sera qu'une seul ligne de commande entre le ; précédent, jusqu'au suivant

On va donc à la ligne après notre crochet d'ouverture
obj = { parents : [Doors],
On va lui donner une liste de variables "enfants" dont nous auron besoin pour nos calculs, qui seront sous le groupe "parent" : "Doors"

, la virgule
sert à séparer les différentes variables. Comme pour les crochets et pour plus de clareté, on va à la ligne après cette virgule.

door1 : aircraft.door.new("controls/electric/wiperl", 0.75),
On donne le nom d'une nouvelle variable que l'on va appeler "door1" (qui sera utilisé ici pour désigner l'essuie-glace gauche)
et on lui dit de céer un endroit "aircraft.door.new, où mettre la valeur, cet endroit étant mis entre parentaises [ Oupsss : guillemets], puis une virgule de séparation, et on lui indique le nombre de secondes  pour changer la valeur (de 0 à 1, ou de 1 à 0).

}crochet de fermeture
On met un crochet pour terminer les instructions, puis un point virgule pour terminer la ligne d'instruction.

return obj;
On lui demande d'assigner les valeurs des objets listés

} crochet de fermeture
pour fermer celui que l'on avait ouvert à "Doors.new = func"

et point virgule pour terminer la ligne de commande

Doors.door1export = func {
On créé une variable "door1export" se situant dans le groupe "Doors", et on ouvre le crochet pour lui dire ce que fait cette variable

me.door1.toggle(); 
On lui demande de prendre la variable "door1" listée ci-dessus dans les objets "enfants" et lui dit de l'inverser

} crochet de fermeture
pour fermé celui que l'on avait ouvert à "Doors.door1export = func"



# ==============
# Initialization
# ==============

c'est un commentaire pour dire que ce qui suit concerne.......................... hé oui, y'en a qui suivent.............. l'initialisation des variables


# objects must be here, otherwise local to init()

Encore un commentaire

doorsystem = Doors.new();
On remet la variable "Doors.new" à la valeur entre parentèzes (donc zéro, puisqu'il n'y a rien entre celles-ci), et un point virgule pour terminer notre ligne de commande.

Voilà, on va déjà prendre ça, le modifier, et le mettre dans notre fichier "doors.nas" qui contient déjà des animations pour d'autres objets :

# ================
# Objects movement
# ================

Doors = {};

Doors.new = func {
   obj = { parents : [Doors],
.........................

           lever : aircraft.door.new("controls/pneumatic/backup-air-pump/lever", 1),
         };
   return obj;

......................

Doors.leverexport = func {
   me.lever.toggle();
}

..........................

doorsystem = Doors.new();

On a donc simplement rajouté la ligne de description de notre noouvel objet : "lever" (attention aux majuscules et minuscules)
Et on lui a rajouté la variable "leverexport" qui va avec,
tout le reste du codenécessaire  étant déjà présent dans notre fichier "doors.nas" initial.

On peut donc maintenant créer notre fichier Xml qui va utiliser la modélisation 3D et l'animer.
** on va supposer que vous avez déjà jeté un oeil sur mes autres tutos instrument, et donc je passe certains détails que vous connaissez déjà.
Il va donc rejoindre ces deux petits camarades .ac et .png dans le dossier qui va bien :
...//MonAvion/Models/ Interior/Instruments/Backup-Air-Pump

Nous allons l'appeler
/backupairpump.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<!-- =======================================================>> 
<<
<<                 Caudron Simoun - Backup Air Pump
<<                  by Didier Bourguet (didier1963)
<<                       3D, UVs , Xml & Nasal
<<                    didier1963[at]laposte[dot]net
<<
<<                    Team M88 - Sept 2015
<<
<<=========================================================-->

<PropertyList>

  <path>backupairpump.ac</path>

  <animation>
    <object-name>AirPump</object-name>
    <object-name>AirPumpLever</object-name>
    <object-name>AmpMeter.001</object-name>
    <object-name>AmpMeter.002</object-name>
    <object-name>AmpMeterBcgnd.001</object-name>
    <object-name>AmpMeterBcgnd.002</object-name>
    <object-name>AmpMeterGlass.001</object-name>
    <object-name>AmpMeterGlass.002</object-name>
    <object-name>AmpNeedle.001</object-name>
    <object-name>AmpNeedle.002</object-name>
    <object-name>FuelPriming.001</object-name>
    <object-name>FuelPriming.002</object-name>
  </animation>

<!-- Dome Light Simulation -->
  <animation>
    <type>material</type>
    <object-name>AirPump</object-name>
    <object-name>AirPumpLever</object-name>
    <object-name>AmpMeter.001</object-name>
    <object-name>AmpMeter.002</object-name>
    <object-name>AmpMeterBcgnd.001</object-name>
    <object-name>AmpMeterBcgnd.002</object-name>
    <object-name>AmpMeterGlass.001</object-name>
    <object-name>AmpMeterGlass.002</object-name>
    <object-name>AmpNeedle.001</object-name>
    <object-name>AmpNeedle.002</object-name>
    <object-name>FuelPriming.001</object-name>
    <object-name>FuelPriming.002</object-name>
    <emission>
      <red>1</red>
      <green>1</green>
      <blue>1</blue>
      <factor-prop>controls/lighting/dome-norm</factor-prop>
    </emission>
  </animation>

<!-- Switch on'like -->
  <animation>
    <type>pick</type>
    <object-name>AirPump</object-name>
    <action>
      <button>0</button>
      <binding>
        <command>property-toggle</command>
        <property>controls/pneumatic/backup-air-pump/power</property>
      </binding>
    </action>
  </animation>

<!-- Lever Movement -->
  <animation>
    <type>rotate</type>
    <object-name>AirPumpLever</object-name>
        <property>controls/pneumatic/backup-air-pump/lever/position-norm</property>
    <factor>110</factor>
    <interpolation>
      <entry><ind>0</ind><dep>-30</dep></entry>
      <entry><ind>1</ind><dep>30</dep></entry>
     </interpolation>
    <axis>
      <x>0</x>
      <y>-1</y>
      <z>0</z>
    </axis>
    <center>
      <x-m>0.0074</x-m>
      <y-m>-0.0510</y-m>
      <z-m>0.0422</z-m>
    </center>
  </animation>

Je vous met le debut du fichier pour info, mais c'est la dernière partie :
<!-- Lever Movement -->
qui nous interesse.


.................. à suivre

j'arrête là pour l'instant afin de permettre à Fabien de corriger les erreurs et expliquer................

je met juste la suite pour préparer notre prochaine séance du tuto.................

LA GESTION DU VA-ET-VIENS DU LEVIER
Regardons la deuxième partie de notre fichier nasal du Boeing747 :

# ==============
# Animations
# ==============

var wiperl = func {
	if (getprop("controls/electric/wiperl/switch") == 1 or getprop("controls/electric/wiperl/switch") == 2){
		if (getprop("controls/electric/wiperl/position-norm") == 1 or getprop("controls/electric/wiperl/position-norm") == 0){
			Boeing747.doorsystem.door1export();
		}
 	}
 	if (getprop("controls/electric/wiperl/switch") == 0){
 		if (getprop("controls/electric/wiperl/position-norm") == 1){
 			Boeing747.doorsystem.door1export();
 		}
 	}
	if (getprop("controls/electric/wiperl/switch") == 1){
		doorsystem.door1.swingtime = 0.75
	}
	if (getprop("controls/electric/wiperl/switch") == 2){
		doorsystem.door1.swingtime = 0.49
	}

	settimer(wiperl, 0);
}
_setlistener("/sim/signals/fdm-initialized", wiperl);

var wiperr = func {
	if (getprop("controls/electric/wiperr/switch") == 1 or getprop("controls/electric/wiperr/switch") == 2){
		if (getprop("controls/electric/wiperr/position-norm") == 1 or getprop("controls/electric/wiperr/position-norm") == 0){
			Boeing747.doorsystem.door2export();
		}
	}
	if (getprop("controls/electric/wiperr/switch") == 0){
		if (getprop("controls/electric/wiperr/position-norm") == 1){
			Boeing747.doorsystem.door2export();
		}
	}
	if (getprop("controls/electric/wiperr/switch") == 1){
		doorsystem.door2.swingtime = 0.75
	}
	if (getprop("controls/electric/wiperr/switch") == 2){
		doorsystem.door2.swingtime = 0.49
	}

	settimer(wiperr, 0);
}
_setlistener("/sim/signals/fdm-initialized", wiperr);

Dernière modification par Didier1963 (2015-10-10 22:05:02)


Pourquoi cet avatar : il a réussi à les arrêter LUI au moins.......
Amicalement, Didier, Poitiers 86; LFBI alt 129m, 46°35'22.9"N 0°18'32.7"E
"Ils ne savaient pas que c'était impossible, alors ils l'on fait" Marc Twain

Hors ligne

Pied de page des forums

Propulsé par FluxBB 1.4.8