Historique des modifications - Message

Message #11355

Sujet: Action de la gravité + action d'un autre force = BUG


Type Date Auteur Contenu
Dernière modification 02-08-2013 18:01:36 Kaze
Bonjour,

mon problème est le suivant : j'ai un mesh soumis à la gravité. Et pour le faire se déplacer je applique à ce mesh une force dirigée suivant x. Dans ce cas on a la gravité (suivant -y) et la force (suivant x). Je place mon modèle à une certaine distance du sol pour pouvoir observer l'influence des deux forces. Mais mon problème est là car quelque soit la manière dont j'applique la force, il ne considère que celle là. Au final j'ai un mesh qui flotte en l'air et se déplace dans la direction de la force. Voila je vais vous montrer mon code sinon ça ne sert à rien (si vous voulez voir plus de choses, il suffit de demander) :

Main.cpp :

Code c++ :

#include "main.hpp"

int main(void)
{
    irr::IrrlichtDevice *device = irr::createDevice(irr::video::EDT_OPENGL, irr::core::dimension2d<irr::u32>(1024,768), 32,false,true,false,0);
    irr::video::IVideoDriver* driver = device->getVideoDriver();
    irr::scene::ISceneManager *sceneManager = device->getSceneManager();
         
    device->getCursorControl()->setVisible(false);
    device->setWindowCaption(L"Personnage");
    
    Physics newton(device, driver, sceneManager);
    newton.Sol();
    
    Personnage Akku(device, driver, sceneManager, newton.getNewtonWorld());
    Akku.Shape(irr::core::vector3df(0,10,0), 0, false);
    Akku.Move();
    
    while (device->run ())
    {
        newton.Update();
        Akku.Loop();
        
        driver->beginScene (true, true, irr::video::SColor (255,100,100,255));
        sceneManager->drawAll ();
        driver->endScene ();
    }
 
    device->drop ();
    return 0;
}


personnage.cpp :

Code c++ :

#include "personnage.hpp"

// VARIABLE STATIQUE -----------------------------------------------------------

NewtonWorld* Personnage::persoWorld = NULL;
NewtonBody* Personnage::persoBody = NULL;

irr::core::vector3df Personnage::persoPosition = irr::core::vector3df(0,0,0);

// CONSTRUCTEUR ----------------------------------------------------------------

Personnage::Personnage(irr::IrrlichtDevice *device, irr::video::IVideoDriver *driver, irr::scene::ISceneManager *sceneManager, NewtonWorld *newtonWorld){
    persoDevice = device;
    persoDriver = driver;
    persoSceneManager = sceneManager;
    persoCamera = persoSceneManager->addCameraSceneNode();
    
    persoWorld = newtonWorld;
}

// DESTRUCTEUR -----------------------------------------------------------------

Personnage::~Personnage(){
}

// FONCTIONS -------------------------------------------------------------------

void Personnage::Camera(irr::core::vector3df position){
    irr::core::vector3df cameraPosition = position;
    cameraPosition.X += 10;
    cameraPosition.Y += 5;
    
    persoCamera->setPosition(cameraPosition);
    persoCamera->setTarget(position);
}

void Personnage::Loop(){
    Camera(persoPosition);
    
    float force[3];
    NewtonBodyGetForce(persoBody, force);
    std::cout << "Force appliquee : X = " << force[0] << "; Y = " << force[1] << "; Z = " << force[2] << ";" << std::endl;
}

void Personnage::Move(){
    NewtonBodySetForceAndTorqueCallback(persoBody, ApplyForceX);
    /*
    float force[3];
    force[0] = 0.0f;
    force[1] = 1000.0f;
    force[2] = 0.0f;
    NewtonBodyAddForce(persoBody, force);
    */
}

void Personnage::Shape(irr::core::vector3df position, int type, bool pnj = true){
    
    float masse = 80.0;
    
    irr::scene::IAnimatedMesh* mesh;
    
    switch(type){
        case 0: // Akku
             mesh = persoSceneManager->getMesh("ressources/Akku.md2");
             persoNode = persoSceneManager->addAnimatedMeshSceneNode(mesh);
             persoNode->setMaterialTexture(0, persoDriver->getTexture("ressources/Akku.png"));
             break;
             
        case 4: // Kyle
             mesh = persoSceneManager->getMesh("ressources/Kyle.md2");
             persoNode = persoSceneManager->addAnimatedMeshSceneNode(mesh);
             persoNode->setMaterialTexture(0, persoDriver->getTexture("ressources/Kyle.png"));
             break;
             
    }
    
    persoNode->setMaterialFlag(irr::video::EMF_LIGHTING, false);
    persoNode->setAnimationSpeed(0);
    persoNode->setLoopMode(false);
    
    irr::core::aabbox3d<irr::f32> volume;
    volume = persoNode->getBoundingBox();
    irr::core::vector3df mini = volume.MinEdge;
    irr::core::vector3df maxi = volume.MaxEdge;
    irr::core::vector3df taille = maxi-mini;
    
    position.Y = position.Y + taille.Y/2;
    
    NewtonCollision* collision;
    irr::core::matrix4 mat;
    collision = NewtonCreateBox(persoWorld, taille.X, taille.Y, taille.Z, 0, NULL);
    persoBody = NewtonCreateBody(persoWorld, collision, mat.pointer());
    NewtonReleaseCollision(persoWorld, collision);
    NewtonBodySetUserData(persoBody,reinterpret_cast<void*>(persoNode));
    
    irr::core::vector3df inertie;
    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 (persoBody, masse, inertie.X, inertie.Y, inertie.Z);
    
    NewtonBodySetTransformCallback(persoBody, SetMeshTransformEvent);
    NewtonBodySetForceAndTorqueCallback(persoBody, ApplyForceAndTorqueEvent);
    
    mat.setTranslation(position);
    NewtonBodySetMatrix(persoBody, mat.pointer());
    
    if(pnj == false){
        persoPosition = position;
        Camera(persoPosition);
    }
}

