mercredi 29 avril 2020

Inverse kinematics et tourelle de tank

Petite démo d'une simulation inverse kinematics pour préparer ma tourelle de tank. Par rapport à mes précédents essais, j'ai ajouté des contraintes de rotation afin que la tourelle ne puisse que tourner sur l'axe Z, tandis que le canon est limité a 40° dans l'axe Y. Je peux ensuite animer l'ensemble à l'aide d'une contrainte IK qui va faire pointer le canon vers un os (que je fais marcher sur un chemin). Le résultat, une belle (enfin, une moche) tourelle !

Prochaine étape : lui faire tirer des projectiles.

lundi 27 avril 2020

Encore 7 jours pour essayer tout un tas de modules gratuits sur DCS World

Depuis 1 semaine, DCS propose la plus grande partie de ses modules gratuitement, pour 2 semaines (ce qui nous laisse donc 1 semaine, si mes calculs sont justes). C'est l'occasion de tester tout un tas de modules pour lesquels on n'aurait pas forcément cassé sa tirelire, mais également pour la petite minorité qui fait tourner DCS sous Linux de vérifier si le module fonctionne avant de l'acheter.

J'avais donc l’œil fermement dirigé vers le JF-17, apparemment particulièrement bien modélisé, et je me suis empressé de le télécharger. Petite déception: autant l'avion fonctionne impeccable, autant j'ai chez moi des freezes systématiques dès que je veux quitter la mission, ce qui est un petit peu gonflant. Exit donc le JF-17.

Je zieutais également la carte Normandie, malgré des avis plutôt mitigés, histoire de donner un peu vie au P-51D. Là encore, déception : non seulement la carte (vendue 8 balles) ne suffit pas car il faut également le pack WW2 (hop, 25 balles supplémentaires), mais surtout, chez moi encore (ne généralisons pas!), impossible de charger la carte au sein du jeu, j'ai un freeze. Exit donc la carte Normandie, comme quoi j'ai bien fait d'essayer avant d'acheter.

Un autre module que je voulais essayer, c'est le FW-109, avion de la 2ème guerre mondiale, côté Allemand. Une fois passé la gêne de combattre pour les Nazis, le fait est que c'est un très bel avion, probablement bien plus aisé à prendre en main que le Mustang, ce qui ne m'empêche pas par ailleurs de me faire descendre en moins de 2. Belle bête donc, mais Nazi + 40 balles = grosse hésitation quand j'ai déjà le Mustang pour jouer. Ceci dit, pour quelqu'un qui n'aurait pas encore de warbird mais qui voudrait en faire, très bonne option.

Avec également des problèmes de chargement au niveau de l'A-10 et du F-16, c'est finalement assez décevant ! J'ai l'impression d'avoir eu beaucoup de chance que les modules que j'ai achetés sans avoir testé avant, soit le M-2000, le F-18 et le P-51D, fonctionnent très bien.

vendredi 17 avril 2020

Animation d'un tank dans Blender

Voici un sujet qui a fait couler beaucoup d'encre virtuelle ! Si animer une chenille dans une seule direction est quelque chose de relativement aisé, cela devient incroyablement plus complexe lorsqu'il s'agit de permettre le déplacement dans n'importe quelle direction, avec en plus la gestion du différentiel lors des rotations. Ce tutoriel reprend les techniques de base d'animation des chenilles, alors que celui là propose carrément de simuler une chenille en utilisant le moteur physique !

C'est finalement une approche de suivi de chemin décrite dans le premier tutoriel que j'ai sélectionnée. Ça marche plutôt pas mal, même si cela ne gère pas le différentiel entre les chenilles gauche et droite. Ceci dit, je suppose qu'il doit être possible d'ajuster le driver pour prendre en compte cette rotation. Ça reste un fudge, mais cela devrait être amplement suffisant pour ce que je vais en faire.

mercredi 15 avril 2020

DCS - Faire fonctionner les interrupteurs du Warthog Hotas - Un exemple avec le P-51D

C'est pas tout d'avoir tout plein de boutons sur la manette, mais encore faut-il pouvoir s'en servir !

La principale difficulté avec la manette du Warthog Hotas est de configurer correctement les interrupteurs à 2 ou 3 positions. En effet, contrairement à un bouton que l'on pousse, et qui envoie une impulsion, les interrupteurs sont soit en position fermée, et alors ils envoient un signal continu, ou en position ouverte, et ils n'envoient pas de signal. Sans configuration spécifique, cela donne de drôles de choses, comme par exemple de devoir pousser et tirer pour activer un système, et de pousser et tirer encore une fois pour le désactiver. Or, ce qu'on veut, c'est activer en poussant, et désactiver en tirant.

Ça tombe bien, parce que DCS World sait faire. Avec le mythique P-51D par exemple, il existe d'excellents bindings, comme celui là par exemple, mais souvent soit ils ne fonctionnent pas sur les versions plus récentes de DCS World, soit ils se basent sur le logiciel de configuration du Warthog TARGET, qui ne tourne pas sous Linux et dont j'aimerais donc me passer.

Heureusement, il existe un (très) long thread qui explique exactement comment faire pour configurer tout ça manuellement. Et pour s'y retrouver, vous n'aurez même pas besoin de tout lire ! En effet, un commentateur a eu la bonne idée de créer un PDF qui explique tout, et qui est disponible sur ce post.

L'approche est vraiment la plus agréable: tout comme certains modules (par exemple le Mirage 2000) fournissent de nombreuses commandes du type "machin ON else OFF" qui réagissent très bien avec les interrupteurs du HOTAS (ou du 3M comme un dit en français), l'idée est d'ajouter nos propres "machin ON else OFF" afin de les retrouver dans le menu de configuration des commandes et de pouvoir y lier des interrupteurs.

Il faut donc aller modifier le fichier "default.lua" situé dans le sous-répertoire Input/.../Joystick de votre module (pour le P51-D, par exemple, il est situé dans Mods/aircraft/P-51D/Input/P-51D/joystick). Dans ce fichier, il faut retrouver les commandes qui nous intéresse, et créer une nouvelle version de ces commandes, avec un nouveau nom (par exemple en rajoutant le ON else OFF) et peut-être bien une nouvelle catégorie (je mets tout dans "Custom" histoire de m'y retrouver ensuite). Voici par exemple les lignes que j'ai rajouté:

{down = device_commands.Button_11, up = device_commands.Button_11, cockpit_device_id  = devices.ENGINE_SYSTEM, value_down = 0.0, value_up = 0.1, name = _('Mixture IDLE CUT OFF else RUN'), category = _('Custom')},
{down = device_commands.Button_11, up = device_commands.Button_11, cockpit_device_id  = devices.ENGINE_SYSTEM, value_down = 0.2, value_up = 0.1, name = _('Mixture EMERGENCY FULL RICH else RUN'), category = _('Custom')},
{down = device_commands.Button_8, up = device_commands.Button_8, cockpit_device_id  = devices.K14_GUNSIGHT, value_down = 1.0, value_up = 0.0,  name = _('Gunsight gyromotor power ON else OFF'), category = _('Custom')},
{down = device_commands.Button_7, up = device_commands.Button_7, cockpit_device_id  = devices.FRONT_SWITCH_BOX, value_down = 1.0, value_up = 0.0, name = _('Gun safety switch GUN CAMERA SIGHT else OFF'), category = _('Custom')},
{down = device_commands.Button_2, up = device_commands.Button_2, cockpit_device_id  = devices.FRONT_SWITCH_BOX, value_down = 0.3, value_up = 0.0,  name = _('Ignition switch BOTH else OFF'), category = _('Custom')},
{down = device_commands.Button_11, up = device_commands.Button_11, cockpit_device_id  = devices.FRONT_SWITCH_BOX, value_down = 0.3, value_up = 0.0, name = _('Bomb-rocket selector switch ROCKETS else SAFE'), category = _('Custom')},
{down = device_commands.Button_11, up = device_commands.Button_11, cockpit_device_id  = devices.FRONT_SWITCH_BOX, value_down = 0.2, value_up = 0.0, name = _('Bomb-rocket selector switch BOTH else SAFE'), category = _('Custom')},
{down = device_commands.Button_7, up = device_commands.Button_7, cockpit_device_id  = devices.WEAPON_CONTROL, value_down = 0.0, value_up = 0.1, name = _('Rockets release control switch OFF else SINGLE'), category = _('Custom')},
{down = device_commands.Button_7, up = device_commands.Button_7, cockpit_device_id  = devices.WEAPON_CONTROL, value_down = 0.2, value_up = 0.1, name = _('Rockets release control switch AUTO else SINGLE'), category = _('Custom')},
{down = device_commands.Button_12, up = device_commands.Button_12, cockpit_device_id = devices.ENGINE_CONTROL_PANEL, value_down = 1.0, value_up = 0.0, name = _('Fuel Booster ON else OFF'), category = _('Custom')},
{down = device_commands.Button_10, up = device_commands.Button_10, cockpit_device_id  = devices.ENGINE_CONTROL_PANEL, value_down = 1.0, value_up = 0.0, name = _('Starter Switch Cover Close else Open'), category = _('Custom')},
{down = device_commands.Button_3, up = device_commands.Button_3, cockpit_device_id  = devices.FUEL_SYSTEM, value_down = 1.0, value_up = 0.0, name = _('Fuel shut-off valve ON else OFF'), category = _('Custom')},

Prenons par exemple le plus simple, le "Gunsight gyromotor". J'ai simplement recopié la ligne du gyromotor, ajouté un up = device_commands.Button_8, un value_up = 0.0 pour indiquer que je veux retourner à la valeur 0.0 (c'est à dire off) lorsque l'interrupteur repasse à zéro, et j'ai changé le nom et la catégorie. Ensuite, au sein du jeu, je peux voir dans la configuration des commandes une nouvelle catégorie ("Custom", ou "Personnalisé" car il semble que j'ai choisi une catégorie pour laquelle il a une traduction), mon nouveau "Gunsight gyromotor power ON else OFF". Je le lie à l'interrupteur qui va bien, et youpie, on a un interrupteur qui fonctionne !

C'est parfois un poil plus compliqué pour d'autres commandes, pour lesquelles il va falloir retrouver la bonne valeur pour le value_down en s'inspirant des autres commandes déjà fournies, mais dans l'ensemble ça se fait très bien.

Je n'ai plus qu'à faire une nouvelle plaque laminée pour le P-51D !