Historique des modifications - Message

Message #10660

Sujet: Test de gravité - Irrlicht + Newton


TypeDateAuteurContenu
Dernière modification12-08-2012 23:15:12Kaze
OK. J'en profite pour poser une autre chose : J'ai un peu modifié mon code pour avoir trois cubes, un avec une masse nulle, un avec une masse = 100.0 et un autre avec une masse = 200.0. Comme on peux si attendre, le cube à masse nul reste immobile, pourtant les deux autres cubes tombent à la même vitesse alors que j'ai paramétrer la gravité pour qu'elle dépende du poids. Je vous donne donc mon code :

main.hpp

Code c++ :


#ifndef MAIN_HPP
#define MAIN_HPP

#include <irr/Irrlicht.h>
#include <iostream>
#include "newton.h"

void SetMeshTransformEvent(const NewtonBody* body, const float* matrix);
void ApplyForceAndTorqueEvent(const NewtonBody* body);

void drawScene();
void initScene();

#endif


main.cpp

Code c++ :


#include "main.hpp"

irr::IrrlichtDevice *device = 0;
irr::video::IVideoDriver *driver = 0;
irr::scene::ISceneManager *sceneManager = 0;

static NewtonWorld* world;

static NewtonBody* body;
static NewtonBody* bodyB;
static NewtonBody* bodyC;
irr::scene::ISceneNode *cubeNode = 0;

irr::scene::ISceneNode *cam = 0;
unsigned int lasttick;

