Aller au contenu


[fonctions] Getangle, Face


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

#1 elendell

elendell

    Mécano Dell'Arte


Posté 24 avril 2009 - 00:53

C'est peut-être connu mais comme je viens juste de le remarquer et que je n'ai pas trouvé cette info, je le signale :

Contrairement au PJ, si un PNJ ou une créature se déplace, "GetAngle z" ne donnera pas son nouvel angle mais toujours celui qu'il avait dans sa position d'origine. Même s'il est ensuite à l'arrêt. De même, si on fait tourner un PNJ/créature avec "Face, x, y", il se tourne bien dans la direction indiquée mais un "GetAngle z" donnera son ancien angle et pas le nouveau.

Quitter la cellule et revenir ne change rien à ce que renvoie "GetAngle". Le seul moyen que j'ai trouvé pour avoir son nouvel angle est de faire un "placeatme" d'un objet quelconque qui lui, sera positionné dans le nouvel angle du PNJ. Et donc, de tester "GetAngle" sur l'objet, pour connaitre le nouvel angle du PNJ.  :)

#2 alliop

alliop

    Renaissance de l'art magique.


Posté 24 avril 2009 - 00:56

:)  ... le tesc2 est décidément une machine extraordinaire : on y gambade allègrement de surprise en surprise, plus merveilleuses les unes que les autres.

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


#3 Finraïl

Finraïl

    Modèle de wiwilandais nanotechnologique


Posté 24 avril 2009 - 07:35

:green:  Trop fort.
Finalement, c'est assez simple à résumer : toutes les fonctions non utilisés par Beth sont bugguées.  :)

Not Quite Dead, le 22.06.2006 à 19:42, dit :

[...]un changement avatarien, même infime, est PAS BIEN et nuisible [...]
Les lisez-moi c'est bon, mangez-en !! Image IPB

Fervent Partisan de l'Immuabilité Avatarienne.

Morrowind Renaissance


#4 Snaïpe

Snaïpe

    ...itset tnus otroh nI


Posté 24 avril 2009 - 19:18

j'avais fait cette constatation quand j'avais essayé de faire un bateau qui suivait les mouvements d'un PNJ avec marche sur l'eau pour faire des voyages; le bateau ne tournait pas...

Citation

Le seul moyen que j'ai trouvé pour avoir son nouvel angle est de faire un "placeatme" d'un objet quelconque qui lui, sera positionné dans le nouvel angle du PNJ. Et donc, de tester "GetAngle" sur l'objet, pour connaitre le nouvel angle du PNJ. :mrgreen:

je n'avais jamais essayé :grin: je sens que je vais reprendre mon idée de départ !

#5 elendell

elendell

    Mécano Dell'Arte


Posté 24 avril 2009 - 23:24

Voir le messageSnaïpe, le 24.04.2009 à 20:17, dit :

je n'avais jamais essayé :mrgreen: je sens que je vais reprendre mon idée de départ !
Pour tester l'angle de cette manière, tu dois faire le "PlaceItem" dans une autre frame que celle où tu fais pivoter le PNJ.
Frame 1 : Il pivote  Frame 2 : Il fait "PlaceItem"  Frame 3 : GetAngle sur l'objet placé et SetAngle sur celui qui doit suivre.

Mais d'après ce que tu expliques, il serait plus simple d'utiliser "PlaceItem" directement pour placer une nouvelle instance de l'objet qui doit suivre le déplacement du PNJ. Tu n'aurais même pas besoin de tester l'angle. Tu peux toutes les 4 ou 5 frames remplacer ainsi le bateau qui adoptera l'angle du PNJ. Dans les frames intermédiaires, tu relèves la position du PNJ avec "GetPos" et fait "SetPos" sur ton bateau à ces coordonnées.

Sans oublier bien sûr un "GetDisabled/SetDelete" dans son script qui "delete" chaque instance au fur et à mesure. Pour commander les "disable", juste avant de faire "PlaceItem", le script du PNJ met une variable globale à x. Quand le script du bateau relève que cette variable est à x, il replace la variable à z et fait le "disable". C'est juste une question de synchroniser les étapes et l'état de la variable pour qu'il en reste toujours un exemplaire.

Ce que je dis là suppose que tu places le bateau au même endroit que le PNJ (mêmes centres). S'il doit le suivre à distance, il te faut effectivement relever l'angle.

#6 alliop

alliop

    Renaissance de l'art magique.


Posté 25 avril 2009 - 04:17

Hello.

Il y a peut être des réponses utiles pour vous dans le script de Mortim pour le tapis volant.

