#0 

06-09-2009 12:27:59

Bedwynn
Petit nouveau
Date d'inscription: 01-07-2009
Messages: 4

Yop,

J'utilise Irrlicht et Newton (de base et non le wrapper IrrNewt) en C++, j'arrive a détecter lorsque 2 objets entre en collision. Cependant, je cherche a détecter si un objet (une bille pour être précis) entre en collision avec n'importe quel autre objet. Pour ce faire j'ai découvert la fonction NewtonBodyGetCollision mais je ne sais pas comment m'en servir.
Le problème vient du type de retour NewtonCollision* que je ne sais pas vraiment utilisé. Mon objectif est de faire rebondir ma bille lorsqu'elle entre en collision avec n'importe quel objet.
Je m'en retourne vers vous, pour vous demandez comment je peux utiliser cette fonction.

Si une personne se sent capable de m'expliquer comment "procéder" .

PS: Pour détecter une collision entre 2 objets définit je me sers de NewtonCollisionCollide qui me retourne le nombre de point de contact. Mais il ne me donne pas la direction de l'impact des 2 objets, ce qui est embêtant puisque je ne peux pas avoir un vecteur de rebond correct.

Hors ligne


#1 

06-09-2009 13:42:45

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

Bedwynn :

Pour détecter une collision entre 2 objets définit je me sers de NewtonCollisionCollide qui me retourne le nombre de point de contact. Mais il ne me donne pas la direction de l'impact des 2 objets, ce qui est embêtant puisque je ne peux pas avoir un vecteur de rebond correct.


NewtonCollisionCollide te renvoi les points de contact, mais aussi les normales. Les valeurs des normales devraient t'aider pour ce que tu souhaites faire, non ?


Force et sagesse...

Hors ligne


#2 

06-09-2009 15:56:35

Bedwynn
Petit nouveau
Date d'inscription: 01-07-2009
Messages: 4

Oui, NewtonCollisionCollide renvoi un tableau de normale. J'ai bien essayer d'exploiter ce tableau, mais le problème c'est que le tableau est le même pour les 2 objets qui entre en collision donc je me retrouve avec 2 objets (billes), qui ont le même vecteur est donc ce "suivent", ce qui n'est pas très réaliste voir pas du tout.
J'utilise NewtonCollisionCollide comme ça:

const int nContacts = 2;
float contacts[3 * nContacts];
float normals[3 * nContacts];
float penetration[ nContacts ];

int nHits = NewtonCollisionCollide( nWorld,nContacts, obj_A->m_collision, (float*)&mat_A[0], obj_B->m_collision, (float*)&mat_B[0], contacts, normals, penetration);


En cas de collision, entre obj_A et obj_B, j'utilise le tableau normals[], comme suit :

_ForceX += -(normals[0] + normals[3] + normals[6] + normals[9]) ;
_ForceZ += (normals[2] + normals[5] + normals[8] + normals[11]) ;
_ForceY += (normals[1] + normals[4] + normals[7] + normals[10]);


J'ajoute donc des bouts du tableau normals[] aux anciennes force. Le seul problème en faisant ça c'est que obj_A et obj_B se retrouve avec le même vecteur puisque la collision traiter dans un cas comme dans l'autre est la même.

C'est pour ça que je cherchais une autre fonction et que je suis tombé sur NewtonBodyGetCollision, mais je ne sais pas si cette fonction peux convenir et comment traiter les éventuelles information contenue dans le retour de la fonction (un NewtonCollision*).

Hors ligne


#3 

06-09-2009 17:33:35

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

Bedwynn :

C'est pour ça que je cherchais une autre fonction et que je suis tombé sur NewtonBodyGetCollision, mais je ne sais pas si cette fonction peux convenir et comment traiter les éventuelles information contenue dans le retour de la fonction (un NewtonCollision*).


NewtonBodyGetCollision ne te donnera pas ce que tu cherches, il renvoi simplement le pointeur de l'objet NewtonCollision d'un body.

Sinon, question bête, pour vouloir créer un comportement physique manuellement, alors que Newton te fourni toutes les fonctions pour faire cela ?


Force et sagesse...

Hors ligne


#4 

06-09-2009 19:01:56

Bedwynn
Petit nouveau
Date d'inscription: 01-07-2009
Messages: 4

Pour les collisions, j'utilise NewtonCreateConvexHull et avec ça, mes billes ne se comportent pas comme des billes c'est pour ça que je veux créer se rebond manuellement.
J'avais penser créer la collision avec NewtonCreateSphere, mais je n'ai pas trouver comment adapter les paramètres par rapport a ceux de mon modèle 3D qu'Irrlicht importe. En revanche, si tu sais comment faire pour que newton simule la physique en sachant que mon modèle est une bille, je suis preneur (peut-être du coter des materials ??)

Hors ligne


#5 

06-09-2009 19:52:28

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

Ben je dirais qu'a la base une bille est une sphere. Donc je passerais par un

NewtonCollision* col = NewtonCreateSphere( nWorld, taille_billeX, taille_billeY, taille_billeZ);

Par rapport au model que créé Irrlicht, il te suffit de récupérer le rayon de ta bille, c'est tout.

Par contre, il ne faut pas confondre collision et physique.


Force et sagesse...

Hors ligne


#6 

06-09-2009 20:07:27

Bedwynn
Petit nouveau
Date d'inscription: 01-07-2009
Messages: 4

Merci tmyke, en effet il ne faut pas que je confonde physique et collision^^.
Le NewtonCreateSphere a l'air de marcher smile

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
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
22 invités en ligne
Aucun membre connecté
RSS Feed