#1 [↑][↓] 09-07-2022 12:28:01

faf010
Membre
Lieu : LFQE Etain
Inscription : 30-05-2008
Renommée :   42 
Site Web

[MSFS] Action avec la souris pour faire afficher un objet 3D

Salut

je poursuis dans mon développement de l'avion, et j'ai encore un mur devant moi ... je savais que je n'aurais pas du prendre cette direction ... mais suis challenger

Je voudrais essayer de comprendre comment : Afficher une petite page , et choisir le fait par exemple de faire apparaitre ou disparaitre le copilole ou le pilote , ouvrir ou fermer la verrière ...

oui alors avec la souris de cliquer sur la verrière pour l'ouvrir ..

j'ai essayé de décortiquer le code du HN434 avec l'iphone ... mais je pense que je n'ai pas toute la ficelle ..

Si on pouvait avoir une explication ?

Merci=V

Alex

Dernière modification par faf010 (09-07-2022 12:34:10)

Hors ligne

#2 [↑][↓] 09-07-2022 15:26:49

Lagaffe
Membre
Lieu : LFPO / retraité
Inscription : 13-03-2008

Re : [MSFS] Action avec la souris pour faire afficher un objet 3D

Bonjour Alex,

Si je me lance dans tout ce que tu listes ... je vais y passer mon temps libre jusqu'à Noël prochain. D'autre part, si j'essaye de décortiquer tout ce que je sais ... que va-t il me rester ?

Afficher une page, un objet, etc ?
Afficher ou rendre invisible un élément s'obtient par le fait de modifier sa propriété de VISIBILITY.

Par exemple:
[img align=c]https://i.postimg.cc/g2LgzbfX/Savoia-avec-chariot.jpg[/img]

