#0 

05-10-2008 12:25:12

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

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().


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#1 

05-10-2008 13:03:56

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

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?


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#2 

05-10-2008 16:35:38

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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).


Force et sagesse...

Hors ligne


#3 

05-10-2008 16:54:31

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

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.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#4 

05-10-2008 16:59:37

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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...   wink

Dernière modification par tmyke (05-10-2008 17:00:55)


Force et sagesse...

Hors ligne


#5 

05-10-2008 17:51:32

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

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.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#6 

05-10-2008 18:04:54

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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...


Force et sagesse...

Hors ligne


#7 

05-10-2008 18:19:04

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

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.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#8 

06-10-2008 18:31:10

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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). hmm


Force et sagesse...

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
71 invités en ligne
Aucun membre connecté
RSS Feed