Construire son propre instrument pour l'Akoya

Voir le sujet précédent Voir le sujet suivant Aller en bas

Construire son propre instrument pour l'Akoya

Message  Didier1963 le Sam 25 Mai 2013 - 12:51

Bonjour à tous,

je vous propose, surtout pour les newbee comme moi, de vous expliquer "Live" comment je fait (plutôt, comment je vais faire), mon altimêtre.

Les petites erreurs serrons corrigées au fur et à mesure en ré-éditant ce texte.

LE FICHIER XML pour l'Altimètre:
Il y a plusieurs manières d'obtenir un instrument dans FlightGear (FG), de même qu'il y a plusieurs manière de modéliser ou de faire un graphisme (UV).
Je vous en explique une, mais vous pourrez aller jeter un petit coup d'oeuil dans les dossiers des autre avions pour voir comment cela fonctionne, et regarder sur les différent forum (flightgear.org par exemple).
Pour avoir notre instrument, il nous faut déjà créer une (instrument en 2D) ou plusieurs surfaces (3D) pour y appliquer ensuite une texture, et enfin, créer un fichier texte en language Xml (eXtended Markup Language ou langage de balisage extensible), qui va dire à FG quoi faire.
Je reviendrai plus loin sur la modélisation 3D avec Blender et sur le graphisme.
Les windosiens pourront utiliser Notepad++ qui est très pratique car mettant en évidence les fameuses balises de début et de fin.
Pour ma part, j'utilise Gedit sous Ubuntu.
Nous allons d'abord préparer l'endroit ou mettre nos fichier. Pour une question d'organisation et pour q'une personne voulant réutiliser ou modifier notre création puisse s'y retrouver, nous utiliserons le principe de l'arbre et de ses branche, qui elles-même ont des sous branches, qui ont des sous-sous branches............ etc.
là encore, il y à plusieurs façons de procéder, nous utiliserons celle d'un développeur qui à a son actif une dizaines...... centaines..... milliers..... enfin bref, beaucoup de création d'avion.
Dans le dossier "MonAvion" (/Aircraft/MonAvion), nous devrions trouver un dossier contenant les modèles 3D qui s'applele........... "Models"......hé oui, aussi difficile que ça ! Vous remarquerez que les noms de dossiers commencent par une majuscule pour différencier les dossier des fichiers.
Dans le dossier /Aircraft/MonAvion, il devrai y avoir un dossier pour les éléments se situant à l'intérieur s'appelant............? devinez......... "Interior"!! Ha, bien, je voit qu'il y en a qui suivent !
Ensuite, suivant le type et la complexité de l'avion, on pourra trouver :
/Aircraft/MonAvion/Model/Interior/Cabine, pour la cabine passager des liners par exemple;
/Aircraft/MonAvion//ModelInterior/Cockpit, pour la cabine de pilotage;
......etc.
Dans notre cas, c'est un avion relativement simple donc nous aurons directement un dossier "Panel" pour notre tableau de bord /Aircraft/MonAvion/Model/Interior/Panel, dans lequel ...................... hé oui "Instruments".
Donc nous pouvons faire un nouveau dossier pour notre altimètre, dans notre cas précis :
/Aircraft/LISA-Akoya/Model/Interior/Panel/Instruments/Altimeter.
Voilà, la place est prête pour notre fichier Xml et ses deux copains "altimeter.ac" (la 3D) et altimeter.png (le graphisme).
On ouvre notre éditeur préféré et on créé un fichier que l'on va appeler "altimeter.xml" que l'on enregistre tout de suite sous :
/Aircraft/LISA-Akoya/Model/Interior/Panel/Yoke/altimeter.xml ?????????