Dans le cas présent, j'ai 6 objets : les 4 roues, le chariot et les deux anneaux en fer pour tracter l'ensemble. Comme je ne vais pas traiter les 6 objets indépendamment les uns des autres, je me débrouille pour qu'il y en ait un qui soit le père (Mon fils, je suis ton père ..) et les autres seront rattachés à lui en tant que fils.
De cette façon, je ne gère la propriété VISIBILITY que du père et les fils suivront (c'était déjà ainsi sur FS9 ...).

Dans Blender, nous aurons les objets suivant avec les liens de parenté qui en découlent:

- Chariot
     |_ Anneaux
     |_Roue_Avant_Gauche
     |_Roue_Avant_Droite
     |_Roue_Arriere_Gauche
     |_Roue_Arriere_Droite

Pour cela dans le fichier XML qui gère l'avion, je créé un nouveau Composant:

<Component ID="Exterior_VISIBILITIES">
            <Component ID="Chariot_ID" Node="Chariot">
                <UseTemplate Name="ASOBO_GT_Visibility_Code">
                    <VISIBILITY_CODE>
                                                    (L:S21A_Chariot_Visibility, boolean) if{ 1 } els{ 0}
                                        </VISIBILITY_CODE>
                </UseTemplate>
            </Component>
        </Component>

Le nom attaché au ID peut être ce que l'on veut, même le libéllé du node (= nom de l'objet dans Blender).
La propriété de VISIBILITY est attaché à la valeur que peut prendre une variable local que je me suis définie:
- L: c'est comme cela que l'on définit la variable locale (A: c'est une variable Absolue du simulateur qui peut ou pas être modifiable)
- les variables L: sont modifiables
- le préfixe de la variable est un sigle court pour refléter l'avion incriminé: S21A cela permet de retrouver facilement les variables via les outils du DEV Mod
- Chariot c'est la pièce parente
- Visibility, c'est juste pour avoir plus d'infos sur cette variable (le Canso dispose de plus de 150 L:)
- C'est une variable booléenne donc qui vaut 0 (invisible) ou 1 (visible)

Comme ce sont des variables que je me suis défini, il faut en "bonne programmation" les initialiser. Dans le fichier panel/panel.cfg, je définie une jauge basique:

[VCockpit01]
Background_color=0,0,0
size_mm=1024,1024
visible=0
pixel_size=1024,1024
gauge00=Gauge_S21A!S21A_Init.xml, 0, 0, 1, 1

La jauge s'appelera S21A_init.xml et contiendra:

<Gauge Name="Initialisatons" Version="1.0">

<Comment>
INITIALIZATION IN ANY CASE
</Comment>

<Element>
   <Select>
      <Value>
        (L:S21A_Init, boolean) 0 ==
        if{
            <!-- Avion au sol -->
            (A:SIM ON GROUND, boolean) 1 ==
            if{
                1 (&gt;L:S21A_Chariot-Visibility, boolean)
                        }                                                                           <!-- j'avais oublié celle-ci -->
        }
                   1 (&gt;L:S21A_Init, boolean)
      </Value>
   </Select>
</Element>

</Gauge>

Là, je défini une seconde variable (la plus importante) qui est L:S21A_Init et qui renseigne le simu pour savoir sin on est passé ou pas par cette séquence de code.
Une fois que mes initialisations sont faites, je modifie la variable en mettant 1 pour que la séquence de code ne soit pas ré-exécutée. Les jauges sont exécutées à 18hz soient 18 fois par seconde ! sauf si via la bonne balise on modifie cette période.

Cette séquence d'initialisation peut se faire différemment, par exemple dans le fichier XmL de l'avion via un autre Model Behavior qui est écrit de manière à n'être exécuté qu'une seule fois.

Ensuite comment modifier cette variable pour qu'elle change de valeur via un clic souris par exemple ?
Pour que l'exemple soit plus exhaustif, je mettrais cette fois, un bout de code en Legacy, comme quoi on peut mêler Legacy et Model Behavior mais à condition de ne pas mettre deux codes pour la même fonction.

<Animation guid="f1ba42a5-285b-492d-a65e-ff9a4c7f61dc" length="50" name="S21A_Chariot_Event" type="Sim" typeparam="AutoPlay" typeparam2="S21A_Chariot_Event"/>
        <PartInfo>
            <Name>S21A_Chariot_Event</Name>
            <AnimLength>50</AnimLength>
            <Animation>
                <Parameter>
                    <Code>
                        (L:S21A_Chariot_Visibility, boolean) 50 *
                    </Code>
                    <Lag>200</Lag>
                </Parameter>
            </Animation>
            <MouseRect>
                <Cursor>Hand</Cursor>
                <CallbackCode>
                    (L:S21A_Chariot_Visibility, boolean) 1 == if{ 0 (&gt;L:S21A_Chariot_Visibility, boolean) }
                </CallbackCode>
            </MouseRect>
        </PartInfo>

Ici, le nom de l'animation correspondant à la zone à cliquer (le chariot) est S21A_Chariot_Event. L'animation est sur 50 keyframes et elle dépend de la variable définit plus haut:
On associe à cette action une suite de tag "MouseRect" et un curseur en forme de main avec un doigt tendu (Hand).
Le fait de cliquer sur l'objet, fait changer d'état la variable  L:S21A_Chariot_Visibility :
- si elle valait 0, elle passe à 1
- si elle valait 1, elle passe à 0

Lorsque L:S21A_Chariot_Visibility passe à) 1, le fait de multiplier par 50 passe l'animation de la keyframe 0 à ... 50 CQFD


C'est un exemple, décortiqué rapidement mais on voit que pour un truc simple, cela commence à faire pas mal de code donc pour des trucs plus compliqué, je te laisse imaginer wink

PS:
A) J'ai écrit cet exemple de zéro, en prenant des bouts de droite et de gauche, je ne l'ai pas essayé. Comme il me faut gérer mon chariot pour le Savoia, si jamais je modifie une chose, je répercuterais dans le message les modifications apportées.

B) Quitte à regarder un code, il y a aussi celui du Canso qui est beaucoup plus complet ... et compliqué w00t