void initScene()
{
    device = irr::createDevice(irr::video::EDT_OPENGL, irr::core::dimension2d<irr::u32>(640,480), false);
    driver = device->getVideoDriver();
    sceneManager = device->getSceneManager();
    sceneManager->addSkyBoxSceneNode(driver->getTexture("data/irrlicht2_up.bmp"),driver->getTexture("data/irrlicht2_dn.bmp"),driver->getTexture("data/irrlicht2_rt.bmp"),driver->getTexture("data/irrlicht2_lf.bmp"),driver->getTexture("data/irrlicht2_ft.bmp"),driver->getTexture("data/irrlicht2_bk.bmp"));

    world = NewtonCreate (NULL, NULL);
    
    // Création d'un cube soumis à la gravité.
    
    irr::scene::IMesh* cubeMesh = sceneManager->getMesh("data/smallcube.3ds");
    cubeNode = sceneManager->addMeshSceneNode(cubeMesh);
    cubeNode->setMaterialTexture(0, driver->getTexture("data/crate.jpg"));
    cubeNode->setMaterialFlag(irr::video::EMF_LIGHTING, false);

    NewtonCollision *collision;
    collision = NewtonCreateBox(world, 0, 0, 0, NULL);
    body = NewtonCreateBody (world, collision);
    NewtonReleaseCollision (world, collision);   
    
    NewtonBodySetUserData(body,reinterpret_cast<void*>(cubeNode));
   
    // Calcul de l'inertie de l'objet.
    float masse = 100.0;
    irr::core::vector3df inertie;
    irr::core::vector3df taille = irr::core::vector3df(10,10,10);
    inertie.X = (masse/12)*(pow(taille.Y,2)+pow(taille.Z,2));
    inertie.Y = (masse/12)*(pow(taille.X,2)+pow(taille.Z,2));
    inertie.Z = (masse/12)*(pow(taille.X,2)+pow(taille.Y,2));
    NewtonBodySetMassMatrix (body, masse, inertie.X, inertie.Y, inertie.Z);
    
    // Méthode permettant la modification de l'objet en fonction des forces.
    NewtonBodySetTransformCallback(body, SetMeshTransformEvent);
	NewtonBodySetForceAndTorqueCallback(body, ApplyForceAndTorqueEvent);
    
    irr::core::matrix4 mat;
    mat.setTranslation(irr::core::vector3df(0.0,0.0,50.0));
    NewtonBodySetMatrix(body, mat.pointer());
    
    // Fin de création.
    
    // Création d'un cube soumis à la gravité.
    
    irr::scene::IMesh* cubeMeshB = sceneManager->getMesh("data/smallcube.3ds");
    cubeNode = sceneManager->addMeshSceneNode(cubeMeshB);
    cubeNode->setMaterialTexture(0, driver->getTexture("data/crate.jpg"));
    cubeNode->setMaterialFlag(irr::video::EMF_LIGHTING, false);

    NewtonCollision *collisionB;
    collisionB = NewtonCreateBox(world, 0, 0, 0, NULL);
    bodyB = NewtonCreateBody (world, collisionB);
    NewtonReleaseCollision (world, collisionB);   
    
    NewtonBodySetUserData(bodyB,reinterpret_cast<void*>(cubeNode));
   
    // Calcul de l'inertie de l'objet.
    float masseB = 200.0;
    irr::core::vector3df inertieB;
    irr::core::vector3df tailleB = irr::core::vector3df(10,10,10);
    inertieB.X = (masseB/12)*(pow(tailleB.Y,2)+pow(tailleB.Z,2));
    inertieB.Y = (masseB/12)*(pow(tailleB.X,2)+pow(tailleB.Z,2));
    inertieB.Z = (masseB/12)*(pow(tailleB.X,2)+pow(tailleB.Y,2));
    NewtonBodySetMassMatrix (bodyB, masseB, inertieB.X, inertieB.Y, inertieB.Z);
    
    // Méthode permettant la modification de l'objet en fonction des forces.
    NewtonBodySetTransformCallback(bodyB, SetMeshTransformEvent);
	NewtonBodySetForceAndTorqueCallback(bodyB, ApplyForceAndTorqueEvent);
    
    irr::core::matrix4 matB;
    matB.setTranslation(irr::core::vector3df(0.0,0.0,-50.0));
    NewtonBodySetMatrix(bodyB, matB.pointer());
    
    // Fin de création.
    
    // Création d'un cube non soumis à la gravité.
    
    irr::scene::IMesh* cubeMeshC = sceneManager->getMesh("data/smallcube.3ds");
    cubeNode = sceneManager->addMeshSceneNode(cubeMeshC);
    cubeNode->setMaterialTexture(0, driver->getTexture("data/crate.jpg"));
    cubeNode->setMaterialFlag(irr::video::EMF_LIGHTING, false);

    NewtonCollision *collisionC;
    collisionC = NewtonCreateBox(world, 0, 0, 0, NULL);
    bodyC = NewtonCreateBody (world, collisionC);
    NewtonReleaseCollision (world, collisionC);   
    
    NewtonBodySetUserData(bodyC,reinterpret_cast<void*>(cubeNode));
   
    // Calcul de l'inertie de l'objet.
    float masseC = 0.0;
    irr::core::vector3df inertieC;
    irr::core::vector3df tailleC = irr::core::vector3df(10,10,10);
    inertieC.X = (masseC/12)*(pow(tailleC.Y,2)+pow(tailleC.Z,2));
    inertieC.Y = (masseC/12)*(pow(tailleC.X,2)+pow(tailleC.Z,2));
    inertieC.Z = (masseC/12)*(pow(tailleC.X,2)+pow(tailleC.Y,2));
    NewtonBodySetMassMatrix (bodyC, masseC, inertieC.X, inertieC.Y, inertieC.Z);
    
    // Méthode permettant la modification de l'objet en fonction des forces.
    NewtonBodySetTransformCallback(bodyC, SetMeshTransformEvent);
	NewtonBodySetForceAndTorqueCallback(bodyC, ApplyForceAndTorqueEvent);
    
    irr::core::matrix4 matC;
    matC.setTranslation(irr::core::vector3df(0.0,0.0,0.0));
    NewtonBodySetMatrix(bodyC, matC.pointer());
    
    // Fin de création.
    
    
    // Caméra
    irr::scene::ICameraSceneNode* cam = sceneManager->addCameraSceneNode();
    cam->setPosition(irr::core::vector3df(200,100,0));
    cam->setTarget(irr::core::vector3df(0,0,0));
}

// -----------------------------------------------------------------------------
// --------------------------------- CALLBACK ----------------------------------
// -----------------------------------------------------------------------------