// CALLBACKS -------------------------------------------------------------------

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

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

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

void Personnage::ApplyForceX(const NewtonBody* persoBody, float, int)
{
    float masse;
    float inertieX;
    float inertieY;
    float inertieZ;
    float force[3];
    
    NewtonBodyGetMassMatrix (persoBody, &masse, &inertieX, &inertieY, &inertieZ);
    
    force[0] = -100.0f;
    force[1] = 0.0f;
    force[2] = 0.0f;
    
    NewtonBodyAddForce(persoBody, force);
}


Cela fait quelques semaines que je tourne en rond, soit c'est la gravité qui est appliquée seule, soit la force dirigée vers x et je n'arrive pas à les assembler. Si vous pouviez m'expliquer pourquoi j'ai ce problème, merci d'avance.

PS : Dans le code qui apparait, les "case" du "switch" sont faux alors que dans le code ils sont justes donc je les recopie juste pour que le code soit plus clair (il y a bien sur des "" autour des adresses des fichiers mais ils sont mal pris en compte dans la balise code=cpp) :

Code c++ :

case 0: // Akku
mesh = persoSceneManager->getMesh(ressources/Akku.md2);
persoNode = persoSceneManager->addAnimatedMeshSceneNode(mesh);
persoNode->setMaterialTexture(0, persoDriver->getTexture(ressources/Akku.png));
break;

case 4: // Kyle
mesh = persoSceneManager->getMesh(ressources/Kyle.md2);
persoNode = persoSceneManager->addAnimatedMeshSceneNode(mesh);
persoNode->setMaterialTexture(0, persoDriver->getTexture(ressources/Kyle.png));
break;
Création du message 02-08-2013 14:29:02 Kaze
Bonjour,

mon problème est le suivant : j'ai un mesh soumis à la gravité. Et pour le faire se déplacer je applique à ce mesh une force dirigée suivant x. Dans ce cas on a la gravité (suivant -y) et la force (suivant x). Je place mon modèle à une certaine distance du sol pour pouvoir observer l'influence des deux forces. Mais mon problème est là car quelque soit la manière dont j'applique la force, il ne considère que celle là. Au final j'ai un mesh qui flotte en l'air et se déplace dans la direction de la force. Voila je vais vous montrer mon code sinon ça ne sert à rien (si vous voulez voir plus de choses, il suffit de demander) :

Main.cpp :

Code c++ :

#include "main.hpp"

int main(void)
{
    irr::IrrlichtDevice *device = irr::createDevice(irr::video::EDT_OPENGL, irr::core::dimension2d<irr::u32>(1024,768), 32,false,true,false,0);
    irr::video::IVideoDriver* driver = device->getVideoDriver();
    irr::scene::ISceneManager *sceneManager = device->getSceneManager();
         
    device->getCursorControl()->setVisible(false);
    device->setWindowCaption(L"Personnage");
    
    Physics newton(device, driver, sceneManager);
    newton.Sol();
    
    Personnage Akku(device, driver, sceneManager, newton.getNewtonWorld());
    Akku.Shape(irr::core::vector3df(0,10,0), 0, false);
    Akku.Move();
    
    while (device->run ())
    {
        newton.Update();
        Akku.Loop();
        
        driver->beginScene (true, true, irr::video::SColor (255,100,100,255));
        sceneManager->drawAll ();
        driver->endScene ();
    }
 
    device->drop ();
    return 0;
}


personnage.cpp :

Code c++ :

#include "personnage.hpp"

// VARIABLE STATIQUE -----------------------------------------------------------

NewtonWorld* Personnage::persoWorld = NULL;
NewtonBody* Personnage::persoBody = NULL;

irr::core::vector3df Personnage::persoPosition = irr::core::vector3df(0,0,0);

// CONSTRUCTEUR ----------------------------------------------------------------

Personnage::Personnage(irr::IrrlichtDevice *device, irr::video::IVideoDriver *driver, irr::scene::ISceneManager *sceneManager, NewtonWorld *newtonWorld){
    persoDevice = device;
    persoDriver = driver;
    persoSceneManager = sceneManager;
    persoCamera = persoSceneManager->addCameraSceneNode();
    
    persoWorld = newtonWorld;
}