@+ Didier
mini-Logo-Beaver-small.jpg
W10 Pro 64b Build 22H2 - Boitier HAF 932 - Z390 STRIX-F - 9900K - 2x16 Go - NVidia 3060 Ti 8 Go - Alim Corsair 800W - Ecran 34" - NVidia Studio ready 536.23
P3D v5.4 = http://www.pilote-virtuel.com/img/members/53/P3Dv5HF-Reglages-A.jpg - MSFS Deluxe/STORE - X-Plane 12B

Hors ligne

#3 [↑][↓] 10-07-2022 09:10:53

faf010
Membre
Lieu : LFQE Etain
Inscription : 30-05-2008
Renommée :   42 
Site Web

Re : [MSFS] Action avec la souris pour faire afficher un objet 3D

Salut Didier,

Merci pour ce temps passé pour l'explication , je commence à comprendre ....

Pourquoi passer par le panel.xml  ? est ce que cela affiche quelque chose dans le cokpit ? comme pour ta gauge HN433 avec l'iphone ? ou meme sans rien n'afficher il faut passer par là ?

Alex

Hors ligne

#4 [↑][↓] 10-07-2022 09:53:12

Lagaffe
Membre
Lieu : LFPO / retraité
Inscription : 13-03-2008

Re : [MSFS] Action avec la souris pour faire afficher un objet 3D

Le panel.cfg permet de créer des jauges actives (correspondant à un instrument) mais aussi des jauges qui n'ont aucune sortie graphique à l'écran comme celle-ci.
Cette façon de faire ne date pas d'hier, déjà sur FS9, pas mal de gens pratiquait comme cela.

Comme je l'ai écrit, maintenant avec MSFS, il y a d'autres manière de pratiquer mais beaucoup plus compliquée.
Asobo a introduit un Template ASOBO_GT_Update que l'on peut utiliser de deux façons:

A) Sous forme d'initialisation de valeurs :

<UseTemplate Name="ASOBO_GT_Update">
                    <UPDATE_ONCE>True</UPDATE_ONCE>
                    <UPDATE_CODE>
                                (L:S21A_Init, boolean) 0 ==  if{
                                                              (A:SIM ON GROUND, boolean) 1 ==  if{
                                                                        1 (&gt;L:S21A_Chario-Visibility, boolean)
                                                               }
                                                          }
                                                          1 (&gt;L:S21A_Init, boolean)
                    </UPDATE_CODE>
                </UseTemplate>

Cet exemple est créé de toutes pièces (j'en ai profité pour corriger une } qui manquait dans mon post d'hier, lorsque on ouvre un if{ il faut impérativement le refermer par } .

B) Pour mettre à jour des variables avec une fréquence autre que celle par défaut:

<UseTemplate Name="ASOBO_GT_Update">
                <FREQUENCY>9</FREQUENCY>
                <UPDATE_CODE>
                (A:PROP MAX RPM PERCENT:2, percent) 70 &lt; if{
                                         0 (&gt;L:EngineExhaustStatus2)
                                         }
                els{
                    (A:GENERAL ENG MIXTURE LEVER POSITION:2, Percent) 20 &lt; if{ 1 (&gt;L:EngineExhaustStatus2) }
                    els{ (A:GENERAL ENG MIXTURE LEVER POSITION:2, Percent) 78 &lt; if{ 2 (&gt;L:EngineExhaustStatus2) }
                    els{ 3 (&gt;L:EngineExhaustStatus2) }
                    }
                }
                </UPDATE_CODE>
            </UseTemplate>

Là, on met à jour les variables définies pour les flammes des posts d'échappement (issu du Canso).

La période de base étant 18 Hz, j'essaye de prendre des multiples de 18 (9, 18, 36, etc) pour que cela tombe sur des "calculs ronds". Le moteur a une horloge interne et calcule des occurrences qui sont des sous-multiples ou des multiples de cette fréquence, utiliser une valeur ne respectant ces conditions peut donner des affichages ... bizarres.