Haaaa, bravo, je voit que vous suivez, hé non, le dossier "Yoke" c'est pas bon, le yoke (manche) n'étant pas un instrument, on l'a mis dans le dossier "Interior"puisqu'il se situe............. à l’intérieur , et si il s'appelle Yoke, c'est pour y mettre les trois fichiers pour le manche. Donc, on enregistre notre dossier sous :
/Aircraft/LISA-Akoya/Model/Interior/Panel/Instruments/Altimeter/altimeter.xml.
la première ligne que l'on va mettre, va servir au PC de savoir à quel genre de fichier il a affaire
Code:
<?xml version="1.0" encoding="UTF-8"?>
on lui dit que ce fichier est en Xml et on lui donne la version et le type d'encodage. Si on veux mettre du texte de commentaire en français (donc avec des accents et autre joyeuseté) on poura mettre à la place
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
On prendra l'habitude, entre chaque balise, de mettre au mois une ligne vide pour plus de clarté. Nous allons pouvoir ouvrir notre première balise. chaque système de balise comprend une balise d'ouverture "<Balise>" et une balise de fermeture "</Balise>", on pourra trouver quelque foi une version courte "
Code:
<Balise> LesInstructions />".
donc notre 3ème ligne que l'on fera partir du bord gauche
Code:
<Property>
et on aura, à la fin de notre fichier, une balise
Code:
</Property>
ce qui nous donne pour l'instant
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Property>

</Property>
Pour une question de clarté, la disposition des balises se fera de cette manière
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Property>

<!-- là je peux mettre un commentaire, ne pas oublier les signes de début et fin de chaque coté de ce texte
qui peu faire plusieurs lignes,
                          et comporter des espaces ou des signes divers sauf celui ci -->

    <BaliseMachinChose>
    LesInstructions
        <SousBaliseTruckMuche>
        LesInstructions
        </SousBaliseTruckMuche>
    </BaliseMachinChose>

<!-- là je peux mettre un autre commentaire -->

    <BaliseBidule>
    LesInstructions
        <SousBaliseTruckMuche>
        LesInstructions
        </SousBaliseTruckMuche>
    </BaliseBidule>

</Property>
on prendra l'habitude de décaler chaque nouvelle balise pour mieux s'y retrouver quand on recherche une erreur, par deux espaces (là j'ai doublé le nombre pour que vous voyez mieux).
Certains utilise les tabulations, mais il est préférable d'utiliser les espaces (Windows, par exemple, gère mal les tabulations).
De même, pour le même jeu de balises, la balise de fin devrai être à la même distance du bord gauche que la balise de début.

La suite après le casse-croute.................................

une petite mise en bouche peut-être pour l'apéro ?????




Dernière édition par Didier1963 le Mer 29 Mai 2013 - 19:19, édité 1 fois
avatar
Didier1963
Le baron rouge

Messages : 409
Date d'inscription : 22/02/2012
Age : 53
Localisation : Bourgogne, LFLH

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Construire son propre instrument pour l'Akoya

Message  Didier1963 le Mar 28 Mai 2013 - 23:48

Bon, plusieurs "casse croûtes" sont passés, on peux donc continuer...........

Maintenant que nous avons notre fichier Xml avec son entête, sa balise <Property> et, à la fin sa balise </Property>, on va pouvoir remplir le milieu.
Nous allons d'abord dire à FG quel fichier .ac contiens la modélisation 3D :
Code:

<?xml version="1.0" encoding="UTF-8"?>

<!-- ============================>>
<<                                                                      >>
<<                  LISA-Akoya-YASim & Xml              >>
<<                  by Lionel Adam (F-GTUX)          >>

<<                      3D, UVs & Xml                >>
<<              Didier Bourguet (didier1963)        >>

<<                    Team M88 - April 2013          >>

<<=============================-->

<Property>

    <path>altimeter.ac</path>
<!--
pour la suite de ce tuto et jusqu"à la fin, je continuerai à mettre les espaces double pour que vous puissiez mieux voir, mais sachez que vous pourrez en mettre moitié moins
-->
<!--Vous aurez remarqué le petit clin d'oeuil à la façon de mettre des commentaire dans le fichier Xml, que je viens d'utiliser-->
Le petit cartouche avec les auteurs, c'est plus pour le fun, ce n'est pas obligatoire.

Si le fichier .ac se trouve dans un autre dossier, il suffit de lui mettre les chemin devant le nom du fichier.ac.
Maintenant, nous allons lui donner la liste des objets présent dans la modélisation, que nous souhaitons utiliser, attention de ne pas en oublier.
Petite astuce très pratique utilisée par certains développeurs, on met les objets opaques en premier, et les objets transparents à la fin.
Vous allez voir tout de suite pourquoi dans le paragraphe qui suit celui-ci.
Code:

    <animation>

<!-- Objets Opaques -->

      <object-name>Bezel</object-name>
      <object-name>Bgnd</object-name>
      <object-name>Needle100</object-name>
      <object-name>Needle1000</object-name>
      <object-name>KnobInhg</object-name>
      <object-name>InhgBgnd</object-name>

<!-- Objets transparents -->

      <object-name>Glass</object-name>
    </animation>
Un petit commentaire sert à s'y retrouver pendant le développement (imaginez un instrument, un PFD par exemle, avec une cinquantaines d'objets, placés en plusieurs groupes de fonction), et à montrer au futur visiteur de votre fichier ce que vous faites.