Je ne sais pas si vous connaissez l'objet et son fonctionnement in game : il avance tout seul et on reste placé dessus, les touches q et d commandent la direction, activer le tapis (le cliquer quand on est en vol dessus) commande alternativement montée/horizontal/descente et visse-versa, selon un angle constant pour la montée et la descente.
Il a de plus un effet d'inclinaison dans les virages, comme une planche à surf littéralement.

Le tapis se place toujours strictement dans l'axe du PJ défini par les touches q /d, alors que comme on le voit dans le script, le seul angle testé est sur "Z" (il semble donc que ["Player"->GetAngle Z] fonctionne) : les directions du tapis dans le plan horizontal ne sont données que par des enregistrements/comparaisons GetPos X, Y / Last_PosX, LastPos_y (la limite du procédé étant qu'il ne fonctionne que s'il y a déplacement du pj évidemment).

Ce modèle est utilisable pour un bateau (sauf "montée ou descente à l'activation", à moins de vouloir faire un sous-marin, un hydravion ou un engin Dwemer polyvalent).

Voilà le script :
Spoiler

Il est possible d'ajouter des variations de vitesse à partir de l'algo du levelling de la méditation (qui assure une incrémentation par 1 de 0 à 100 à faible coût de calcul -au moyen de 8 blocs test/commandes légers seulement- ), en remplaçant les capacités augmentant la régénération de magie par des augmentations de "speed", et le niveau par un chiffre incrémenté tant qu'une commande du bateau est activée par clic par exemple, ou qu'une vitesse est préalablement choisie par messagebox ou dialogue et appliquée avec des modificateurs selon "GetWindSpeed" par ex :shock:

Pour la méditation tout se passe en une frame puisqu'il s'agit d'appliquer un levelling, mais ça peut aussi bien se décomposer par state et timer ou framecount pour obtenir une accélération ou une décélération progressives.

Pour mémoire voilà cet algo :
Spoiler

Modifié par alliop, 25 avril 2009 - 09:39.

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


#7 elendell

elendell

    Mécano Dell'Arte


Posté 25 avril 2009 - 10:58

Bonjour alliop,

Je connais le tapis car je m'en servais dans mon jeu (même si je devais systématiquement mettre la distance de vision au minimum avec FPS Optimiser avant de changer de cellule, sous peine de retour bureau).

Ce que je signale par ce sujet, c'est justement la différence entre l'application de "GetAngle" sur le PJ  et la même fonction sur un PNJ.
Le script du tapis ne fonctionnerait pas avec un PNJ car "GetAngle z" ne retournerait pas son angle courant pendant son déplacement mais toujours celui qu'il avait lors de son positionnement initial dans la cellule.

Quand à utiliser ce genre de script (parfait pour un tapis) sur un bateau, j'en ai testé un qui fonctionnait sur ce principe et je n'ai pas trouvé le résultat heureux. Ou alors, il faudrait ajouter une temporisation lors des changements d'angle du PJ pour que que le bateau ne prenne pas immédiatement le même angle que le PJ mais au contraire, qu'il ne l'adopte que petit à petit. Voir un bateau qui passe de 0 à 180° d'un coup est assez curieux. C'est pour ça que pour mon bateau, j'ai adopté un pilotage indépendant de l'angle du PJ.

Pour cet ancien projet de Snaïpe, ça dépend de ce qu'il souhaitait faire exactement.

Je regarderai plus tard l'algo de méditation car je ne suis pas assez réveillé pour examiner sérieusement ses utilisations possibles.  :shock:

#8 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 25 avril 2009 - 11:52

Citation

Ou alors, il faudrait ajouter une temporisation lors des changements d'angle du PJ pour que que le bateau ne prenne pas immédiatement le même angle que le PJ mais au contraire, qu'il ne l'adopte que petit à petit. Voir un bateau qui passe de 0 à 180° d'un coup est assez curieux. C'est pour ça que pour mon bateau, j'ai adopté un pilotage indépendant de l'angle du PJ.

C'est un effet que je cherche également dans un script d'automobile, une voiture ne peut tourner sur place, mais uniquement en roulant, et le rayon de courbure dépendant de la vitesse.
Le Steampunk, c'est bon, mangez en  !

#9 alliop

alliop

    Renaissance de l'art magique.


Posté 25 avril 2009 - 14:39

Voir le messageelendell, le 25.04.2009 à 11:57, dit :

Ce que je signale par ce sujet, c'est justement la différence entre l'application de "GetAngle" sur le PJ  et la même fonction sur un PNJ.
[....]
Je regarderai plus tard l'algo de méditation car je ne suis pas assez réveillé pour examiner sérieusement ses utilisations possibles.  :shock:
.... et moi je n'avais plus les yeux suffisamment en face des trous à 5h du mat, j'avais cru lire l'inverse.  :)

