Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Irrlicht]Un projectile

Comment simuler son tracé

Sujet résolu
3 juin 2007 à 17:11:14

Bonjour tout le monde !

Tout est un peu dans le titre :p
Je voudrais en effet avec Irrlicht simuler le lancer/la trajectoire d'un projectile.
Mais celui ci devras être lancer dans la direction de la camera a la façon d'un FPS.
Je reprend pour exemple la grenade de mon dernier post, je voudrais par exemple que elle soit lancer dans le sens de la camera.
Je pensais plutôt faire sa avec la gravité ; mais après comment faire pour ajouter une force décroissante a la grenade en direction du point visé ?

Il faudrait en plus que la grenade puisse rebondir si elle cogne contre un mur, mais sa sa serat pour plus tard, voyons l'essentiel pour le moment ^^

J'ai bien pensé a utiliser Newton mais bon je préfèrerais ne pas utiliser de lib en plus étant donner que pour un simple lancer de grenade on doit pouvoir s'en passer...

Merci a tous !
  • Partager sur Facebook
  • Partager sur Twitter
3 juin 2007 à 17:53:28

Salut,
Si tu as dev c++, il y a un exemple avec des boules de feu.
Tu peux peut etre t'en inspirer. ;)

Gp2mv3
  • Partager sur Facebook
  • Partager sur Twitter
3 juin 2007 à 18:07:28

Salut.

La première solution qui me vient à l'esprit c'est de se servir de vecteurs pour déplacer ta grenade.

Tu choppe le vecteur qui correspond à la visée de ta caméra. (tout est là dedans, cherche un peu ;) : http://irrlicht.sourceforge.net/tut007.html)

Ensuite tu crée un vecteur pour la gravité.

Et finalement tu déplace ta grenade des 2 vecteurs à chaque boucle de rendu (enfin je suis pas sur là. Faut voit si ça passe avec du time ellapsed) et tu te débrouille pour que le vecteur gravité augmente au fur et à mesure.
Ou que l'autre diminue, ça dépend comment on voit les choses.

Après pour les collisions c'est une autre histoire.
Et pour les rebond c'est encore pire. ;)
  • Partager sur Facebook
  • Partager sur Twitter
4 juin 2007 à 13:06:05

Pour le tuto d'irrlicht c'est pour mettre une gravité a un objet ?
En fait j'avais d'abord pensé a cette solution, mais le problème c'est que il faut utiliser les timer et la je n'y conait rien avec Irrlicht.
Bon ba je vais chercher un peu dans la doc alors ^^

Pour le principe il faudrait ne déplacer la grenade que d'une partie du vecteur tout les tant de ms pour que la grenade ne fasse pas tout le trajet d'un coup ?
Est ce que cette méthode marche avec la gravité associé au mesh (createCollisionResponseAnimator) ?

EDIT : Après un petit tour dans la doc l'utilisation du timer ne m'a pas l'air bien compliquer :p
  • Partager sur Facebook
  • Partager sur Twitter
4 juin 2007 à 14:03:32

Citation : Pas de titre

Pour le tuto d'irrlicht c'est pour mettre une gravité a un objet ?


Non, c'est pour récupérer le vecteur de visée de la caméra. Dans le tuto ils s'en servent pour créer un laser représentant ledit vecteur.


Citation : Pas de titre

En fait j'avais d'abord pensé a cette solution, mais le problème c'est que il faut utiliser les timer et la je n'y conait rien avec Irrlicht.


Pas forcément mais si tu veux avoir la même vitesse indépendamment du système, alors oui.


Citation : Pas de titre

Pour le principe il faudrait ne déplacer la grenade que d'une partie du vecteur tout les tant de ms pour que la grenade ne fasse pas tout le trajet d'un coup ?


Non, le vecteur entier.
Pour faire simple mettons sans gravité :

Tu as le vecteur représentant la visée de ta caméra.
Tu ajoute ce vecteur à la position de ta grenade. Et c'est tout. ^^

C'est là que le time ellapsed peux entrer en jeu pour déterminer combien de fois tu bouge les coordonnées de ta grenade dans un certain intervalle de temps.

Après pour ajouter de la gravité, tu crée un vecteur pointant vers le sol.
Puis au moment d'ajouter le vecteur de visée de la caméra, tu ajoute aussi le vecteur de gravité.

Le truc c'est que pour plus de réalisme, il faudrait que le vecteur de gravité soit plus important au fil du temps.
Comme ça la grenade descend plus vite en fin de parcours qu'au début.
  • Partager sur Facebook
  • Partager sur Twitter
4 juin 2007 à 15:23:27

Ok j'ai compris le principe.
Du toute façon pour les collision il suffit que je rajoute ceci :
scene::ISceneNodeAnimator *anim = scenegraph->createCollisionResponseAnimator(
                selector, Ngrenade, core::vector3df(10,10,10),
                core::vector3df(0,-0.1,0),
                core::vector3df(0,0,0));
                Ngrenade->addAnimator(anim);