Nous lui indiquons les objets qui ne doivent pas générer d'ombre,
C'est là qu'est l’intérêt de mettre les objets transparent à la fin :
un petit copier-coller et hop
Code:

    <animation>
        <type>noshadow</type>
        <object-name>Alt-Glass</object-name>
    </animation>

puis les objets qui doivent renvoyer des reflets :
Code:

    <animation>
        <type>shader</type>
        <shader>chrome</shader>
        <texture>Aircraft/Generic/Effects/glass_shader.png</texture>
            <object-name>Alt-Glass</object-name>
            <object-name>Bezel</object-name>

    </animation>
et encore un petit coup de copier-coller.
Jusque là, nous ne lui avons pas dit quoi faire, point de vue rendu des couleurs, avec les autres objets.
Par défaut, Il va donc leurs appliquer la lumière ambiante suivant l'heure de la journée.
Midi, lumière maxi, donc quantité de couleur maxi;
Minuit, lumière mini, quantité de couleur mini.

Mais nous voulons que le fond de l'altimètre (Bgnd) et les aiguilles (Needle) s'éclairent quand le tableau de bord est allumé, donc nous lui indiquons comme ceci :
Code:

    <animation>
        <type>material</type>
        <object-name>Alt-Bgnd</object-name>
        <object-name>Alt-Needle100</object-name>
        <object-name>Alt-Needle1000</object-name>
        <object-name>Alt-InhgBgnd</object-name>
        <emission>
            <red>0.50</red>
            <green>0.25</green>
            <blue>0.25</blue>
            <factor-prop>systems/electrical/outputs/instrument-lights</factor-prop>
          </emission>
    </animation>
donc, quand la condition "systems/electrical/outputs/instrument-lights" (allumage des instruments de bord) est présente, il va mettre les émissions de rouges à 50%, les verts et les bleus à 25%.
Si j'avait mit mon entourage (Bezel) dans la liste, il serai aussi apparu éclairé (si,si, je m'avait trompé le premier coup et j'ai eu la surprise de le voir dans la nuit avec ses copains fond et aiguilles!!).

Pas besoin de lui dire qui doit être transparent, cela a été fait dans le fichier altimeter.ac.

Voilà, maintenant que la famille a été présentée, nous allons pouvoir lui dire qui, et comment les animer.
L'aiguille des centaines :
................. centaines de quoi? Et bien justement, on va aussi lui dire
Code:

  <animation>
    <type>rotate</type>
    <object-name>Needle100</object-name>
    <property>/instrumentation/altimeter/indicated-altitude-ft</property>
    <factor>0.36</factor>
    <center>
      <x-m>0</x-m>
      <y-m>0</y-m>
      <z-m>0</z-m>
    </center>
    <axis>
      <x>-1</x>
      <y> 0</y>
      <z> 0</z>
    </axis>
  </animation>