void SetMeshTransformEvent(const NewtonBody* body, const float* matrix)
{
	irr::core::matrix4 mat;
	memcpy(mat.pointer(), matrix, sizeof(float)*16);

	irr::scene::ISceneNode *cubeNode = (irr::scene::ISceneNode *)NewtonBodyGetUserData(body);
	if (cubeNode)
	{
		cubeNode->setPosition(mat.getTranslation());
		cubeNode->setRotation(mat.getRotationDegrees());
	}
}

void ApplyForceAndTorqueEvent(const NewtonBody* body)
{ 
    float masse; 
    float inertieX; 
    float inertieY; 
    float inertieZ; 
    float force[3]; 
    float torque[3]; 
    
    NewtonBodyGetMassMatrix (body, &masse, &inertieX, &inertieY, &inertieZ); 
    
    force[0] = 0.0f; 
    force[1] = -9.81 * masse; 
    force[2] = 0.0f; 
    
    torque[0] = 0.0f; 
    torque[1] = 0.0f; 
    torque[2] = 0.0f; 
    
    NewtonBodyAddForce(body, force); 
    NewtonBodyAddTorque(body, torque); 
}

// -----------------------------------------------------------------------------
// ------------------------------- END OF CALLBACK -----------------------------
// -----------------------------------------------------------------------------

void drawScene(){
   
    if (device->getTimer()->getTime() > lasttick + 10)
    {   
    lasttick = device->getTimer()->getTime();
    NewtonUpdate(world, 0.01f);
    }
}

int main()
{
   initScene();
   
   while(device->run())
   {
      drawScene();
      driver->beginScene(true, true, irr::video::SColor(255,255,255,255));
      sceneManager->drawAll();
      driver->endScene();
   }
   
   NewtonDestroy(world);
   device->drop();
   return 0;
}


Je ne comprend pas pourquoi ça ne fonctionne pas. Pourriez vous m'aider pendant que je cherche de mon coté.
Création du message12-08-2012 23:14:21Kaze
OK. J'en profite pour poser une autre chose : J'ai un peu modifié mon code pour avoir trois cubes, un avec une masse nulle, un avec une masse = 100.0 et un autre avec une masse = 200.0. Comme on peux si attendre, le cube à masse nul reste immobile, pourtant les deux autres cubes tombent à la même vitesse alors que j'ai paramétrer la gravité pour qu'elle dépende du poids. Je vous donne donc mon code :

main.hpp

Code c++ :


#ifndef MAIN_HPP
#define MAIN_HPP

#include <irr/Irrlicht.h>
#include <iostream>
#include "newton.h"

void SetMeshTransformEvent(const NewtonBody* body, const float* matrix);
void ApplyForceAndTorqueEvent(const NewtonBody* body);

void drawScene();
void initScene();

#endif


main.cpp

Code c++ :


#include "main.hpp"

irr::IrrlichtDevice *device = 0;
irr::video::IVideoDriver *driver = 0;
irr::scene::ISceneManager *sceneManager = 0;

static NewtonWorld* world;

static NewtonBody* body;
static NewtonBody* bodyB;
static NewtonBody* bodyC;
irr::scene::ISceneNode *cubeNode = 0;

irr::scene::ISceneNode *cam = 0;
unsigned int lasttick;

