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
Hors ligne
Tu dois attribuer l'animator que tu as mis à ta caméra à ton node en remplaçant camera par Nmodele dans ce code
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. }
Tu auras surement à modifier des paramètres dans createCollisionResponseAnimator.
Dernière modification par Zorian (24-01-2010 12:31:33)
Hors ligne
Merci cela fonctionne j'ai fait la modification cependant mon véhicule ne touche pas le sol il est en l'air par rapport au sol
Tu pense que cela peut venir de coi ?
Hors ligne
C'est bon le probleme est résolut :
if (selector)
{
scene::ISceneNodeAnimator* anim = sceneManager->createCollisionResponseAnimator( selector, Ncamion, core::vector3df(30,10,30),core::vector3df(0,-10,0), core::vector3df(0,30,0));
selector->drop();
Ncamion->addAnimator(anim);
anim->drop();
}
Je poste la réponse que cela soit utile qd même !
Merci de ton aide !
Hors ligne
Je voudrais faire une caméra à la troisiéme personne mais ne peut pas faire de rotation avec celle-ci je peut juste la positionner et cela m'ennui, peut être que je ne devrais pas utiliser de caméra fps ? Je vois pas comment faire là sérieu
Hors ligne
Commence par une caméra toute simple en tant que node fils de ta voiture et fais un setTarget sur la position de ta voiture.
Je suis pas sûr du résultat mais c'est ce que j'aurais fait.
Hors ligne
et bien ses simple soit tu passe par un code tout fait ... :-°
http://irrlicht-fr.org/viewtopic.php?id=742
http://irrlicht-fr.org/viewtopic.php?id=416
ou alors tu te fait ton truc ...
le plus simple et certainemant le mieux n'est pas de mettre la camera en parent mais tu te fait une petit fonction pour calculer la position x,z de la camera par rapport a celui du node
en utilisant cos, sin, tan ... :-°
du coup tu peut géré la distance, la hauteur et l'angle de vue ... la ou tu est limité avec un setParent ... ses se que j'ai fait ...
Hors ligne
Je suis pas un as de la programmation alors je vais étudier ce qui à déja était fait merci pour vôtre aide ! Je pense que j'aurais besoin de quelques autres conseils car tout cela s'éclaircit lentement dans ma tête.
Hors ligne
J'ai créé une caméra toute simple mais le probleme c'est que quand mon vehicule tourne la camera elle ne tourne pa c'est le vehicule qui tourne sur un orbite de la camera :
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////LA CAMERA/////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
irr::scene::ICameraSceneNode *camera = sceneManager->addCameraSceneNode();// creation de la camera
camera->setFarValue(camera->getFarValue() + 20000.0f);
camera->setParent(Ncamion);
camera->setTarget(irr::core::vector3df(0.0f, 0.0f, 50000.0f));
camera->setPosition(irr::core::vector3df(200.0, 100.0,30.0)); // positionnement
Je dois faire comment pour corriger cette erreur ?
Hors ligne