Cet algo permet d'incrémenter de façon continue ce qu'on veut de 1 point dans des fourchettes importantes en fixant des limites variables, sans faire un bloc par point (8 blocs au lieu de 100 pour aller de 0 à 100).  

Vous avez raison, un bateau ne peut pas virer sur place bien sûr, à moins d'être un ovni flottant.

Bonnes suites :arrow:

Modifié par alliop, 25 avril 2009 - 14:48.

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


#10 elendell

elendell

    Mécano Dell'Arte


Posté 25 avril 2009 - 18:28

Voir le messageVon Zeeple, le 25.04.2009 à 12:51, dit :

C'est un effet que je cherche également dans un script d'automobile, une voiture ne peut tourner sur place, mais uniquement en roulant, et le rayon de courbure dépendant de la vitesse.
C'est exactement ce que j'ai dû faire avec le bateau. La valeur donnée à "Rotate" est une vitesse de rotation. La proportionner suivant la vitesse du véhicule est donc obligatoire. Voici un extrait du script :

	if ( etape == 2 )
		if ( barre == 0 )
			set rotation to 0
		else
			if ( barre < 0 )
				set rotation to ( ( barre * -1 ) * vitesse )
			elseif ( barre > 0 )
				set rotation to ( vitesse * barre )
			endif
			set rotation to ( rotation / 600 )
			if ( rotation < 1.5 )
				set rotation to 1.5
			endif
		endif
		set gouvern to 0
	endif