anim->drop();

Sa devrait arrêter la grenade si elle rencontre un mur et elle devrait tomber net.
Mais sa ne gère pas le rebondissement, dommage...

Je vais tester un peu tout sa et vous dire si sa marche :D
Merci beaucoup !

EDIT : Je vais lire ton tuto Yno sa ma l'air des plus interressant, notemment que je ne connaissait pas le principe de la normalisation alors qu'on en voit souvent dans Irrlicht :D , Merci !
  • Partager sur Facebook
  • Partager sur Twitter
6 juin 2007 à 21:03:09

Bon après un acharnement terrible(j'avais oublier le Ngrenade->setPosition() :D ) j'ai enfin obtenus un résultat potable.
Quand je lance la grenade une parrabole se créer et la grenade a une trajectoire a peu près réel.
Seuleument je voudrais pouvoir simuler une force de frotement.
Pour le moment c'est l'inertie qui s'applique, ducoup la grenade continue d'avancer sans arrêter...
  • Partager sur Facebook
  • Partager sur Twitter
8 juin 2007 à 10:16:10

la il faut que tu te mettent à la physique :lol:

tu doit definir une vittesse max par rappor au poids
(et oui une balle de tennis ne va pas à la meme vittesse qu'une boule de pétanque sauf si tu les lance dans le "vide absolue :-° ")
et code les forces freinante ^^ (c'est assez simple il suffit d'un peu de logique)
  • Partager sur Facebook
  • Partager sur Twitter
8 juin 2007 à 11:34:14

Pour cela il suffit d'etablir une éqation toute bete du genre vitesse max = poid * n ou n est un réel qui determine la vitese max par exemple n = 10.
Pour les forces de frotements il faudrait ensuite réduire le vecteur de déplacement a chqaue fois qu'il y a une collision, sa me parrais bien.
Je vais tester tout sa encore merci !
  • Partager sur Facebook
  • Partager sur Twitter
8 juin 2007 à 13:18:51

presque ^^ mais ca devrait etre pas mal quand meme

Citation : atoboldom

il suffit d'etablir une éqation toute bete du genre vitesse max = poid * n ou n est un réel qui determine la vitese max par exemple n = 10.



en fait il faudrait plutôt vitesseMax = poid*(n*n));
et oui la vitesse est plus important que le poid :D .
  • Partager sur Facebook
  • Partager sur Twitter
9 juin 2007 à 0:36:23

Merci je vais continuer a plancher sur les forces de frotements car en fait pour le moment le calcul de la vitesse max n'est pas très important, étant donner que ma grenade ferat toujours le même poid la vitesse au moment du lancé seras toujours la même !

Par contre si l'un de vous connaitrais une solution pour savoir si un objet est en collision avec un autre sa m'aiderais beaucoup, parceque la je vois comment faire pour un mur mais pas pour le sol...
  • Partager sur Facebook
  • Partager sur Twitter
9 juin 2007 à 8:25:55

Les forces de frottements sont une décélération.
Normalement, tu as un vecteur vitesse.
Pour prendre en compte la gravité, tu fais z-=constante.
Pour prendre ne compte les frottements, vecteur vitesse*=une constante. (Force de frottement linéaire)
Les collisions, c'est beaucoup plus compliqué.
Il faut un moteur physique (peut-être que Irrlicht le peut aussi)
  • Partager sur Facebook
  • Partager sur Twitter
9 juin 2007 à 14:08:33

Pour la gravitée Irrlicht le gère très bien et ma grenade retombe normalement :)
Pour ce qui est des collisions Irrlicht le gère aussi, si la grenade rencontre un mur elle serat stoppée et continueras a redescendre, le rebond n'est pas gérer mais je crois, vue la complexité(en dehors du moteur physique), que je vais m'en passer :D

Mais bonne nouvelle j'ai trouver dans la doc une class très interressante :
irr::scene::ISceneNodeAnimatorCollisionResponse


Et dedans se trouve une méthode permettant de savoir si l'objet est en train de tomber ou si sa chute a été stopper par quelque chose(mur, objet, ect...), cette méthode :
virtual bool irr::scene::ISceneNodeAnimatorCollisionResponse::isFalling()

Méthode qui retourne simplement un booléen !

Avec sa je teste si la grenade tombe, si ce n'est pas le cas alors je diminue le vecteur de déplacement jusqua qu'il atteigne 0 ;)

J'ai tester et cela marche plutôt bien, la grenade s'arrête bien !
  • Partager sur Facebook
  • Partager sur Twitter
9 juin 2007 à 15:36:10

Ben il me reste deux trois petits problèmes de réalisme à pofiner mais je devrais pouvoir me débrouiller :D
Merci à tous(encore une fois :p ) !
  • Partager sur Facebook
  • Partager sur Twitter