Tout ceci a été appris sur le tas, avec le Notepad et en décortiquant les avions de base ou ceux que je me suis procuré en freeware, car tout cela n'est pas dans la doc .... bien au contraire. Simplement, cela prend un temps fou donc s'armer de patience et ne pas hésiter à fouiller les Tempslates qui sont des "poupées russes" à plusieurs niveaux (parfois plus de 4 niveaux).

Nota:
Dans les notations tu trouveras :
&gt; et &lt;
ou
> et <
qui sont respectivement équivalentes. Sur FS9 et les autres simus,  on utilisait la première forme de notation.

J'ai posé la question à ASOBO (forum Q&A), il semblerait qu'ils nettoient le code pour conserver à l'avenir la seconde notation. Ceci dit, les deux sont acceptées et pas mal de monde utilise encore la première forme (LionHearth, Anthony Lynch, Milviz, etc).


@+ Didier
mini-Logo-Beaver-small.jpg
W10 Pro 64b Build 22H2 - Boitier HAF 932 - Z390 STRIX-F - 9900K - 2x16 Go - NVidia 3060 Ti 8 Go - Alim Corsair 800W - Ecran 34" - NVidia Studio ready 536.23
P3D v5.4 = http://www.pilote-virtuel.com/img/members/53/P3Dv5HF-Reglages-A.jpg - MSFS Deluxe/STORE - X-Plane 12B

Hors ligne

#5 [↑][↓] 10-07-2022 09:56:13

faf010
Membre
Lieu : LFQE Etain
Inscription : 30-05-2008
Renommée :   42 
Site Web

Re : [MSFS] Action avec la souris pour faire afficher un objet 3D

merci Didier !!!

je vais tester en faisant apparaitre et disparaitre un objet sur l'avion pour mettre en pratique ce code .. ou mouvement à ce que j'ai compris

Alex

Hors ligne

#6 [↑][↓] 10-07-2022 10:18:05

Lagaffe
Membre
Lieu : LFPO / retraité
Inscription : 13-03-2008

Re : [MSFS] Action avec la souris pour faire afficher un objet 3D

Et oui, le click souris sur une zone doit être considéré comme une animation/action.

Tu peux aussi définir un cube et lui associer la propriété "MSFS_Invisibility", de sorte que le cube devient de couleur rouge transparente et utiliser ce cube comme zone de click souris. On peut prendre aussi un objet réel mais tout simple comme une plaque avec l'immatriculation.

Par exemple dans le Canso:

Là, je gère le mouvement du levier magneto droite via ma variable locale L:PBV_MagnetoRight. Right_Engine_Magneto est le nom du levier dans Blender.

<Component ID="Right_Engine_Magneto" Node="Right_Engine_Magneto">
                <UseTemplate Name="ASOBO_GT_Anim_Code">
                    <ANIM_NAME>switch_magneto_right</ANIM_NAME>
                    <ANIM_CODE>(L:PBV_MagnetoRight, number) 20 *</ANIM_CODE>
                    <ANIM_LENGTH>60</ANIM_LENGTH>
                    <ANIM_LAG>200</ANIM_LAG>
                    <NODE_ID>magneto_Right</NODE_ID>
                    <WWISE_EVENT></WWISE_EVENT>
                </UseTemplate>
            </Component>

Içi, Right_Magneto_Mouse est le nom dans Blender associé au cube "invisibility" qui entoure le levier magneto droite mais il n'y a pas besoin de lien de parenté entre ce cube le le levier: tout se passe par le biais des variables.