Notes : "Barre" correspond au braquage (de -40 à 40 pour moi). Si le joueur appui une fois sur une touche de direction gauche/droite, le braquage change de 1 (ou -1) ; si la touche est maintenue appuyée + de 0.5s, le braquage change de 1 toutes les 0.06s (pour que le braquage soit continu mais qu'il ne se fasse pas trop vite en cas de framerate élevé). 600 est la vitesse maximale du bateau. "Rotation" donne la valeur à appliquer à "Rotate". Pour le bateau, j'ai mis une vitesse minimale de rotation mais ce n'est peut-être pas à faire pour une voiture. La partie du script qui fait la rotation elle-même ne s'exécute pas si la vitesse du véhicule = 0.

Si tu veux examiner mon script, n'hésite pas à me le demander.  ;)


Voir le messagealliop, le 25.04.2009 à 15:38, dit :

Cet algo permet d'incrémenter de façon continue ce qu'on veut de 1 point dans des fourchettes importantes en fixant des limites variables, sans faire un bloc par point (8 blocs au lieu de 100 pour aller de 0 à 100).
Pratique, effectivement. Pour un but similaire (si j'ai bien compris), j'ai utilisé "while".

				while ( mouvement < vitesse )
					if ( ( vitesse - mouvement ) < 10 )
						move y 1
						set mouvement to ( mouvement + 1 )
					endif
					if ( ( vitesse - mouvement ) < 100 )
						move y 10
						set mouvement to ( mouvement + 10 )
					endif
					if ( ( vitesse - mouvement ) < 300 )
						if ( ( vitesse - mouvement ) >= 100 )
							move y 100
							set mouvement to ( mouvement + 100 )
						endif
					endif
					if ( ( vitesse - mouvement ) >= 300 )
						move y 300
						set mouvement to ( mouvement + 300 )
					endif
				endwhile
				set mouvement to 0

J'ai mis des tranches (centaine, dixaine, unité) pour qu'il n'y ait pas trop de boucles risquant de de geler l'écran. J'ai remarqué que les valeurs des "move" se cumulaient. Donc, si la vitesse est par exemple de 521 unités/s, j'obtiens "move y 521" en 6 boucles dans la même frame.

Je fais la même chose pour décélérer et pour tourner. J'ai adopté ce système parce que "Move" et "Rotate" n'acceptent pas les variables en argument.  :)

#11 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 25 avril 2009 - 21:39

Citation

J'ai mis des tranches (centaine, dixaine, unité) pour qu'il n'y ait pas trop de boucles risquant de de geler l'écran. J'ai remarqué que les valeurs des "move" se cumulaient. Donc, si la vitesse est par exemple de 521 unités/s, j'obtiens "move y 521" en 6 boucles dans la même frame.

Je fais la même chose pour décélérer et pour tourner. J'ai adopté ce système parce que "Move" et "Rotate" n'acceptent pas les variables en argument. smile.gif

Très bonne idée!

Mais qu'en est-il des collisions avec le rivage ou des récifs?
je n'ai jamais compris comment la barque du mod "Galion Ultime" fonctionnait pour ça. ;)
Le Steampunk, c'est bon, mangez en  !

#12 Kira

Kira

    Top-modeleuse...


Posté 25 avril 2009 - 22:26

Bonjour Von Zeeple...

Les collisions sont déterminées par des pnj invisibles, placés à l'avant et à l'arrière du vaisseau....
Tout n'est qu'illusion... Surtout le fait de le penser.....
Image IPB
(Wiwi d'or de la plus serviable et de la plus cool... Merci à vous tous...)

#13 elendell

elendell

    Mécano Dell'Arte


Posté 25 avril 2009 - 22:35

Voir le messageVon Zeeple, le 25.04.2009 à 22:38, dit :

Mais qu'en est-il des collisions avec le rivage ou des récifs?
je n'ai jamais compris comment la barque du mod "Galion Ultime" fonctionnait pour ça. ;)
J'utilise des détecteurs de collision qui sont des créatures (après de nombreux essais divers faits avec l'aide de Kira). Une à l'avant et une à l'arrière (+ depuis hier, une au milieu quand le bateau est à l'arrêt pour les collisions dûes à la dérive, qui peut être latérale). Quand le bateau est ancré, c'est un activateur mais quand l'ancre est levée, c'est un misc. Les créatures peuvent donc se superposer au bateau ; ce qui permet de n'utiliser que 2 détecteurs qui couvrent tout l'avant et tout l'arrière et en hauteur, celle du mat. Le script de chaque détecteur calcule les "Setpos" à lui appliquer au fur et à mesure pour garder sa position par rapport au centre du bateau.

Comme c'est une créature, on ne peut pas lui donner l'angle du bateau avec "SetAngle z variable". Donc, toutes les 5 frames, le détecteur est remplacé à l'aide d'un "placeItem" qui lui, accepte les variables pour l'angle.

La première frame sert à la mise en place. Ensuite, en début de chaque frame, le script du détecteur relève sa position réelle et la compare avec celle qui avait été établie à la frame précédente (et donnée avec "SetPos"). Si la distance entre les positions ordonnée et réelle est supérieure à 0.1 ou si la hauteur du détecteur a changé, c'est que la créature n'a pas pu s'y placer. Ça peut arriver sans collision mais si ça arrive deux frames de suite, c'est qu'il y a collision. (Suivant le cas, il faut compter plus de frames pour valider la collision).

Dans ce cas, le script du bateau le fait repartir dans le sens inverse jusqu'à ce qu'il n'y ait plus collision (et un peu plus). C'est le "retour de choc".
Sans ce retour, le détecteur suivant qui le remplacera serait placé à l'intérieur de l'obstacle et ça, ça ne génère pas d'écart de positionnement.

Spoiler

Note : La détection d'écart de hauteur n'est pas forcement nécessaire. Elle ne l'est que si le véhicule peut rencontrer un obstacle en pente douce (une plage par exemple). Car dans ce cas, les "SetPos" x et y se font sans problème. Quand on fait un "SetPos", le jeu vérifie si la place est libre. Si non, il positionne la créature à l'endroit libre le plus proche. En cas de pente douce, il peut le positionner à x et y définis mais il décale par contre dans la hauteur.

#14 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 26 avril 2009 - 00:53

Merci pour tout ces éclaircissements!

Mais alors, pourquoi ne pas faire de ton bateau une créature, au lieu d'un activateur ou d'un misc item?
Le Steampunk, c'est bon, mangez en  !

#15 Kira

Kira

    Top-modeleuse...


Posté 26 avril 2009 - 01:11

Coucou, Von Zeeple, c'est encore moi....
Personnellement, c'est la première piste que j'avais explorée, surtout que ça permettait au bateau d'avoir une ombre....

Je ne sais plus pourquoi l'idée a été écartée, mais il me semble qu'il y avait une bonne raison....

***Edit***
Je crois qu'il y avait un problème de tressautement, mais Elendell doit mieux s'en rappeler, c'est lui qui a fait les tests....
Tout n'est qu'illusion... Surtout le fait de le penser.....
Image IPB
(Wiwi d'or de la plus serviable et de la plus cool... Merci à vous tous...)

#16 alliop

alliop

    Renaissance de l'art magique.


Posté 26 avril 2009 - 02:08

Voir le messageelendell, le 25.04.2009 à 19:27, dit :

Voir le messagealliop, le 25.04.2009 à 15:38, dit :

Cet algo permet d'incrémenter de façon continue ce qu'on veut de 1 point dans des fourchettes importantes en fixant des limites variables, sans faire un bloc par point (8 blocs au lieu de 100 pour aller de 0 à 100).
Pratique, effectivement. Pour un but similaire (si j'ai bien compris), j'ai utilisé "while".
[.... code.....]
J'ai mis des tranches (centaine, dixaine, unité) pour qu'il n'y ait pas trop de boucles risquant de de geler l'écran. J'ai remarqué que les valeurs des "move" se cumulaient. Donc, si la vitesse est par exemple de 521 unités/s, j'obtiens "move y 521" en 6 boucles dans la même frame.
Euh.. mais si tout se passe dans la même frame, celà ne produit-il pas une accélération en une seule frame, c'est à dire pas d'accélération du tout mais un passage instantané à 512?
Pour qu'il y ait accélération il faut au contraire un incrément de un par frame jusqu'à 512, non?

Spoiler

Modifié par alliop, 26 avril 2009 - 02:49.

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


#17 elendell

elendell

    Mécano Dell'Arte


Posté 26 avril 2009 - 03:22

Voir le messageVon Zeeple, le 26.04.2009 à 01:52, dit :

Mais alors, pourquoi ne pas faire de ton bateau une créature, au lieu d'un activateur ou d'un misc item?

Voir le messageKira, le 26.04.2009 à 02:10, dit :

Je crois qu'il y avait un problème de tressautement, mais Elendell doit mieux s'en rappeler, c'est lui qui a fait les tests....
Oui, le PJ se trouvait obligatoirement à l'intérieur de la créature/bateau. Les "SetPos" l'y maintenaient de force mais ça faisait des tremblements permanents de la créature qui essayait de rejeter la greffe de ce corps étranger.  :)
On a essayé d'autres systèmes en décalant le centre de la créature pour le placer hors du volume de collision du PJ mais l'effet était le même.

J'ai aussi essayé d'utiliser uniquement un activateur car, si mes souvenirs sont bons (ça remonte à fin 2008), avec "Move" et "Rotate" l'activateur permet de détecter la collision (mais pas avec "SetPos"). Seulement, ça fonctionnait en utilisant une petite barque mais avec un bateau plus grand (celui du meshe uilisé), ça faisait également des tremblements.

Du coup, je me suis orienté sur le Misc. La seule chose un peu gênante, c'est qu'un Misc doit obligatoirement avoir une icône. J'en ai faite une transparente mais même si on voit à travers, il y a quand même le carré sombre qui est visible quand le PJ se tourne vers le mat ou le pont.
Mais on l'oublie vite et je ne suis pas sûr que les aménagements que j'ai faits depuis auraient été possibles avec un activateur (comme le roulis lié à la vitesse quand il navigue).

Voir le messagealliop, le 26.04.2009 à 03:07, dit :

Euh.. mais si tout se passe dans la même frame, celà ne produit-il pas une accélération en une seule frame, c'est à dire pas d'accélération du tout mais un passage instantané à 512?
Pour qu'il y ait accélération il faut au contraire un incrément de un par frame jusqu'à 512, non?
La vitesse et la rotation en cours sont mémorisées mais les valeurs de "Move" et "Rotate" sont recalculées à chaque frame.
Je ne me souviens plus pourquoi j'avais dû faire ainsi. Peut-être parce que je fais jouer une valeur "d'inertie". Les changements de vitesse ne se font pas par paliers de 1. Plus la vitesse est grande et plus la valeur ajoutée augmente. Principe inverse pour le ralentissement.

Donc, au lieu d'avoir une vitesse qui augmente de façon linaire, on sent le voilier qui commence à prendre le vent, avec une certaine "lourdeur" au tout début et qui s'annule au fur et à mesure car on bénéficie pour aller encore plus vite, de la vitesse déjà acquise.
Pour le ralentissement, bien que je n'ai jamais fait de voile et ne sais donc pas ce qu'il en est en vrai, je trouvais mieux qu'il faille un certain temps pour vaincre la vitesse en cours car le voilier n'a pas de frein-moteur. Et même si c'est peut-être possible en vrai en jouant sur les voiles, ça oblige le joueur à prévoir un minimum le ralentissement nécessaire, pour arriver à vitesse minimale prêt du quai ou pour éviter les obstacles.

Pour les mêmes raisons ludiques, je ne lui permets pas de tourner instantanément à 90°. Comme ça, le joueur doit rester attentif et prévoyant s'il ne veut pas se payer un rocher ! J'ai un moment caressé l'idée de le faire chavirer s'il tournait trop brusquement mais je ne suis finalement pas allé jusque là.  ;)

PS : Merci pour ton explication de l'algo. Je ne doute pas que ça me servira à l'occasion.  :)

#18 Not Quite Dead

Not Quite Dead

    Rincevent


Posté 28 avril 2009 - 07:36

Bien le bonjour, comme j'ai un problème afférent et que celui d'elendell semble résolu, je me permets de poster ici. :shock:

Dans le cadre d'un piège faisant tomber des lances sur le sol, j'essaie de compenser les limitations SetAtStart par Get/SetAngle.

Voici ce qui devrait se passer dans le meilleur des mondes possibles:

Des activators avec un mesh de lance traversent en diagonale un couloir, blessant tout acteur touché, puis sont immédiatement replacés à leur position initiale lorsqu'ils touchent le sol et reprennent leur course. Chaque lance a sur les axes Y et Z une rotation (et donc une trajectoire) qui lui est propre. Le même script est attaché à chacune de ces lances.

Ayant constaté que SetAtStart tenait compte de la position X, Y, Z dans l'éditeur, mais pas de ses rotations X, Y, Z, j'ai essayé de compenser en me servant de GetAngle pour enregistrer les rotations propres aux lances en début de script, de manière à pouvoir les restaurer par la suite. Apparemment, ça ne fonctionne pas: comme avec SetAtStart, les rotations sont remises à 0 et non à leur position initiale dans l'éditeur.

Begin FoB_ThrownHurtingSpears

Short Setup
Float RotaY
Float RotaZ

if ( MenuMode == 1 )
	Return
endif

if ( Setup == 0 )
	Set RotaY to ( GetAngle, Y )
	Set RotaZ to ( GetAngle, Z )
	Set Setup to 1
endif

HurtCollidingActor 75

if ( GetPos Z <= -1300 )
	SetAtStart
	SetAngle, Y, RotaY
	SetAngle, Z, RotaZ
	MessageBox "reseté", "ok"
	Return
endif

Move Y 10

End FoB_ThrownHurtingSpears

Quelqu'un pourrait-il me dire où je fais erreur?
« I was a soldier! I killed people!
- You were a doctor!
- I had bad days! »
John Watson, en train d'étrangler Sherlock Holmes, Sherlock - A Scandal in Belgravia (2012)
---------------
Vous aussi rejoignez les Fervents Partisans de l'Immuabilité Avatarienne!
---------------
VGM impénitent (était-il besoin de le préciser?)
---------------
Paterfamilias niv.IV

#19 alliop

alliop

    Renaissance de l'art magique.


Posté 28 avril 2009 - 15:48

Je me souviens d'une très ancienne discussion sur un sujet voisin (il me semble), où Alree donnait pour solution de modifier l'axe 0 de l'item en l'axe voulu directement dans le .nif sous un éditeur 3D .

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


#20 elendell

elendell

    Mécano Dell'Arte


Posté 28 avril 2009 - 16:06

Salut !

Je n'ai jamais utilisé "SetAtStart" et découvre donc ses limitations (merci pour l'info).

