Detecter Les Touches "avancer" "reculer" "gau
#1
Posté 21 octobre 2006 - 12:28
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...
#2
Posté 21 octobre 2006 - 13:41
Von Zeeple, le 21.10.2006 à 13:28, dit :
[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? ... 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 ]
Il y a dans Nova Magica ce script qui gère un tapis volant qui s'incline dans les virages (mais pas le joueur).
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 - ).
Je suppose que nos maitres alchimistes auront quelques réponses
Modifié par alliop, 21 octobre 2006 - 13:49.
"Bienvenue à toi, lent homme lié, poussif tresseur des vitesses."
Alain Damasio
#3
Posté 21 octobre 2006 - 15:24
Citation
un avion pour le PJ...et qui vole! ( pas comme le planeur dwemer...)
#4
Posté 21 octobre 2006 - 15:43
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 !
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...
Edit : posté trop tôt par erreur, désolé !
Edit2 : cette méthode pose quand même un gros problème pour les collisions qui ne sont pas gérées !
Modifié par Nenfëa, 21 octobre 2006 - 15:53.
- 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
Posté 21 octobre 2006 - 15:55
Citation
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é...
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.
#6
Posté 21 octobre 2006 - 17:02
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 . (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
Posté 21 octobre 2006 - 17:21
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.
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 !
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 !
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 !
- 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
Posté 21 octobre 2006 - 17:34
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.
(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 ).
"Bienvenue à toi, lent homme lié, poussif tresseur des vitesses."
Alain Damasio
#9
Posté 21 octobre 2006 - 19:06
alliop, le 21.10.2006 à 18:34, dit :
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 !
- 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
Posté 21 octobre 2006 - 22:08
Je vais essayer de décripter tout ça.
#11
Posté 24 octobre 2006 - 17:05
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...
0 utilisateur(s) li(sen)t ce sujet
0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)