void initScene()
{
    device = irr::createDevice(irr::video::EDT_OPENGL, irr::core::dimension2d<irr::u32>(640,480), false);
    driver = device->getVideoDriver();
    sceneManager = device->getSceneManager();
    sceneManager->addSkyBoxSceneNode(driver->getTexture("data/irrlicht2_up.bmp"),driver->getTexture("data/irrlicht2_dn.bmp"),driver->getTexture("data/irrlicht2_rt.bmp"),driver->getTexture("data/irrlicht2_lf.bmp"),driver->getTexture("data/irrlicht2_ft.bmp"),driver->getTexture("data/irrlicht2_bk.bmp"));

    world = NewtonCreate (NULL, NULL);
    
    // Création d'un cube soumis à la gravité.
    
    irr::scene::IMesh* cubeMesh = sceneManager->getMesh("data/smallcube.3ds");
    cubeNode = sceneManager->addMeshSceneNode(cubeMesh);
    cubeNode->setMaterialTexture(0, driver->getTexture("data/crate.jpg"));
    cubeNode->setMaterialFlag(irr::video::EMF_LIGHTING, false);

    NewtonCollision *collision;
    collision = NewtonCreateBox(world, 0, 0, 0, NULL);
    body = NewtonCreateBody (world, collision);
    NewtonReleaseCollision (world, collision);   
    
    NewtonBodySetUserData(body,reinterpret_cast<void*>(cubeNode));
   
    // Calcul de l'inertie de l'objet.
    float masse = 100.0;
    irr::core::vector3df inertie;
    irr::core::vector3df taille = irr::core::vector3df(10,10,10);
    inertie.X = (masse/12)*(pow(taille.Y,2)+pow(taille.Z,2));
    inertie.Y = (masse/12)*(pow(taille.X,2)+pow(taille.Z,2));
    inertie.Z = (masse/12)*(pow(taille.X,2)+pow(taille.Y,2));
    NewtonBodySetMassMatrix (body, masse, inertie.X, inertie.Y, inertie.Z);
    
    // Méthode permettant la modification de l'objet en fonction des forces.
    NewtonBodySetTransformCallback(body, SetMeshTransformEvent);
	NewtonBodySetForceAndTorqueCallback(body, ApplyForceAndTorqueEvent);
    
    irr::core::matrix4 mat;
    mat.setTranslation(irr::core::vector3df(0.0,0.0,50.0));
    NewtonBodySetMatrix(body, mat.pointer());
    
    // Fin de création.
    
    // Création d'un cube soumis à la gravité.
    
    irr::scene::IMesh* cubeMeshB = sceneManager->getMesh("data/smallcube.3ds");
    cubeNode = sceneManager->addMeshSceneNode(cubeMeshB);
    cubeNode->setMaterialTexture(0, driver->getTexture("data/crate.jpg"));
    cubeNode->setMaterialFlag(irr::video::EMF_LIGHTING, false);

    NewtonCollision *collisionB;
    collisionB = NewtonCreateBox(world, 0, 0, 0, NULL);
    bodyB = NewtonCreateBody (world, collisionB);
    NewtonReleaseCollision (world, collisionB);   
    
    NewtonBodySetUserData(bodyB,reinterpret_cast<void*>(cubeNode));
   
    // Calcul de l'inertie de l'objet.
    float masseB = 200.0;
    irr::core::vector3df inertieB;
    irr::core::vector3df tailleB = irr::core::vector3df(10,10,10);
    inertieB.X = (masseB/12)*(pow(tailleB.Y,2)+pow(tailleB.Z,2));
    inertieB.Y = (masseB/12)*(pow(tailleB.X,2)+pow(tailleB.Z,2));
    inertieB.Z = (masseB/12)*(pow(tailleB.X,2)+pow(tailleB.Y,2));
    NewtonBodySetMassMatrix (bodyB, masseB, inertieB.X, inertieB.Y, inertieB.Z);
    
    // Méthode permettant la modification de l'objet en fonction des forces.
    NewtonBodySetTransformCallback(bodyB, SetMeshTransformEvent);
	NewtonBodySetForceAndTorqueCallback(bodyB, ApplyForceAndTorqueEvent);
    
    irr::core::matrix4 matB;
    matB.setTranslation(irr::core::vector3df(0.0,0.0,-50.0));
    NewtonBodySetMatrix(bodyB, matB.pointer());
    
    // Fin de création.
    
    // Création d'un cube non soumis à la gravité.
    
    irr::scene::IMesh* cubeMeshC = sceneManager->getMesh("data/smallcube.3ds");
    cubeNode = sceneManager->addMeshSceneNode(cubeMeshC);
    cubeNode->setMaterialTexture(0, driver->getTexture("data/crate.jpg"));
    cubeNode->setMaterialFlag(irr::video::EMF_LIGHTING, false);

    NewtonCollision *collisionC;
    collisionC = NewtonCreateBox(world, 0, 0, 0, NULL);
    bodyC = NewtonCreateBody (world, collisionC);
    NewtonReleaseCollision (world, collisionC);   
    
    NewtonBodySetUserData(bodyC,reinterpret_cast<void*>(cubeNode));
   
    // Calcul de l'inertie de l'objet.
    float masseC = 0.0;
    irr::core::vector3df inertieC;
    irr::core::vector3df tailleC = irr::core::vector3df(10,10,10);
    inertieC.X = (masseC/12)*(pow(tailleC.Y,2)+pow(tailleC.Z,2));
    inertieC.Y = (masseC/12)*(pow(tailleC.X,2)+pow(tailleC.Z,2));
    inertieC.Z = (masseC/12)*(pow(tailleC.X,2)+pow(tailleC.Y,2));
    NewtonBodySetMassMatrix (bodyC, masseC, inertieC.X, inertieC.Y, inertieC.Z);
    
    // Méthode permettant la modification de l'objet en fonction des forces.
    NewtonBodySetTransformCallback(bodyC, SetMeshTransformEvent);
	NewtonBodySetForceAndTorqueCallback(bodyC, ApplyForceAndTorqueEvent);
    
    irr::core::matrix4 matC;
    matC.setTranslation(irr::core::vector3df(0.0,0.0,0.0));
    NewtonBodySetMatrix(bodyC, matC.pointer());
    
    // Fin de création.
    
    
    // Caméra
    irr::scene::ICameraSceneNode* cam = sceneManager->addCameraSceneNode();
    cam->setPosition(irr::core::vector3df(200,100,0));
    cam->setTarget(irr::core::vector3df(0,0,0));
}