Il est possible que, comme tu utilises "SetAtStart" et "SetAngle" dans la même frame, la limitation de la première empêche l'action de la deuxième.

A ta place, j'essaierais deux choses :

1) Utiliser une frame supplémentaire après le "SetAtStart", consacrée aux "SetAngle". Ils s'appliqueront alors sur l'objet déjà replacé à x, y, z d'origine.

2) Ne pas utiliser du tout "SetAtStart" mais "GetPos" et "SetPos" à la place.


Question : Pourquoi l'angle y ? Ne serait-ce pas l'angle x qu'il faudrait réinitialiser (ou les deux si la lance a une lame plate qui doit avoir un angle précis) ?

PS : Rappelles-moi à l'occasion de ne jamais me promener dans tes couloirs...  :peur:

#21 Not Quite Dead

Not Quite Dead

    Rincevent


Posté 02 mai 2009 - 17:00

Après des tests, il semblerait que seul setangle Z fonctionne comme il faut. :)

En farfouillant sur le net, je suis tombé sur cet article qui confirme mes soupçons: les axes des x et des y ne sont probablement pas ceux du monde mais ceux de l'objet, de sorte que setangle Y fait tournoyer la lance sur elle-même au lieu de l'incliner en direction du sol comme le fait dans le tescs une rotation sur l'axe des Y.

