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
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 ?
Hors ligne
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
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 ?
Hors ligne
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
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.
Hors ligne
Merci tmyke, en effet il ne faut pas que je confonde physique et collision^^.
Le NewtonCreateSphere a l'air de marcher
Hors ligne
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 96 invités en ligne Aucun membre connecté RSS Feed |