Historique des modifications - Message

Message #7798

Sujet: Gérer la gravité d'un véhicule et pas de la caméra


Type Date Auteur Contenu
Création du message 23-01-2010 22:11:54 jonath313
Voila mon probleme, j'utilise la detection de colision d'irrlicht, cela fonction très bien mais que avec la caméra d'où le :

irr::scene::ICameraSceneNode *camera = sceneManager->addCameraSceneNodeFPS (0, 100.0f, 0.9f,ID_IsNotPickable, keyMap, 5,true, 4.f); // La caméra

Sauf que moi je voudrais que ce soit un véhicule qui subisse la gravité et je ne vois pas comment faire cela car ma caméra est fixer derrière le véhicule.

Je vous file le code :

#include <IRR/irrlicht.h>

using namespace irr;
using namespace std;

////////////////////////////////////////////////////////////////////////////////
////////////////////ENUMERATION POUR LES COLISIONS//////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#endif

enum
{
// Je utiliser ce ID ISceneNode d'indiquer un noeud de scène qui est
// Pas cueille par getSceneNodeAndCollisionPointFromRay ()
ID_IsNotPickable = 0,

// Je utiliser cet indicateur dans ISceneNode identifiants pour indiquer que le
// Node scène peut être ramassé par la sélection ray.
IDFlag_IsPickable = 1 << 0,

// J utiliser cet indicateur dans ISceneNode identifiants pour indiquer que le
// Node scène peut être mis en évidence. Dans cet exemple, le
// Homonids peut être mis en évidence, mais le niveau de maillage ne peut pas.
IDFlag_IsHighlightable = 1 << 1
};



int main(void)
{

irr::IrrlichtDevice* device = irr::createDevice(irr::video::EDT_OPENGL,
irr::core::dimension2d<irr::u32>(640,480),32,false,false,false);
irr::video::IVideoDriver* driver = device->getVideoDriver ();
irr::scene::ISceneManager *sceneManager = device->getSceneManager ();

device->getCursorControl ()-> setVisible (false); // curseur invisible

irr::scene::IAnimatedMesh* modele = sceneManager->getMesh("azert.md2"); // chargement du camion
irr::scene::IAnimatedMeshSceneNode* Nmodele = sceneManager->addAnimatedMeshSceneNode(modele); // creation du noeud

Nmodele->setPosition(irr::core::vector3df(4000.0,1000.0,-1000.0)) ;
Nmodele->setRotation(irr::core::vector3df(0.0,90.0,0.0)) ;
Nmodele->setMaterialFlag(irr::video::EMF_LIGHTING, false);
Nmodele->setMaterialTexture(0,driver->getTexture("fer2.bmp") );
Nmodele->setFrameLoop(1,20);
Nmodele->setScale (irr::core::vector3df(5.4f, 5.4f, 5.4f));

//irr::scene::ICameraSceneNode *camera = sceneManager->addCameraSceneNodeFPS ( 0,100.0f,3.0f);
// camera->setRotation (irr::core::vector3df(0,90 ,0 ));

////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////LA CAMERA/////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

irr::SKeyMap keyMap[5];
keyMap[0].Action = irr::EKA_MOVE_FORWARD;
keyMap[0].KeyCode = irr::KEY_KEY_Z;
keyMap[1].Action = irr::EKA_MOVE_BACKWARD;
keyMap[1].KeyCode = irr::KEY_KEY_S;
keyMap[2].Action = irr::EKA_STRAFE_LEFT;
keyMap[2].KeyCode = irr::KEY_KEY_Q;
keyMap[3].Action = irr::EKA_STRAFE_RIGHT;
keyMap[3].KeyCode = irr::KEY_KEY_D;
keyMap[4].Action = irr::EKA_JUMP_UP;
keyMap[4].KeyCode = irr::KEY_SPACE;

irr::scene::ICameraSceneNode *camera = sceneManager->addCameraSceneNodeFPS (0, 100.0f, 0.9f,ID_IsNotPickable, keyMap, 5,true, 4.f); // La caméra
camera->setPosition(irr::core::vector3df(-3000.0, 210.0, -50.0)); // positionnement
camera->setFarValue(camera->getFarValue() + 20000.0f);
camera->setNearValue(0.03f);
camera->setTarget(irr::core::vector3df(-7.132532f, -0.294052f, -5.266525f));

//Nmodele->setParent(camera);
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////LA LUMIERE///////////////////////////////////
////////////////////////////////////////////////////////////////////////////////


scene::ILightSceneNode * light = sceneManager->addLightSceneNode(0, core::vector3df(-60,100,400),video::SColorf(1.0f,1.0f,1.0f,1.0f), 600.0f);

light->setID(ID_IsNotPickable); // Make it an invalid target for selection.

// Remember which scene node is highlighted
scene::ISceneNode* highlightedSceneNode = 0;
scene::ISceneCollisionManager* collMan = sceneManager->getSceneCollisionManager();
int lastFPS = -1;


////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////LES OBJETS 3D//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

//LA MAP
scene::IAnimatedMesh* circuit = sceneManager->getMesh("circuit2.3ds");
scene::IMeshSceneNode* Ncircuit = 0;
// Le maillage Quake est cueille, mais ne soit pas mis en évidence.
if (circuit)
Ncircuit = sceneManager->addOctTreeSceneNode(circuit->getMesh(0), 0, IDFlag_IsPickable);
Ncircuit->setScale(irr::core::vector3df(25.3f, 25.3f, 25.3f));
Ncircuit->setMaterialTexture(0,driver->getTexture("IRRLICHT.bmp") );
Ncircuit->setMaterialFlag(irr::video::EMF_LIGHTING, false);


////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////LES COLLISIONS//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

scene::ITriangleSelector* selector = 0;

if (circuit)
{
Ncircuit->setPosition(core::vector3df(0,-2000,0));

selector = sceneManager->createOctTreeTriangleSelector(Ncircuit->getMesh(), Ncircuit, 128);

Ncircuit->setTriangleSelector(selector);
// We're not done with this selector yet, so don't drop it.
}


if (selector)
{
scene::ISceneNodeAnimator* anim = sceneManager->createCollisionResponseAnimator( selector, camera, core::vector3df(30,260,30),core::vector3df(0,-10,0), core::vector3df(0,30,0));

selector->drop(); // As soon as we're done with the selector, drop it.
camera->addAnimator(anim);
anim->drop(); // And likewise, drop the animator when we're done referring to it.
}

//Ajout de la petite étoile
// Add the billboard.
scene::IBillboardSceneNode * bill = sceneManager->addBillboardSceneNode();
bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR );
bill->setMaterialTexture(0, driver->getTexture("texture/particle.bmp"));
bill->setMaterialFlag(video::EMF_LIGHTING, false);
bill->setMaterialFlag(video::EMF_ZBUFFER, false);
bill->setSize(core::dimension2d<f32>(20.0f, 20.0f));
bill->setID(ID_IsNotPickable); // This ensures that we don't accidentally ray-pick it

while (device->run()) // la boucle de rendu
{
driver->beginScene(true,true,
irr::video::SColor(0,200,200,200));
sceneManager->drawAll ();
driver->endScene ();
}

device->drop ();
return 0;
}



Quelqu'un peut m'aider svp? merci d'avance

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