Il va me falloir comprendre ces histoires de rapporteur dont parle Simpleton pour voir si j'arrive à tirer de la fonction ce dont j'ai besoin (orienter les lances sur l'axe des y). :)

[edit] Après d'autres tests ingame, j'ai pu expérimenter ce qui se passe a priori avec les setangle:

SetAngle X contrôle le tangage: un SetAngle X positif fait piquer du nez le mesh alors qu'un négatif le fait remonter.
Spoiler

SetAngle Y contrôle le roulis: un SetAngle Y positif incline le mesh sur sa gauche alors qu'un négatif l'incline sur sa droite.
Spoiler

SetAngle Z contrôle le lacet: un SetAngle Z positif fait pivoter le mesh sur sa droite alors qu'un négatif le fait pivoter sur sa gauche.
Spoiler
Trouver un script générique qui fonctionne pour toutes les lances risque d'être compliqué...[/edit]
« I was a soldier! I killed people!
- You were a doctor!
- I had bad days! »
John Watson, en train d'étrangler Sherlock Holmes, Sherlock - A Scandal in Belgravia (2012)
---------------
Vous aussi rejoignez les Fervents Partisans de l'Immuabilité Avatarienne!
---------------
VGM impénitent (était-il besoin de le préciser?)
---------------
Paterfamilias niv.IV

#22 elendell

elendell

    Mécano Dell'Arte


Posté 02 mai 2009 - 17:09

Voir le messageNot Quite Dead, le 02.05.2009 à 16:31, dit :

les axes des x et des y ne sont probablement pas ceux du monde mais ceux de l'objet, de sorte que setangle Y fait tournoyer la lance sur elle-même au lieu de l'incliner en direction du sol comme le fait dans le tescs une rotation sur l'axe des Y.
Je confirme. C'était la raison de ma question :

elendell dit :

Pourquoi l'angle y ? Ne serait-ce pas l'angle x qu'il faudrait réinitialiser (ou les deux si la lance a une lame plate qui doit avoir un angle précis)
Si tu veux donner une inclinaison vers le sol, c'est l'angle x que tu dois utiliser et sur le côté (pour pencher à gauche par ex.), c'est l'angle y.

Mais c'est la même chose pour "SetAngle z". Quand tu utilises "SetAngle z", tu ne donnes pas une inclinaison vers la hauteur mais tu fais pivoter "autour" de l'axe z. Le point central de l'objet étant le point de pivot (où passe la ligne z).
Avec "SetAngle", tu dois considérer l'axe donné comme le pivot. Alors qu'avec "Move", le déplacement se fait le long de l'axe.

Avec les deux fonctions, les axes sont ceux de l'objet et nom du monde. Note : "GetAngle" retourne l'angle par rapport au monde car il ne peut pas retourner l'angle de l'objet par rapport à l'objet. Il serait toujours de 0.

EDIT :

Citation

Trouver un script générique qui fonctionne pour toutes les lances risque d'être compliqué...
Je ne vois pas pourquoi puisqu'il s'agit de replacer la lance à sa position d'origine avec son angle d'origine...

#23 Not Quite Dead

Not Quite Dead

    Rincevent


Posté 02 mai 2009 - 17:26

Voir le messageelendell, le 02.05.2009 à 18:08, dit :

Voir le messageNot Quite Dead, le 02.05.2009 à 16:31, dit :

les axes des x et des y ne sont probablement pas ceux du monde mais ceux de l'objet, de sorte que setangle Y fait tournoyer la lance sur elle-même au lieu de l'incliner en direction du sol comme le fait dans le tescs une rotation sur l'axe des Y.
Je confirme. C'était la raison de ma question :

elendell dit :

Pourquoi l'angle y ? Ne serait-ce pas l'angle x qu'il faudrait réinitialiser (ou les deux si la lance a une lame plate qui doit avoir un angle précis)
Si tu veux donner une inclinaison vers le sol, c'est l'angle x que tu dois utiliser et sur le côté (pour pencher à gauche par ex.), c'est l'angle y.

Mais c'est la même chose pour "SetAngle z". Quand tu utilises "SetAngle z", tu ne donnes pas une inclinaison vers la hauteur mais tu fais pivoter "autour" de l'axe z. Le point central de l'objet étant le point de pivot (où passe la ligne z).
Avec "SetAngle", tu dois considérer l'axe donné comme le pivot. Alors qu'avec "Move", le déplacement se fait le long de l'axe.
Ne connaissant pas cette particularité de SetAngle, je m'étais mépris sur le sens de ta question. Je croyais jusqu'alors que SetAngle avait le même effet que la rotation. ;) Du coup j'ai un peu l'impression d'avoir enfoncé des portes ouvertes. :huhu:

