#1 

14-11-2009 19:44:03

nico
Administrateurs
Avatar de nico
Date d'inscription:
Messages: 563
IP: 82.232.128.163
Courriel

Salut, je suis en train de tester newton 2.10, et je souhaiterai établir une collision entre 2 cubes, pour les tests, j'ai placé le cube1 au dessus du cube2.
Quand je lance le programme, les 2 cubes tombent et collisionnent avec le sol, par contre le cube1 passe à travers le cube2, donc il n'y a pas de collisions entre les cubes.
Pouvez-vous me dire si j'ai oublié une étape ? merci.
voici un extrait du code

Code c++ :


 world = NewtonCreate(0,0);
 float min[] = {0, 0, 0};
 float max[] = {100000, 100000, 100000};
 NewtonSetWorldSize (world, min, max);

    colision=  NewtonCreateBox(world,1000,1000,1000,0,0);
    body1 = NewtonCreateBody(world,colision) ;
    NewtonBodySetCollision(body1, colision);
    NewtonReleaseCollision (world, colision);
    NewtonBodySetUserData(body1, cubenode1);
    NewtonBodySetMassMatrix(body1,10,2,2,2);
    matrix4 mat1 ;
    mat1.setTranslation(position);
    NewtonBodySetMatrix(body1,mat1.pointer());
    NewtonBodySetTransformCallback(body1, SetMeshTransformEvent);
    NewtonBodySetForceAndTorqueCallback(body1, ApplyForceAndTorqueEvent);

    colision2=  NewtonCreateBox(world,1000,1000,1000,0,0);
    body2 = NewtonCreateBody(world,colision2) ;
    NewtonBodySetCollision(body2, colision2);
    NewtonReleaseCollision (world, colision2);
    NewtonBodySetUserData(body2, cubenode2);
    NewtonBodySetMassMatrix(body2,10,2,2,2);
    matrix4 mat2 ;
    mat2.setTranslation(vector3df(2700*2-2000,5,2600*2+1000));
    NewtonBodySetMatrix(body2,mat2.pointer());
    NewtonBodySetTransformCallback(body2, SetMeshTransformEvent);
    NewtonBodySetForceAndTorqueCallback(body2, ApplyForceAndTorqueEvent);

while....... 

NewtonUpdate ( world, 1 / 60 ) ;

................



Merci pour votre aide.


Hors ligne


#2 

15-11-2009 10:19:36

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 90.56.69.181
Courriel

A priori c'est pourtant pas trop mal. Je sais qu'a une époque, j'avais eu des soucis avec des objets définit trop grand.
Par exemple, tu définis des cube d'une taille 1000. As-tu testé avec un environement 'plus modeste', tout simplement
des élément de 1 dans un world définit de 100 par exemple...

PS: les NewtonBodySetCollision(body, colision); ne sont pas nescessaires.


Force et sagesse...

Hors ligne


#3 

15-11-2009 13:38:59

nico
Administrateurs
Avatar de nico
Date d'inscription:
Messages: 563
IP: 82.232.128.163
Courriel

Merci tmyke, j'ai testé avec les dimensions standarts en 100x100 et malheureusement le problème persiste. j'ai eu effectivement des problèmes de dimensions avant de découvrir newtonsetworldsize().
Aussinon je me contente de reproduire les tuto(en 1.5 le plus souvent) donc je ne comprend pas ou le bat blesse.

effectivement NewtonBodySetCollision(body, colision); n'a pas d'influence quand je l'enlève, mais alors comment newton sait que je veux faire des collisions si je ne lui dit-pas ? est-ce que NewtonBodySetUserData() rempli ce rôle ? j'ai du mal à comprendre wink

Merci pour ton aide.


Hors ligne


#4 

15-11-2009 16:10:20

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 90.56.69.181
Courriel

nico Ecris:

effectivement NewtonBodySetCollision(body, colision); n'a pas d'influence quand je l'enlève, mais alors comment newton sait que je veux faire des collisions si je ne lui dit-pas ? est-ce que NewtonBodySetUserData() rempli ce rôle ? j'ai du mal à comprendre wink

En fait, quand tu définis ton body, tu passe tes info de collision à travers l'instruction NewtonCreateBody (World, collision);

Si tu veux avoir quelques info, même si mon code n'est pas super organisé, va voir le code source de N3xtD, en particulier le fichier n3xtd_PhysRigidBody.cpp
et pourquoi pas aussi n3xtd_PhysNewton.cpp
C'est totalement libre, et il y a des fonction qui devraient te servir, soient telles-quelles, soit pour comprendre certaines parties de la mise en oeuvre de Newton ( c'est
avec la version 2.XX).


Sinon, quel est le code des fonctions ApplyForceAndTorqueEvent et SetMeshTransformEvent ?


Force et sagesse...

Hors ligne


#5 

15-11-2009 16:29:50

nico
Administrateurs
Avatar de nico
Date d'inscription:
Messages: 563
IP: 82.232.128.163
Courriel

A oui c'est vrai, j'avais pas pensé qui y avait newton dans N3XTD, je vais voir ça dessuite wink

Aussinon pour les fonctions de callback, c'est celles des tuto que j'ai essayé de mettre à jour pour que ce soit compatible avec la version 2.10.

Code c++ :

void _cdecl Objet::SetMeshTransformEvent(const NewtonBody* body, const float* matrix,int)
{
	// copy the matrix into an irrlicht matrix4
	matrix4 mat;
	memcpy(mat.pointer(), matrix, sizeof(float)*16);

	// Retreive the user data attached to the newton body
	ISceneNode *tmp = (ISceneNode *)NewtonBodyGetUserData(body);
	if (tmp)
	{
		// Position the node
		tmp->setPosition(mat.getTranslation());		// set position
		tmp->setRotation(mat.getRotationDegrees());	// and rotation
	}
}

void _cdecl Objet::ApplyForceAndTorqueEvent (const NewtonBody* body,float timestep, int threadindex)
{
   float mass;
   float Ixx;
   float Iyy;
   float Izz;
   float force[3];
   float torque[3];

   NewtonBodyGetMassMatrix (body, &mass, &Ixx, &Iyy, &Izz);

   force[0] = 0.0f;
   force[1] = NEWTON_GRAVITY * mass;
   force[2] = 0.0f;

   torque[0] = 0.0f;
   torque[1] = 0.0f;
   torque[2] = 0.0f;

   NewtonBodyAddForce (body, force);
   NewtonBodyAddTorque (body, torque);
}


Hors ligne


#6 

19-11-2009 13:31:10

nico
Administrateurs
Avatar de nico
Date d'inscription:
Messages: 563
IP: 82.232.128.163
Courriel

Salut tmyke, malheureusement, je n'arrive toujours pas a faire de collisons avec 2 cubes mobiles, par contre si je met la mass du cube du dessous à 0, alors il y a collision yikes
Donc je n'y comprend plus rien sad


Hors ligne


#7 

16-01-2010 11:50:58

nico
Administrateurs
Avatar de nico
Date d'inscription:
Messages: 563
IP: 82.232.128.163
Courriel

depuis je suis passé sur bullet, mais je me rend compte que l'erreur venait du fait que je n'avais pas déclaré de sol wink


Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
167 invités en ligne
membre en ligne: -
RSS Feed