Historique des modifications - Message

Message #10653

Sujet: Test de gravité - Irrlicht + Newton


Type Date Auteur Contenu
Création du message 11-08-2012 23:16:19 Kaze
Comme je l'ai dit dans mon précédant message, j'ai récupérer les callbacks d'un autre programme pour essayer. Voici mon nouveau code :

main.hpp :

Code c++ :


#ifndef MAIN_HPP
#define MAIN_HPP

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

//callback Newton
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"

static NewtonWorld* world;
static NewtonBody* body;

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

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);

    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));
   
    float masse = 100.0;
    
    irr::scene::ICameraSceneNode* cam = sceneManager->addCameraSceneNode();
    cam->setPosition(irr::core::vector3df(200,100,0));
    cam->setTarget(irr::core::vector3df(0,0,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);
    
    
    NewtonBodySetTransformCallback(body, SetMeshTransformEvent);
	NewtonBodySetForceAndTorqueCallback(body, ApplyForceAndTorqueEvent);
    
    
    irr::core::matrix4 mat;
    mat.setTranslation(irr::core::vector3df(0.0,0.0,0.0));
    NewtonBodySetMatrix(body, mat.pointer());
}

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

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

	irr::scene::ISceneNode *tmp = (irr::scene::ISceneNode *)NewtonBodyGetUserData(body);
	if (tmp)
	{
		tmp->setPosition(mat.getTranslation());
		tmp->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] = -6.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);
    }
   
    irr::core::matrix4 mat;
    cubeNode->setPosition(mat.getTranslation());
    cubeNode->setRotation(mat.getRotationDegrees());
}

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;
}

Mais mon cube reste encore et toujours immobile, et je n'ai pas bien compris le fonctionnement de ces callbacks (même si ça va mieux qu'avant).

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