Voir le messageelendell, le 02.05.2009 à 18:08, dit :

Citation

Trouver un script générique qui fonctionne pour toutes les lances risque d'être compliqué...
Je ne vois pas pourquoi puisqu'il s'agit de replacer la lance à sa position d'origine avec son angle d'origine...
Je vais me livrer à quelques essais (si possible ce soir) et te tiendrai au courant de mon succès ou de mes difficultés.
« I was a soldier! I killed people!
- You were a doctor!
- I had bad days! »
John Watson, en train d'étrangler Sherlock Holmes, Sherlock - A Scandal in Belgravia (2012)
---------------
Vous aussi rejoignez les Fervents Partisans de l'Immuabilité Avatarienne!
---------------
VGM impénitent (était-il besoin de le préciser?)
---------------
Paterfamilias niv.IV

#24 elendell

elendell

    Mécano Dell'Arte


Posté 02 mai 2009 - 23:14

J'ai pris la liberté de faire quelques essais de mon côté. Je reconnais que la situation est troublante et j'ai mis pas mal de temps pour comprendre pourquoi ça ne fonctionnait pas.

En fait, tu n'as pas besoin de "SetAngle", et "SetAtStart" fonctionne très bien, si on considère qu'elle est destinée à replacer un objet à ses coordonnées d'origine (y compris les angles). Seulement, si elle redonne bien les angles donnés à l'objet, elle les redonne selon les angles du monde (comme les récupère "GetAngle").

