Voilà, j'ai un problème d'ordre trigonométrique. Grace à getCollisionPoint() je récupère le triangle causant la collision avec une ligne.
Jusque là, tout va bien! Je récupère sa normale avec getNormal(), facile! Et là, c'est le drame!
Je ne voit pas comment trouver l'angle qui sépare le plan XZ et le plan du triangle récupéré.
Pour illustrer avec des mots, la camera doit se tenir à une certaine distance du sol (ça c'est fait, il n'y a eu aucun problème), maintenant si le sol est trop incliné la camera doit glisser le long de la pente ou ne pas pouvoir monter plus haut, tout dépend de mes besoins. Ce serait bête que mon perso puisse grimper n'importe où et qu'il sorte de la map!
PS : Utiliser un moteur physique serait plus logique mais mon niveau ne me le permet pas (j'ai déjà essayé sans succès). Irrlicht gère les collisions mais je souhaite rajouter des fonctionnalités propres au fonctionnement de mon jeu ce que je ne peux pas vraiment faire si j'utilise createCollisionAnimatorResponse().
Hors ligne
J'ai peut-être un début de solution en fait. Je me suis borné (gros problème quand on fait des maths) à obtenir un angle mais je devrais peu-être en utiliser deux (entre X et Y, entre Z et Y) afin de calculer le vector3df qui me permettra de faire "glisser" ma camera.
Je suis tomber sur la fonction normalize(), est-ce que cela veut bien dire que la norme des trois composantes de ma normale est égale à 1? Question bête mais on ne sait jamais!
Si c'est le cas, cos angle_XY = ( 1 / normale.X ), j'en déduis le déplacement sur X.
Un truc du genre : déplacement sur X = ( normale.X / abs(normale.X) ) * cos angle_XY * coef_gravité.
-> ( normale.X / abs(normale.X) ) me donne le signe du deplacement sur X.
Et je fait la même sur Z. Pour Y se sera géré par la collision.
Qu'est-ce que vous en pensez?
Hors ligne
johnplayer :
Je suis tomber sur la fonction normalize(), est-ce que cela veut bien dire que la norme des trois composantes de ma normale est égale à 1? Question bête mais on ne sait jamais!
Oui, Exemple: si ton vecteur est v(3 1 2), alors sa après normalization tu obtiendra v(0.802 0.267 0.534).
Hors ligne
Ca y est j'ai trouvé une astuce toute cone pour gérer la gravité.
Donc :
Position = camera->getPosition() et normale.normalize() et intersection = point de collision;
Je fais reculer le personnage suivant la normale du plan sur lequel il est :
Position.Y = intersection.Y + normale.Y;
et ensuite pour rétablir la position de la camera par rapport au sol (car l'ajout de la normale change mon Position.Y), je fais :
Et si je n'est pas de collision Position.Y + 5*gravité (comme ca, ca descend plus vite).
Sinon, merci tmyke pour la confirmation.
Hors ligne
Sympa que tu ai obtenu l'effet recherché.
Sinon, il me semble qu'il y a une fonction dans Irrlicht, getHorizontalAngle() dans 'vector3d.h', cela pourrait s'approcher (voir t'inspirer) de ce que
tu cherchais...
Dernière modification par tmyke (05-10-2008 17:00:55)
Hors ligne
getHorizontalangle ne donne que Y et Z donc ca n'aurait pas été mais sinon ca va m'être utile pour d'autre chose que je compte faire donc merci pour l'info.
Sinon autre question bête, setLenght sert à modifier la norme donc ca ne modifie en rien le sens et la direction du vecteur?
Par conséquent, si je fait vecteur.normalize() ou vecteur.setLenght(1.0f) j'obtiendrais le même vecteur.
Hors ligne
johnplayer :
Sinon autre question bête, setLenght sert à modifier la norme donc ca ne modifie en rien le sens et la direction du vecteur?
Par conséquent, si je fait vecteur.normalize() ou vecteur.setLenght(1.0f) j'obtiendrais le même vecteur.
Oui, tout a fait, d'ailleurs pour résumer la fonction SetLenght de Irrlicht , elle fait d'abord un normalize, et en suite elle multiplie le vecteur normalisé par
la taille en valeur que l'on fournis à la fonction...
Hors ligne
J'ai une dernière question au niveau du système d'axe d'Irrlicht. Si je ne m'abuse, lorsque l'on effectue une rotation d'un node le repère qui lui est associé tourne avec lui car il tourne par rapport au repère fixe (0,X,Y,Z) du World d'Irrlicht.
Je m'explique : quand la camera tourne l'axe Z pointe toujours devant elle?
Merci pour l'aide.
Hors ligne
johnplayer :
J'ai une dernière question au niveau du système d'axe d'Irrlicht. Si je ne m'abuse, lorsque l'on effectue une rotation d'un node le repère qui lui est associé tourne avec lui car il tourne par rapport au repère fixe (0,X,Y,Z) du World d'Irrlicht.
Je m'explique : quand la camera tourne l'axe Z pointe toujours devant elle?
Merci pour l'aide.
Je t'avoue qu'étant encore dans ma phase d'apprentissage, je ne pourrais pas être catégorique la dessus, mais a vue de pif je
dirais oui... (rotation du repère local).
Hors ligne