Vous avez vu, le nom de l'objet?, c'est préférable que la désignation soit claire pour mieux s'y retrouver.

nous avons donc, une animation, de type rotation, s'appliquant à l'objet "Needle100", dont la valeur de la variable va dépendre de la propriété "/instrumentation/altimeter/indicated-altitude-ft" (les centaines ! Hé bien voilà, ce sont des "Feet" (pieds)), l'aiguille se déplacera de 0.36° par pied, le centre où se place le point de référence de l'objet aiguille est à 0 dans les trois axes (soit un vecteur de 0,0,0. ** merci Dany93), vu que l'aiguille est au centre d'un objet circulaire, et fera un rotation de -1 sur l'axe des x a chaque 0.036° soit 1 pied.
On a du bol, z'avez vu les graduations plus haut sur la photo?
C'est gradué de 0 a 10 de façon linéaire (même espace entre les graduation du début à la fin), donc comme indiqué (x100, haaa oui, j'avais oublié, c'est un peu effacé à gauche du cadran! le dessin est encore un brouillon), un tour équivaut à 1000 pieds. 360° divisé par 1000 = 0.036 !!!!!!
on peux faire de même pour l'aiguille des milliers.......... de pieds, avec un facteur de 0.36
Code:

    <animation>
        <type>rotate</type>
        <object-name>Needle1000</object-name>
        <property>/instrumentation/altimeter/indicated-altitude-ft</property>
        <factor>0.036</factor>
        <center>
            <x-m>0</x-m>
            <y-m>0</y-m>
            <z-m>0</z-m>
        </center>
        <axis>
            <x>-1</x>
            <y> 0</y>
            <z> 0</z>
        </axis>
  </animation>
et voilà, ça marche !
Hein ? le bouton rond ?
Haaaaa, oui, l'étalonnage avant le décollage !
Hé bien il n'est pas tout seul, il fonctionne avec sa petite copine la couronne graduée. (en inhg, pour notre exemple, de 27,5 à 31)
Code:

  <animation>
    <type>rotate</type>
    <object-name>InhgBgnd</object-name>
    <property>/instrumentation/altimeter/setting-inhg</property>
    <factor>1</factor>
    <interpolation>
      <entry><ind> 27.50 </ind><dep>  0.00 </dep></entry>
      <entry><ind> 28.00 </ind><dep>  48.6 </dep></entry>
      <entry><ind> 28.50 </ind><dep>  98.86 </dep></entry>
      <entry><ind> 29.00 </ind><dep> 150.00 </dep></entry>
      <entry><ind> 29.50 </ind><dep> 201.20 </dep></entry>
      <entry><ind> 30.00 </ind><dep> 251.34 </dep></entry>
      <entry><ind> 30.50 </ind><dep> 301.25 </dep></entry>
      <entry><ind> 31.00 </ind><dep> 349.61 </dep></entry>
    </interpolation>
    <center>
      <x>0</x>
      <y>0</y>
      <z>0</z>
    </center>
    <axis>
      <x>1</x>
      <y>0</y>
      <z>0</z>
    </axis>
  </animation>
Là, nous utilisons une interpolation pour lui dire que la valeur 27,50 inhg se situe à 0°, jusqu’à' a 31° se situant à 349.1°.
Toujours avec le point de référence de la couronne à 0 en x, y, z (le vecteur sur lequel ce point doit se trouver). et rotation de 1 dans l'axe des x.
Dany me fait remarquer que, comme les graduation sont linéaire sur cette jauge-ci, on aurais put mettre simplement (merci Dany de me le rappeler), que la 1ère et la dernière ligne de l'interpolation :
Code:

    <interpolation>
      <entry><ind> 27.50 </ind><dep>  0.00 </dep></entry>
      <entry><ind> 31.00 </ind><dep> 350 </dep></entry>
    </interpolation>

Pourquoi, par exemple, 29,50 inhg est à 201,20 ?
Et bien, comme je ne suis pas bon du tout en math, j'ai ouvert mon image me servant pour appliquer les UV de la couronne dans Gimp, et en utilisant la fonction prévue, j'ai vu que la graduation 29,50 se situait à 201,20 en partant de 0 qui est au nord (en haut au milieu de l'image, ou position 12h d'une montre)