// -----------------------------------------------------------------------------
// --------------------------------- CALLBACK ----------------------------------
// -----------------------------------------------------------------------------

void SetMeshTransformEvent(const NewtonBody* body, const float* matrix)
{
	irr::core::matrix4 mat;
	memcpy(mat.pointer(), matrix, sizeof(float)*16);

	irr::scene::ISceneNode *cubeNode = (irr::scene::ISceneNode *)NewtonBodyGetUserData(body);
	if (cubeNode)
	{
		cubeNode->setPosition(mat.getTranslation());
		cubeNode->setRotation(mat.getRotationDegrees());
	}
}

void ApplyForceAndTorqueEvent(const NewtonBody* body)
{ 
    float masse; 
    float inertieX; 
    float inertieY; 
    float inertieZ; 
    float force[3]; 
    float torque[3]; 
    
    NewtonBodyGetMassMatrix (body, &masse, &inertieX, &inertieY, &inertieZ); 
    
    force[0] = 0.0f; 
    force[1] = -9.81 * masse; 
    force[2] = 0.0f; 
    
    torque[0] = 0.0f; 
    torque[1] = 0.0f; 
    torque[2] = 0.0f; 
    
    NewtonBodyAddForce(body, force); 
    NewtonBodyAddTorque(body, torque); 
}

// -----------------------------------------------------------------------------
// ------------------------------- END OF CALLBACK -----------------------------
// -----------------------------------------------------------------------------

void drawScene(){
   
    if (device->getTimer()->getTime() > lasttick + 10)
    {   
    lasttick = device->getTimer()->getTime();
    NewtonUpdate(world, 0.01f);
    }
}

int main()
{
   initScene();
   
   while(device->run())
   {
      drawScene();
      driver->beginScene(true, true, irr::video::SColor(255,255,255,255));
      sceneManager->drawAll();
      driver->endScene();
   }
   
   NewtonDestroy(world);
   device->drop();
   return 0;
}


Je ne comprend pas pourquoi ça ne fonctionne pas. Pourriez vous m'aider pendant que je cherche de mon coté.

Retour

OptionsLiens officielsCaractéristiquesStatistiquesCommunauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1441 sujets
11339 messages
Dernier membre inscrit: Saidov17
91 invités en ligne
membre en ligne: -
RSS Feed