// DESTRUCTEUR -----------------------------------------------------------------

Personnage::~Personnage(){
}

// FONCTIONS -------------------------------------------------------------------

void Personnage::Camera(irr::core::vector3df position){
    irr::core::vector3df cameraPosition = position;
    cameraPosition.X += 10;
    cameraPosition.Y += 5;
    
    persoCamera->setPosition(cameraPosition);
    persoCamera->setTarget(position);
}

void Personnage::Loop(){
    Camera(persoPosition);
    
    float force[3];
    NewtonBodyGetForce(persoBody, force);
    std::cout << "Force appliquee : X = " << force[0] << "; Y = " << force[1] << "; Z = " << force[2] << ";" << std::endl;
}

void Personnage::Move(){
    NewtonBodySetForceAndTorqueCallback(persoBody, ApplyForceX);
    /*
    float force[3];
    force[0] = 0.0f;
    force[1] = 1000.0f;
    force[2] = 0.0f;
    NewtonBodyAddForce(persoBody, force);
    */
}

void Personnage::Shape(irr::core::vector3df position, int type, bool pnj = true){
    
    float masse = 80.0;
    
    irr::scene::IAnimatedMesh* mesh;
    
    switch(type){
        case 0: // Akku
             mesh = persoSceneManager->getMesh("ressources/Akku.md2");
             persoNode = persoSceneManager->addAnimatedMeshSceneNode(mesh);
             persoNode->setMaterialTexture(0, persoDriver->getTexture("ressources/Akku.png"));
             break;
             
        case 4: // Kyle
             mesh = persoSceneManager->getMesh("ressources/Kyle.md2");
             persoNode = persoSceneManager->addAnimatedMeshSceneNode(mesh);
             persoNode->setMaterialTexture(0, persoDriver->getTexture("ressources/Kyle.png"));
             break;
             
    }
    
    persoNode->setMaterialFlag(irr::video::EMF_LIGHTING, false);
    persoNode->setAnimationSpeed(0);
    persoNode->setLoopMode(false);
    
    irr::core::aabbox3d<irr::f32> volume;
    volume = persoNode->getBoundingBox();
    irr::core::vector3df mini = volume.MinEdge;
    irr::core::vector3df maxi = volume.MaxEdge;
    irr::core::vector3df taille = maxi-mini;
    
    position.Y = position.Y + taille.Y/2;
    
    NewtonCollision* collision;
    irr::core::matrix4 mat;
    collision = NewtonCreateBox(persoWorld, taille.X, taille.Y, taille.Z, 0, NULL);
    persoBody = NewtonCreateBody(persoWorld, collision, mat.pointer());
    NewtonReleaseCollision(persoWorld, collision);
    NewtonBodySetUserData(persoBody,reinterpret_cast<void*>(persoNode));
    
    irr::core::vector3df inertie;
    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 (persoBody, masse, inertie.X, inertie.Y, inertie.Z);
    
    NewtonBodySetTransformCallback(persoBody, SetMeshTransformEvent);
    NewtonBodySetForceAndTorqueCallback(persoBody, ApplyForceAndTorqueEvent);
    
    mat.setTranslation(position);
    NewtonBodySetMatrix(persoBody, mat.pointer());
    
    if(pnj == false){
        persoPosition = position;
        Camera(persoPosition);
    }
}

// CALLBACKS -------------------------------------------------------------------

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

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

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

void Personnage::ApplyForceX(const NewtonBody* persoBody, float, int)
{
    float masse;
    float inertieX;
    float inertieY;
    float inertieZ;
    float force[3];
    
    NewtonBodyGetMassMatrix (persoBody, &masse, &inertieX, &inertieY, &inertieZ);
    
    force[0] = -100.0f;
    force[1] = 0.0f;
    force[2] = 0.0f;
    
    NewtonBodyAddForce(persoBody, force);
}


Cela fait quelques semaines que je tourne en rond, soit c'est la gravité qui est appliquée seule, soit la force dirigée vers x et je n'arrive pas à les assembler. Si vous pouviez m'expliquer pourquoi j'ai ce problème, merci d'avance.

PS : Dans le code qui apparait, les "case" du "switch" sont faux alors que dans le code ils sont justes donc je les recopie juste pour que le code soit plus clair (il y a bien sur des "" autour des adresses des fichiers mais ils sont mal pris en compte dans la balise code=cpp) :

Code c++ :

case 0: // Akku
mesh = persoSceneManager->getMesh(ressources/Akku.md2);
persoNode = persoSceneManager->addAnimatedMeshSceneNode(mesh);
persoNode->setMaterialTexture(0, persoDriver->getTexture(ressources/Akku.png));
break;

case 4: // Kyle
mesh = persoSceneManager->getMesh(ressources/Kyle.md2);
persoNode = persoSceneManager->addAnimatedMeshSceneNode(mesh);
persoNode->setMaterialTexture(0, persoDriver->getTexture(ressources/Kyle.png));
break;

Retour

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
194 invités en ligne
membre en ligne: -
RSS Feed