Dany93 nous a fait un petit calcul :
Pour ton tableau d'interpolation "InhgBgnd", je pense que tu peux être plus rigoureux (et plus simple) en observant que ta couronne graduée fait 360° pour l'intervalle 27.5 à 31.1 inhg.
Ceci donne 360/(31.1-27.5)= 100 degrés pour 1 inhg

le point de référence de la couronne placé à 0 dans les trois axes, car dans ma modélisation, j'ai décalé ce point vers l'avant (vers la vitre) de façon à ce que la couronne se trouve derrière le fond (oui, je me suis aussi fait avoir sur ce coup là!! ).
Sinon, si vous utilisez une modélisation toute faite et que vous ne savez pas le faire, si le point de référence de la couronne à été laissé dans son centre géographique, il suffit de corriger, dans le fichier Xml, et de lui mettre le <center> <x> à la valeur nécessaire.
Attention, pour une valeur métrique, il faut mettre un petit "-m" après les x, y et z :
Code:

  <center>
      <x-m>0.0259</x-m>
<!-- là, on déplace l'objet vers l'avant de 0.0056 mètre -->
      <y-m>0</y-m>
      <z-m>0</z-m>
    </center>

Et voilà, on peux mettre le bouton d'étalonnage qui va commander la couronne :
Code:

    <animation>
        <type>rotate</type>
        <object-name>KnobInhg</object-name>
        <property>/instrumentation/altimeter/indicated-altitude-ft</property>
        <factor>0.36</factor>
        <center>
            <x-m>0.005551</x-m>
            <y-m>-0.02455</y-m>
            <z-m>-0.02090</z-m>
        </center>
        <axis>
            <x>-1</x>
            <y> 0</y>
            <z> 0</z>
          </axis>
  </animation>

ça, s'est pour son mouvement de rotation (ça la pète mieux visuellement!!), vous aurez remarque qu'il est décalé par rapport au centre de l'instrument (0x, 0y, 0z), de 0.00551 mètres vers l'arrière (en allant vers la vitre), -0.02455 mètres (vers la gauche), et -0.02090 mètres (vers le bas).

Oui, c'est bien beau tout ça, mais on le fait tourner comment notre bouton ?
Hein? on peux pas mettre la main dans l'écran ?
Bon, tant-pis, on utilisera la souris !
Code:

  <animation>
        <type>pick</type>
        <object-name>KnobInhg</object-name>
        <action>
            <button>0</button>
            <repeatable>true</repeatable>
            <interval-sec>  0.1  </interval-sec>
            <binding>
                <command>property-adjust</command>
                <property>instrumentation/altimeter/setting-inhg</property>
                <step>  0.01  </step>
                <min>  27.50  </min>
                <max>  31.00  </max>
                <wrap>  0  </wrap>
            </binding>
        </action>
    </animation>

    <animation>
        <type>pick</type>
        <object-name>KnobInhg</object-name>
        <action>
            <button>1</button>
            <repeatable>true</repeatable>
            <interval-sec>  0.1  </interval-sec>
            <binding>
                <command>property-adjust</command>
                <property>instrumentation/altimeter/setting-inhg</property>
                <step>  -0.01  </step>
                <min>    27.50  </min>
                <max>    31.00  </max>
                <wrap>  0  </wrap>
            </binding>
        </action>
    </animation>

    <animation>
        <type>pick</type>
        <object-name>KnobInhg</object-name>
        <action>
            <button>3</button>
            <binding>
                <command>property-adjust</command>
                <property>instrumentation/altimeter/setting-inhg</property>
                <step>  0.01  </step>
                <min>  27.50  </min>
                <max>  31.00  </max>
                <wrap>  0  </wrap>
            </binding>
        </action>
    </animation>

    <animation>
        <type>pick</type>
        <object-name>KnobInhg</object-name>
        <action>
            <button>4</button>
            <binding>
                <command>property-adjust</command>
                <property>instrumentation/altimeter/setting-inhg</property>
                <step>  -0.01  </step>
                <min>    27.50  </min>
                <max>    31.00  </max>
                <wrap>  0  </wrap>
            </binding>
        </action>
    </animation>