Quand tu places un objet dans le Tescs, les plans changent car ils sont interdépendants. Par exemple : Tu poses une lance et ses angles sont de 0, 0, 0. Puis tu lui donnes une inclinaison en fixant l'angle x à 20. Si après ça tu donnes 260 à l'angle z, l'objet ne se positionnera pas à 260 de l'angle z du monde. Ceci car l'axe z n'est plus perpendiculaire au plan x0, y0 du monde.

Quand tu as incliné l'objet avec x 20, tu as incliné tout le plan. Donc l'axe z s'est incliné avec lui et le z 260 que tu as fait par la suite s'est fait sur ce nouveau plan incliné. A chaque fois que tu modifies un angle (dans le Tescs), tu modifies tout le plan. C'est pour cela que tu peux placer deux objets exactement au même endroit, en leur donnant pourtant des angles différents.

Par contre, quand tu fais "SetAtStart", il récupère les valeurs des angles prédéfinies ("GetAngle") et redonne chaque angle à l'objet par rapport à ses coordonnées locales mais selon le plan fixe du monde ! (Merci Bethesda pour cette différence  :huhu:)

Concrètement, ce script suffit pour ton bonheur :

Begin FoB_ThrownHurtingSpears

Short Setup

if ( MenuMode == 1 )
	Return
endif

HurtCollidingActor 75

if ( Setup == 0 )
	SetAtStart
	Set Setup to 1
elseif ( GetPos Z <= -1300)
	Set Setup to 0
	Return
endif

Move Y 40

End FoB_ThrownHurtingSpears

Mais, pour placer chaque lance dans le Tescs, il faut traiter chaque angle un après l'autre. Par exemple : D'abord, tu lui donnes l'inclinaison souhaitée avec x, tu notes cet angle x et tu le remets à 0. Puis, avec tous les angles à 0, tu changes l'angle z pour l'orienter. Une fois qu'elle est bien orientée, tu lui redonnes l'angle x que tu avais noté.

Tu constates qu'elle n'a pas l'inclinaison que tu avais choisie quand z était à 0 mais cela n'a aucune importance (sauf que c'est un peu plus difficile pour visualiser le résultat) car le "SetAtStart" de la frame 0 va la placer dans la bonne position. Voili...

PS : J'ai testé avec une lance et non un activateur mais je ne vois pas pourquoi cela ferait une différence, sauf que je ne me suis pas préoccupé de "HurtCollidingActor".

#25 Not Quite Dead

Not Quite Dead

    Rincevent


Posté 03 mai 2009 - 09:11

Cela fonctionne parfaitement, elendell. :laughing1: :sorcerer: :mrgreen:

Je te suis très reconnaissant d'être parvenu à résoudre en deux coups de cuillère à pot ce problème sur lequel je m'arrachais les cheveux depuis une bonne semaine. Comme ma femme me reproche une légère tendance à la calvitie, je me permets de te remercier également de sa part. :laughing1:

J'ai ajouté un son d'arbalète et augmenté leur vitesse. Lorsque j'aurai terminé la cellule, je posterai sans doute une petite vidéo sur le thread du mod, histoire que vous voyiez le résultat. :)
« I was a soldier! I killed people!
- You were a doctor!
- I had bad days! »
John Watson, en train d'étrangler Sherlock Holmes, Sherlock - A Scandal in Belgravia (2012)
---------------
Vous aussi rejoignez les Fervents Partisans de l'Immuabilité Avatarienne!
---------------
VGM impénitent (était-il besoin de le préciser?)
---------------
Paterfamilias niv.IV




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

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