<Component ID="Right_Magneto_Mouse" Node="Right_Magneto_Mouse">
                <UseTemplate Name="ASOBO_GT_MouseRect">
                    <DRAG_DELTA>0.1</DRAG_DELTA>
                    <DRAG_SCALAR>0.1</DRAG_SCALAR>
                    <TOOLTIPID>Right Magneto: %((L:PBV_MagnetoRight, number))%{case}%{:0}OFF%{:1}1%{:2}2%{:3}BOTH%{end}</TOOLTIPID>
                    <CURSOR>Hand</CURSOR>
                    <MouseFlags>LeftAll+WheelUp+WheelDown</MouseFlags>
                    <CALLBACKCODE>
                        (M:Event) 'WheelUp' scmi 0 == if{
                            (L:PBV_MagnetoRight, number) 3 &lt; if{ (L:PBV_MagnetoRight, number) ++ (>L:PBV_MagnetoRight, number) }
                            (>K:MAGNETO1_INCR)
                        }
                        (M:Event) 'WheelDown' scmi 0 == if{
                            (L:PBV_MagnetoRight, number) 0 &gt; if{ (L:PBV_MagnetoRight, number) -- (>L:PBV_MagnetoRight, number) }
                            (>K:MAGNETO1_DECR)
                        }
                        (M:Event) 'LeftSingle' scmi 0 == if{
                            (L:PBV_MagnetoRHMode, boolean) ! if{ (L:PBV_MagnetoRight, number) ++ (>L:PBV_MagnetoRight, number) (>K:MAGNETO1_INCR) }
                            (L:PBV_MagnetoRHMode, boolean) if{ (L:PBV_MagnetoRight, number) -- (>L:PBV_MagnetoRight, number) (>K:MAGNETO1_DECR) }
                        }
                    </CALLBACKCODE>
                </UseTemplate>
            </Component>

Le click sur le cube provoque l'animation/action qui ensuite entraine le changement de valeurs des variables et le levier étant géré par les évènements "MAGNETO1_DECR/MAGNETO1_INCR".
Les évènements sont décrits dans le SDK. Ce sont des changements particuliers de variables A: ... encore un truc à potasser solv_gif

Tout cela à remettre dans le contexte de ma première réponse: oui, mais ta question n'entraine pas une simple réponse mais un ensemble complexe de points à comprendre.


@+ Didier
mini-Logo-Beaver-small.jpg
W10 Pro 64b Build 22H2 - Boitier HAF 932 - Z390 STRIX-F - 9900K - 2x16 Go - NVidia 3060 Ti 8 Go - Alim Corsair 800W - Ecran 34" - NVidia Studio ready 536.23
P3D v5.4 = http://www.pilote-virtuel.com/img/members/53/P3Dv5HF-Reglages-A.jpg - MSFS Deluxe/STORE - X-Plane 12B

Hors ligne

#7 [↑][↓] 10-07-2022 17:27:30

faf010
Membre
Lieu : LFQE Etain
Inscription : 30-05-2008
Renommée :   42 
Site Web

Re : [MSFS] Action avec la souris pour faire afficher un objet 3D

mad2_gif=V=V bon ca se fait pas comme ça ... va falloir réfléchir ....

je vais essayer un truc simple voir comment cela se comporte et on montra un peu le niveau lol

Alex

Dernière modification par faf010 (10-07-2022 17:28:14)

Hors ligne

#8 [↑][↓] 10-07-2022 19:07:42

Lagaffe
Membre
Lieu : LFPO / retraité
Inscription : 13-03-2008

Re : [MSFS] Action avec la souris pour faire afficher un objet 3D

Je te l'avais dit: ces trucs n'ont été écrit nulle part.
Il faut prendre les avions disponibles et les décortiquer voire faire du "reverse engineering" pour pouvoir comprendre comment ils marchent.

Et je peux t'affirmer que j'ai passé quelques heures pour comprendre cela  : au bas mot plus de 2 mois à raison de 4h par jour, bon cela occupe en cas de retraite mais bon c'est un investissement solv_gif


@+ Didier
mini-Logo-Beaver-small.jpg
W10 Pro 64b Build 22H2 - Boitier HAF 932 - Z390 STRIX-F - 9900K - 2x16 Go - NVidia 3060 Ti 8 Go - Alim Corsair 800W - Ecran 34" - NVidia Studio ready 536.23
P3D v5.4 = http://www.pilote-virtuel.com/img/members/53/P3Dv5HF-Reglages-A.jpg - MSFS Deluxe/STORE - X-Plane 12B

Hors ligne

Pied de page des forums