</Property>

En gros, et c'est là que j'ai besoins des lumières des spécialistes, pour ce qui est entre **** ****,

Animation de type "pick" (prendre en français), l'objet "KnobInhg notre bouton, une action est attendue, elle se fait par le bouton de souris N°1 (clic gauche je pense), elle peut être répétée pour obtenir la même action, ***** interval entre deux clics de 0.1 seconde, je suppose*****, liaison qui effectue la commande "instrumentation/altimeter/setting-inhg" (ajustement altimètre réglage en inhg), avec un pas de -0.01 à chaque clic, valeur mini 27,50 (le minimum sur notre graduation, valeur maxi 31 (...... bhein oui, le maximum sur notre couronne !), ***** "wrap", heuuuuuuuuuuu, M'sieur s'il te plait ! *******.
Et vous avez vu, la dernière ligne !

Hé oui, nous en avons terminé avec notre fichier Xml !!!!!

Entre temps, Dany est passé par là pour me donner l'explication que je n'avais pas encore trouvée pour les boutons :

Code:

      <action>
            <button>0</button>
            <repeatable>true</repeatable>
            <interval-sec>  0.1  </interval-sec>
veut dire (je pense) clicgauche (<button>0</button>) maintenu, l'incrément se répète toutes les 0.1 sec.
(bouton 1 = Clic central Clic molette; bouton 2 = clic droit, évidemment non utilisé pour les contrôles d'instruments)
Sinon, des clics brefs successifs te donnent un incrément à la fois.
Dans ton exemple, le clic gauche (0) incrémente de +0.01, le clic droit (1) de -0.01.
Les "boutons" (3) et (4) sont les actions par rotation de la molette souris, (3) en poussant, (4) en tirant.
Ceci entre 27.50 et 31,
Code:

<wrap>  0  </wrap>
= sans tourner en rond (à 31, il faut revenir en arrière par clic droit pour redescendre vers 27.5)
Code:

<wrap>  1  </wrap>
donnerait un retour à 27.5 quand on atteint 31 (on "tourne en rond"). Ne correspondrait pas à la manière réelle de faire avec ce réglage de pression, mais intéressant pour le cadran d'un compas.

Bon, sinon, pour les clics souris, j'ai vu une autre manière de procéder, je vous dit ça la prochaine foi.
Pour l'instant, à vos palettes graphiques et une visite chez Blender pour la modélisation.............

Et voilà, vous avez réalisé un altimètre qui pourra être aussi utilisé dans d'autres avions en ajoutant au fichier Xml qui va bien,
généralement le fichier :

/Aircraft/LISA-Akoya/Models/Interior/Panel/panel.xml,
Code:

  <model>
    <path>Aircraft/LISA-Akoya/Models/Interior/Panel/Altimeter/altimeter.xml</path>
    <offsets>
      <x-m>-1.63</x-m>
      <y-m>-0.2869</y-m>
      <z-m>0.2663</z-m>
      <roll-deg>0</roll-deg>
      <pitch-deg>-35</pitch-deg>
      <heading-deg>7</heading-deg>
    </offsets>
  </model>

il cherchera le fichier altimeter.xml là ou on lui dit, il placera l'objet altimeter aux positions indiquées en x, y et z (en mètres) et le pivotera,
dans le sens aiguille de montre de 0°;
d'avant en arrière, -35°(vers l'avant);
de gauche à droite, 7° (vers la droite);
à suivre :
Les zones clickables;
Les jauge linéaires;
Les boutons marche arrêt.
avatar
Didier1963
Le baron rouge

Messages : 409
Date d'inscription : 22/02/2012
Age : 53
Localisation : Bourgogne, LFLH

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum