Aller au contenu


Detecter Les Touches "avancer" "reculer" "gau


  • Veuillez vous connecter pour répondre
10 réponses à ce sujet

#1 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 21 octobre 2006 - 12:28

Bonjour,

j'essaye de scripter un artefact volant

Pour qu'il puisse s'incliner de bas en haut ou de gauche à droite, j'aimerais utiliser les touches "avancer" "reculer" "gauche" droite". Comment detecter l'utilisation de ces touches sans que le PJ ne bouge?

J'ai vu qu'il y a quelque chose du genre dans "Ultimate Galeon" mais les scripts et les variables ne sont pas tres explicites...de plus ils sont sous copyright...
Le Steampunk, c'est bon, mangez en  !

#2 alliop

alliop

    Renaissance de l'art magique.


Posté 21 octobre 2006 - 13:41

Voir le messageVon Zeeple, le 21.10.2006 à 13:28, dit :

detecter l'utilisation de ces touches sans que le PJ ne bouge?
.... me semble une contradiction dans les termes. Il faudrait désactiver les fonctions de contrôle de base, et ça n'est pas possible avec le tesc (avec certains de ces programmes là c'est peut être possible, mais je ne sais pas si c'est légal -quoique Aerelorn fait maintenant partie de l'équipe Bethesda-, ni si tous ces programmes sont compatibles avec la VF).

[edit : par contre, si le PNj bouge, on peut scripter ça en détectant la variation de distance entre le joueur et des items placés à ses points cardinaux ; les scripts de "combat moves" de Ghanburighan font ça en plaçant des "sons muets" ; ah oui je vois ce que tu recherches... un avion télécommandé Dwemer, peut être? :green: ... RE-EDIT : une idée me vient : utiliser ce procédé de detection de mouvement par le script de l'objet, mais démultiplier le mouvement du joueur ; par ex si le joueur bouje de 5 sur l'axe y, l'objet bouge de 128.... ensuite faut voir les questions d'axes :D ]

Il y a dans Nova Magica ce script qui gère un tapis volant qui s'incline dans les virages (mais pas le joueur).
Spoiler

Et dans un projet d'esp pas sorti du même bonhomme un autre, qui intègre une fonction permettant d'incliner un objet par rapport à un axe (dans le script l'axe de référence est l'axe vertical du joueur ; ça doit pouvoir se moduler - la fonction est très au-delà de ma compréhension mathématique, mais en termes de langage de script je suppose que la détection d'axe doit se repérer facilement - ).

Spoiler

Je suppose que nos maitres alchimistes auront quelques réponses :rolleyes:

Modifié par alliop, 21 octobre 2006 - 13:49.

"Bienvenue à toi, lent homme lié, poussif tresseur des vitesses."
Alain Damasio


#3 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 21 octobre 2006 - 15:24

Ce que je recherche exactement c'est une sorte de petit mix entre le canot de "ultimate galleon" et le tapis volant, c'est a dire utiliser les touches "gauches" et "droites" pour que l'avion tourne ( comme le canot ) et se penche ( comme le tapis ). Le probleme est que je ne comprend pas du tout comment le mod galleon fait pour detecter ces touches.

Citation

ah oui je vois ce que tu recherches... un avion télécommandé Dwemer, peut être?

un avion pour le PJ...et qui vole! ( pas comme le planeur dwemer...)
Le Steampunk, c'est bon, mangez en  !

#4 Nenfëa

Nenfëa

    Le poisson bavard de Kalendaar


Posté 21 octobre 2006 - 15:43

Hello ! :D

Une idée pour un déplacement rectiligne serait à chaque instant :
1) De déplacer la carlingue de l'avion avec Move
2) De forcer la position du joueur avec la fonction Position pour qu'il se trouve exactement là où le cockpit de ton avion doit se trouver
3) De forcer l'angle du joueur avec la fonction SetAngle pour qu'il regarde exactement dans la direction où va l'avion

Un avion qui va tout droit, c'est bien, mais on peut mieux faire quand même ! :green:

Pour la direction :
1) A l'instant T0, tu mémorises l'angle du joueur (qui est à ce moment le même que celui de l'avion)
2) A la frame suivante (instant T1), tu compares cet angle mémorisé avec l'angle actuel du joueur. Si c'est le même, on continue tout droit - sinon, il faut tourner dans un sens ou dans l'autre selon que l'angle est plus grand ou plus petit. :)

Pour l'inclinaison, ça marche presque pareil :
1) A l'instant T0, tu mémorises la position du joueur (qui est à ce moment le même que celui de l'avion)
2) A la frame suivante (instant T1), tu compares cette position mémorisée avec la position actuelle du joueur. Si c'est la même, on continue avec la même inclinaison - sinon, il faut redresser ou incliner l'avion. Savoir s'il faut redresser ou incliner est plus compliqué : il faut que tu saches direction va l'avion et que tu regardes dans quel sens le joueur est allé.

Ca devrait donner un résultat potable si le frame rate est suffisant - sinon, ça peut aussi donner des résultats très moches où on voit le déplacement en discontinu de frame en frame... :green:

Edit : posté trop tôt par erreur, désolé ! :rolleyes:

Edit2 : cette méthode pose quand même un gros problème pour les collisions qui ne sont pas gérées ! :P :P :(

Modifié par Nenfëa, 21 octobre 2006 - 15:53.

Nenfëa

- Les yeux, Bouh, vise les yeux!
- Pouiiiiiic!!!

Le monde de Gilbertus devenu réalité : Kalendaar!
Il était une fois un site vachement bien avec plein de nistoires dessus... ah, vous la connaissez déjà ?!

Wiwi d'or 2006 du plus serviable ! Tadaaaaaaaa !

#5 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 21 octobre 2006 - 15:55

Citation

Pour la direction :
1) A l'instant T0, tu mémorises l'angle du joueur (qui est à ce moment le même que celui de l'avion)
2) A la frame suivante (instant T1), tu compares cet angle mémorisé avec l'angle actuel du joueur. Si c'est le même, on continue tout droit - sinon, il faut tourner dans un sens ou dans l'autre selon que l'angle est plus grand ou plus petit.

Arrrg excusez moi je me suis encore mal exprimé... :D

Quand je parle des touches "droite" et "gauche" ce sont les touches qui font faire au PJ un mouvement de translation, pas de rotation... "Q" et "D" pour ceux qui ont gardé les touches par défaut...

[edit] meme si c'est plus compliqué, je prefere utiliser ces touches la pour rendre le pilotage plus réaliste

Re-Edit: En fait les commandes seront les suivantes:

"touche discretion" enfoncée = augmente la vitesse
"touche discretion" relachée = ralentie la vitesse
"avancer" = incline l'avion vers le bas
"reculer" = incline l'avion vers le haut
"gauche-droite (Q et D)" = incline/tourne à gauche et a droite

Modifié par Von Zeeple, 21 octobre 2006 - 16:38.

Le Steampunk, c'est bon, mangez en  !

#6 alliop

alliop

    Renaissance de l'art magique.


Posté 21 octobre 2006 - 17:02

Bah ce dont tu parles est exactement le script du tapis-volant [qui fonctionne effectivement par "getpos/setpos", mais ajoute une fonction d'inclinaison exacte à la fois sur les axes et en fonction du rayon de virage -simulant plutôt bien le jeu centrifuge de la portance en vol].
Il "suffit" de remplacer le meshe du tapis par celui de l'avion vu "de l'intérieur au poste de commande" et de disale la vue 3° personne (C'est ce que fait Lespagnol pour "Stargate").

[EDIT]
Tu peux aussi faire l'inverse : au lieu de placer le joueur sur le mouvement de l'item, placer l'item sur la lévitation du joueur, en utilisant un peu autrement les mêmes fonctions, et remplaçant le "move" par des add/remove de capacité lévitation ; le script des danses des 5 anneaux (dans Nova ou dans l'esp "Danses des 5..." indépendant), te racontera clairement une "méthode de vol" possible et qui tourne aussi parfaitement et fluidifiquement que le tapis, pour peu de ressources). En combinant les 2 scripts ça doit le faire. La gestion de plusieurs meshes tous scriptés rendrait évidemment tout ça infiniment + lourd.[/EDIT]
*********

Si ce que tu  ce veux est voir player monter dans un GROS avion composé de plusieurs meshes, puis voir l'avion voler de l'extérieur, "il suffit" :

° De scripter chaque item composant l'avion sur la base du même script....

° ..... auquel ajouter la gestion des distances relative de rayon de virage de chaque objet dans une sphère  :huhu: . (Je crois qu'il y en a qui se sont déjà bien pris la tête sur ces questions dans le TESC Oublions, à l'étage au-dessus.  :)  ).

° D'équiper Player au moment où il "entre dans l'avion" d'un équipement robe+gants texturé avec une texture vide, il deviendra absolument invisible (sauf hélas son ombre tant qu'il sera au sol - procédé utilisé par plusieurs mods dont Nova. Je pourrai te passer la texture si tu en as bexoin).

On pourrait voir player monter dans l'avion au sol, puis par une élipse se retrouver en vue subjective au poste de commande :

Scripter un activator "porte d'avion", qui
1) initialise un fad-in/out rapide
2) dans les frames noires de sa durée,  place le joueur aux positions du "poste de pilotage en vue subjective" scripté tapis-volant
3) force la vue subjective

4) Gérer l'atterrissage par un global (ou dans le même local si possible) qui, dès que le joueur arrive à une certaine hauteur du sol (voir comment ça se détecte dans le script ci-dessus), place sous ses pieds la passerrelle de l'avion (s'il y en a une ; avec éventuellement un autre fade in/out), et tout les autres morceaux du zing.
Pour ça il faut soit faire des mesures de position des éléments de l'avion par rapport au joueur et les replacer chaque fois ainsi, soit définir des terrains d'atterissage, où les statics ne bougent pas et sont enable/disables (très beaucoup +simple).

Voilà ce qui me vient.

*************

Edit... ah je vois seulement :
pour accélérer/ralentir par sneak, ça c'est facile si c'est Tribunal : tu as la fonction "player"->GetSneaking" en fonction de laquelle tu peux moduler la vitesse du mouvement (ou l'add/remove de capacité "lévitation" si tu choisis plutôt cette formule).

Une autre idée me vient : comme tu peux détecter aussi la position de mains de lancer de sorts ( GetSpellReadied ), tu peux t'en servir comme position des mains sur les commandes, et la détecter pour en faire ce que tu voudras

Modifié par alliop, 21 octobre 2006 - 17:16.

"Bienvenue à toi, lent homme lié, poussif tresseur des vitesses."
Alain Damasio


#7 Nenfëa

Nenfëa

    Le poisson bavard de Kalendaar


Posté 21 octobre 2006 - 17:21

C'est possible juste avec les coordonnées, mais ça devient fort mathématique ! :huhu:

L'idée est de considérer la droite correspondant la direction dans laquelle regarde le joueur, puis de regarder si la position du joueur au temps suivant est toujours sur cette droite, à sa gauche, ou à sa droite.


1 Trouver la droite formée par la position initiale du joueur et la direction dans laquelle il regarde

Cette droite admet une équation du type :
y = a.x + b
(on ne raisonne que dans le plan (X,Y) sans tenir compte de la direction Z).

On connait :
1) La position initiale (x0, y0) du joueur par laquelle passe cette droite.
2) L'angle alpha de la tête du joueur par rapport à l'axe X.


Pour le point initial, on a :
y0 = a.x0 + b

Il faut une autre équation pour obtenir les coefficients a et b de la droite. Pour ça, on va utiliser notre seconde donnée, l'angle du joueur avec l'axe X. La tangente de cet angle est égale à a pente de la droite, c'est à dire au coefficient a :
a = tan(alpha)

D'un point de vue mathématique, c'est tout bon. Mais d'un point de vue codage, la fonction tangente n'existe pas sous Morrowind : il te faudra en prendre une approximation. Si tu es en Tribunal dépendant (donc que tu peux utiliser la fonction racine carrée), tu peux utiliser la formule donnée sur cette page sur l'intervalle [0, pi/2]. (edit : non, on a besoin de la fonction tangente ! Celà dit, tan(x) = cos(x)/sin(x) : si tu trouves une approximation pour chacune des fonctions, c'est gagné ! :)) Sinon, tu peux tenter de trouver sur le net une fonction polynôme qui marche bien, ou encore faire des tables de valeurs de la fonction ! ;)


Maintenant qu'on a le coefficient a, trouver b n'est plus un soucis :
y0 = a.x0 + b	=>   b = y0 - a.x0


Bon, ça y est, on a cette fichue droite ! :) Si je résume la manière de trouver ses coefficients :
a = tan(alpha)
b = y0 - a.x0



2 Trouver la droite perpendiculaire passant par la position actuelle du joueur

Maintenant, on veut savoir de quel côté de la droite se trouve le joueur au temps T1. Pour ça, on a :
1) L'équation de la droite
2) Les coordonnées (x1, y1) du joueur au temps T1

On va chercher à savoir quelle est la distance entre le point où se trouve le joueur et la droite. Pour ça, on va calculer l'équation de la droite perpendiculaire passant par le point actuel où se trouve le joueur ! :huhu:
C'est aussi une droite : son équation est du type A.x + B = y, et on sait que A.x1 + B = y1.
Le coefficient A vaut -1/a, trouver le coefficient B est donc très simple : B = y1 - A.x1 = y1 + x1/a

Maintenant, on cherche la distance : on va calculer le point d'intersection de ces deux droites. On cherche donc un point de coordonnées (xi, yi) qui respecte en même temps les deux équations, donc :
a.xi + b = yi
A.xi + B = yi

La solution de ce système est :
xi = (b - B) / (A - a)
yi = b + a.(b - B) / (A - a)

D'un point de vue "physique", le point d'équation (xi, yi) correspond à l'endroit où aurait du se trouver le joueur s'il n'avait pas fait de pas de côté.



3 Savoir de quel côté faire virer l'avion

A partir de ce point, tu pourras vérifier si x1=xi et y1=yi. Si c'est le cas (aux erreurs de calcul numérique près), c'est que le joueur n'a pas fait de pas de côté.
Sinon, il en a fait un et il faut faire tourner l'avion.

Pour savoir dans quel sens le pas a été fait, il faut savoir dans quel sens va l'avion et voir laquelle des deux valeurs (xi ou x1 si tu raisonnes sur l'axe x) est le plus grand. Un vrai casse tête avec plein de cas à gérer, mais ça devrait marcher ! :D



Si tu ne comprends pas l'idée, n'hésite pas - un dessin pourrait clarifier tout ça ! ;)
Ca parait très compliqué mathématiquement, mais en code il suffit de calculer quatre coefficients (a, b, A et B), de trouver à partir d'eux le point (xi, yi), puis de gérer tous les cas selon le sens dans lequel vole l'avion : en termes de mémoire, c'est lourd, mais sans plus ! :)
Nenfëa

- Les yeux, Bouh, vise les yeux!
- Pouiiiiiic!!!

Le monde de Gilbertus devenu réalité : Kalendaar!
Il était une fois un site vachement bien avec plein de nistoires dessus... ah, vous la connaissez déjà ?!

Wiwi d'or 2006 du plus serviable ! Tadaaaaaaaa !

#8 alliop

alliop

    Renaissance de l'art magique.


Posté 21 octobre 2006 - 17:34

Incroyable! J'ai tout suivi!  :)
Bien que je décroche totalement à partir de la trigo, je crois sur parole que cos=pente, et je pige les principes... que je serai peut être capable d'utiliser pour détecter les coefficients après quelques longues de labeur.  :huhu:

(Par contre les idées ci-dessus, je sais pouvoir les faire tourner à partir de la liste de fonctions de l'uesp, sans connaissances mathématiques - ce que je regrette, car tout ça m'éblouit! -, et qu'elles bouffent très peu de ressources  :huhu: ).

"Bienvenue à toi, lent homme lié, poussif tresseur des vitesses."
Alain Damasio


#9 Nenfëa

Nenfëa

    Le poisson bavard de Kalendaar


Posté 21 octobre 2006 - 19:06

Voir le messagealliop, le 21.10.2006 à 18:34, dit :

Bien que je décroche totalement à partir de la trigo, je crois sur parole que cos=pente, et je pige les principes...
Merci beaucoup ! :huhu:

Mais tu aurais tort de me croire ainsi sur parole : j'ai fait une grosse erreur, la pente est égale à la tangente de l'angle et non pas à son cosinus ! :) J'ai édité mon message précédent, attention à bien utiliser une approximation de la fonction tangente et non une de la fonction cosinus ! :huhu:
Nenfëa

- Les yeux, Bouh, vise les yeux!
- Pouiiiiiic!!!

Le monde de Gilbertus devenu réalité : Kalendaar!
Il était une fois un site vachement bien avec plein de nistoires dessus... ah, vous la connaissez déjà ?!

Wiwi d'or 2006 du plus serviable ! Tadaaaaaaaa !

#10 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 21 octobre 2006 - 22:08

j'ai fait des recherches pour savoir comment les calculatrices et ordinateurs calculent les tangentes, et je suis tombé sur un truc appelé "algorithme CORDIC", je pense que c'est ce qui est utilisé dans ultimate galleon.

Je vais essayer de décripter tout ça.
Le Steampunk, c'est bon, mangez en  !

#11 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 24 octobre 2006 - 17:05

Petite question, esque l'on peut mettre une variable de type float comme vitesse pour la fonction Move ?

Sinon je vais etre obliger d'utiliser Getpos et Setpos, et trouver le moyen de calculer les coordonées de l'avion a chaque fram, en fonction de la vitesse de l'angle, de la position...
Le Steampunk, c'est bon, mangez en  !




0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)