#0 

23-01-2010 23:11:54

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

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


#1 

24-01-2010 12:29:12

Zorian
Correcteur
Date d'inscription: 12-05-2009
Messages: 19
Corrections: 181

Tu dois attribuer l'animator que tu as mis à ta caméra à ton node en remplaçant camera par Nmodele dans ce code

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)


Real Programmers Don't Document - If it was hard to write, it should be hard to understand.

Hors ligne


#2 

24-01-2010 13:27:33

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

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


#3 

24-01-2010 13:30:04

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

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


#4 

24-01-2010 13:40:42

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

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


#5 

24-01-2010 14:49:09

Zorian
Correcteur
Date d'inscription: 12-05-2009
Messages: 19
Corrections: 181

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.


Real Programmers Don't Document - If it was hard to write, it should be hard to understand.

Hors ligne


#6 

24-01-2010 17:21:10

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

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 ... smile
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


#7 

25-01-2010 00:21:39

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

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


#8 

25-01-2010 21:16:05

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

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


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
279 invités en ligne
Aucun membre connecté
RSS Feed