Pages: 1
Bonjour,
voila, pour incliner un mesh (ici une fourmi) qui évolue sur un terrain, j'utilise les triangles selectors en créant une ligne au dessus du mesh et en récupérant le triangle de la collision avec cette ligne, je récupère sa normale. Mais voila, mon mesh s'incline n'importe comment, je ne sais plus quoi faire... Merci d'avance
voici le code :
Dernière modification par mr.xyz (29-07-2010 17:54:12)
Hors ligne
ca vient de
acos c'est arscosinus et pour obtenir un angle il faut donnée le rapport de deux longueurs , faire un petit tour sur des cours de trigonometrie peut etre .Ou bien utiliser des fonctions toutes faites regarde dans la doc de irr::core::vector3d , il y a des methodes pour recupérer des angles à partir d'un vecteur : getHorizontalAngle ,getSphericalCoordinateAngles , devrait faire l'affaire si je ne m'abuse.
Dernière modification par firnafin (29-07-2010 21:53:59)
Hors ligne
Si je veux l'inclinaison en X du terrain pour le mesh, il faut bien que je fasse le produit scalaire de la normal au terrian (normalisée) et de l'axe X(1,0,0) ? Ce produit scalaire renvoi le cosinus de l'angle donc je pensait qu'avec arc cosinus je retrouvais l'angle..
Hors ligne
le produit scalaire entre le vecteur normale est l'axe X ne donne pas le cos de l'angle X, mais le cos de l'angle entre les 2 vecteurs.Si tu veux le faire ac la trigo sans passer par les methodes que j'ai citées , tu peux faire comme ca :
Angle_X=atan2(Normale_Z,Normale_Y)*RADTODEG;
Angle_Z=-atan2(Normale_X,Normale_Y)*RADTODEG;
Node->setRotatio(vector3df(Angle_X,0,Angle_Z));
( le moins vient du fait que les rotations d' irrlicht tourne dans le sens anti-trigo selon Z , rotation de l'axe X vers l'axe Y )
Et la ca devrait marcher.
Dernière modification par firnafin (30-07-2010 15:10:25)
Hors ligne
euh sa ne marche pas, les deux angles restent entre 0,0 et 0,1
le code:
Dernière modification par mr.xyz (30-07-2010 14:39:23)
Hors ligne
firnafin :
le produit scalaire entre le vecteur normale est l'axe X ne donne pas le cos de l'angle X, mais le cos de l'angle entre les 2 vecteurs.
Je sais bien c'est pour ca, je sais que le produit scalaire renvoi l'angle entre deux vecteurs, je voulais obtenir l'angle entre l'axe X et la normale du terrain (normalisée). Mais faire le produit scalaire avec (1,0,0) sa revient a garder juste la coordonnée X (en tant que cosinus du coup, c'est bizarre en effet mais logique non ?) . Ensuite bah avec acos je retrouvais l'angle (je commence a douter si c'est bien l'angle que je recherche...)
Hors ligne
comme je l'ai deja dit ce n'est pas la meme chose ; exemple : normale_x= < (1,1,1) , (1,0,0) > = 1 , acos(1)=0 de meme selon Z et Y on trouve 3 angles de 0 .... impossible.
Ce que je t'ai donné marche parfaitement il me semble. Deja tu as oublié de multiplier les arc-tangent par irr::core::RADTODEG. De plus tu gardes la rotation selon Y ce qui fait tout planter ( tu rajoute une rotation , alors que les 2 angles fournis suffisent à avoir l'alignement de la direction Y du node avec le vecteur normal ).
Dernière modification par firnafin (30-07-2010 15:06:07)
Hors ligne
Ah oui j'avai oublié le radtodeg, sa a l'air de marcher maintenant, par contre je ne comprends pas pourquoi la rotation en Y ferait tout planter, il faut bien que mon mesh tourne quand même
Hors ligne
setRotation définie une rotation dans le repere parent. Par exemple supposons que la normale soit (1,1,1) et que tu ais fait la rotation selon X et Z comme ci dessu ,si tu rajoutes une composante selon Y de 45 alors le vecteur (0,1,0) de ton perso va se retrouvée en (0,quelque chose,quelque chose) ce qui est différent de (1,1,1). ce qu'il faut faire c'est faire tourner la node dans son repere selon Y. Pour ce faire tu récupères la matrice de la node par m=node->getTransformation() puis tu recupére l'axe Y perso_y=m.rotateVect(0,1,0) puis node->setRotation(angle_souhaité*perso_y)
Hors ligne
firnafin :
setRotation définie une rotation dans le repere parent. Par exemple supposons que la normale soit (1,1,1) et que tu ais fait la rotation selon X et Z comme ci dessu ,si tu rajoutes une composante selon Y de 45 alors le vecteur (0,1,0) de ton perso va se retrouvée en (0,quelque chose,quelque chose) ce qui est différent de (1,1,1).
Je ne comprends pas trop ce que tu veux dire :p :
- le repère parent standard c'est bien le repère général, celui de la scène? (simple question ^^)
- de quelle normale parles tu, celle du terrain ou du mesh ?
- une composante Y de 45 => tu veux dire une rotation de 45 ° pour tourner le personnage ?
firnafin :
ce qu'il faut faire c'est faire tourner la node dans son repere selon Y. Pour ce faire tu récupères la matrice de la node par m=node->getTransformation() puis tu recupére l'axe Y perso_y=m.rotateVect(0,1,0) puis node->setRotation(angle_souhaité*perso_y)
- l'angle souhaité est le vecteur de rotation, avec Y à 0 comme tu disais ?
- rotateVect est de type void, je pense donc que tu voulais dire de créer un vector (0,1,0) et de le passer en passer en référence ?
- ensuite setRotation prends en paramètre un vecteur, donc je ne comprends pas "angle_souhaité*perso_y"
Merci d'avance
Dernière modification par mr.xyz (05-08-2010 18:32:43)
Hors ligne
mr.xyz :
- le repère parent standard c'est bien le repère général, celui de la scène? (simple question ^^)
pas toujours, tu peux affilier une node a une autre node ( du coup le parent n'est pas le repère general )
exemple : la tourelle d'un char avec pour parent le char, ainsi setRotation(irr::core::vector3df(0,1,0)) va faire tourner la tourelle comme il faut meme si le char admet lui aussi des rotations dû au terrain par exemple, si la tourelle n'est pas fils de char setRotation(irr::core::vector3df(0,1,0)) va faire n'importe quoi .
le parent par defaut est "root" ( cf irr::scene::scenemanager::getRoot ) qui fournie le repère general.
mr.xyz :
- de quelle normale parles tu, celle du terrain ou du mesh ?
celle du terrain.
mr.xyz :
- une composante Y de 45 => tu veux dire une rotation de 45 ° pour tourner le personnage ?
oui
mr.xyz :
- l'angle souhaité est le vecteur de rotation, avec Y à 0 comme tu disais ?
Je parlais la de l'angle selon l'axe Y, comment la node tourne pour se déplacer.
mr.xyz :
- rotateVect est de type void, je pense donc que tu voulais dire de créer un vector (0,1,0) et de le passer en passer en référence ?
Il y a plusieurs rotateVect, a toi de prendre celui qui t'arrange c'est pour ca que j'ai écrie en pseudo code juste pour d'indiquer la fonction à utiliser.
mr.xyz :
- ensuite setRotation prends en paramètre un vecteur, donc je ne comprends pas "angle_souhaité*perso_y"
Ici perso_y c'est le vecteur recupéré par rotateVect. De toute maniere je viens de constater que j'ai oublier une etape, pour faire ce que je disais ; il faut passer par les quaternions , le code devient alors :
Sinon tu peux rajouter une composante de rotation selon Y comme tu disais c'est plus simple mais si la normale n'est pas proche de (0,1,0) il va y avoir de drôle de comportement, teste et adopte la méthode qui te convient le mieux.
Hors ligne
Merci pour l'aide déja . Par contre cette méthode marche déja mieux que la dernière que tu proposais mais le node change parfois de direction (axe Y) brutalement 0o
Hors ligne
Je n'arrive vraiment pas à trouver la bonne solution.. Depuis 2 semaines j'étais persuadé que la méthode atan2 marchait (j'avais rien remarqué de bizarre) mais aujourd'hui en m'approchant d'un bord de la map assez incliné, je me suis aperçu que le node n'était pas du tout bien incliné.
Bref, je m'y perds.. Pour être plus précis, je dirige une fourmi au clavier (comme un jeu de voitures).
z: avancer
s: reculer
q: rotation gauche
d: rotation droite
As tu déjà réussi à implémenter ça sur irrlicht ? Sa parait simple au premier abord (ayant fait beaucoup de jeux 2D je m'attendais pas à ça ^^ ) mais je trouve aucune solution, même sur les forums anglais...
Y a t-il un ordre dans l'exécution des évènements : d'abord les rotations en Y (direction) et ensuite X et Z (inclinaison) pour faciliter le code?
J'ai essayé la méthode des quaternions, et les autres dans tous les sens possibles, lu des cours de maths sur les matrices et les vecteurs.. Mais toujours aucune illumination pour incliner le node en fonction de la normale .
Bref, need help
Dernière modification par mr.xyz (19-08-2010 00:40:25)
Hors ligne
Pages: 1
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 11 invités en ligne Aucun membre connecté RSS Feed |