#0 

01-03-2013 02:10:25

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

Bonjour,

Je suis entrain de créer ma propre caméra à la troisième personne, mais quelques points me donnent du fil à retordre.
Mon programme contient trois fichier : main, CLEventReceiver.h et cpp,

J'essai d'intégrer ma caméra dans le fichier CLEventReceiver.cpp, mais je n'arrive pas à faire tourner celle-ci autour de mon perso. Après de nombreuses tentatives, je viens sollicité l'aide de la communauté d'irrlicht !

J'ai regardé les autres postes relatifs à ce sujet, mais n'étant pas programmeur pro j'ai du mal à associé les exemples et mon code.

Enfait, ma caméra va bien à droite et à gauche, mais arrivé à un certain point elle continue de façon linéaire et par conséquent ne fait pas le tour de mon perso.

Le second point est que la caméra ne suit pas le perso. Je ne veux pas la parenter car sinon elle sera bloqué de tout mouvement.

Merci d'avance pour vos commentaires !



Class CLEventReceiver.cpp :

Code c++ :


CLEventReceiver::CLEventReceiver(irr::scene::IAnimatedMeshSceneNode* Nperso, irr::scene::ICameraSceneNode* camera3,core::vector3df playerLastPosition)//revoilà notre constructeur smile
{
    m_camGauche = false;
    m_camDroite = false;
    m_PivoCamGauche = false;
    m_PivoCamDroite = false;
}

bool CLEventReceiver::OnEvent(const irr::SEvent &event)//En cas d'évenement :
{
    if(m_Ncamera3 != 0  && event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.Key == irr::KEY_LEFT)
    {
        if(event.KeyInput.PressedDown == true)
        m_camGauche = true;
        else
        m_camGauche = false;
        return true;
    }

    if(m_Ncamera3 != 0  && event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.Key == irr::KEY_RIGHT)
    {
        if(event.KeyInput.PressedDown == true)
        m_camDroite = true;
        else
        m_camDroite = false;
        return true;
    }

    return false;
}


void CLEventReceiver::majPosMesh()//revoilà notre chère fonction de mise à jour de la position
{

core::vector3df a =m_Ncamera3->getPosition();
core::vector3df b= m_Ncamera3->getRotation();

float diry = ((d.Y+12)*3.1415926535897)/180;
float diryCam = ((b.Y+12)*3.1415926535897)/180;

int speed=1;

        if(m_Ncamera3 != 0 && m_camGauche == true){
         m_PivoCamGauche = true;

                    a.X +=  speed * sin(a.Y * PI/180.0f);
                    a.Y -=  speed * - cos(a.Y * PI/180.0f);
                    b.Y += 0.3;
        }
        else m_camGauche = false;

         if(m_Ncamera3 != 0 && m_camDroite == true){
         m_PivoCamDroite = true;
                    a.X -=  speed * sin(a.Y *  PI/180.0f);
                    a.Y +=  speed * - cos(a.Y *  PI/180.0f);
                    b.Y += 0.3;
        }
        m_Nperso->setPosition(c);
        m_Nperso->setRotation(d);
        m_Ncamera3->setPosition(a);
        m_Ncamera3->setRotation(b);
}



Et voici le main :

Code c++ :



....

    /* PERSO*/
    irr::scene::IAnimatedMesh* perso;
    perso = (irr::scene::IAnimatedMesh*)sceneManager->getMesh("model/testbox5.X");
    irr::scene::IAnimatedMeshSceneNode* Nperso = sceneManager->addAnimatedMeshSceneNode(perso);
    Nperso->setMaterialTexture(0, driver->getTexture("images/peau.bmp"));
    Nperso->setMaterialFlag(irr::video::EMF_LIGHTING, true);
    Nperso->setPosition(irr::core::vector3df(0.0,5000.0,0.0)) ;


    /* Cube*/ Le cube est au même endroit que le perso pour parenter la caméra au cube mais ce ne doit pas être bon ...

    irr::scene::IAnimatedMesh* cube;
    cube = (irr::scene::IAnimatedMesh*)sceneManager->getMesh("model/cube.X");
    irr::scene::IAnimatedMeshSceneNode* Ncube = sceneManager->addAnimatedMeshSceneNode(cube);
    Nperso->setMaterialTexture(0, driver->getTexture("images/peau.bmp"));

    Ncube->setRotation(irr::core::vector3df(-90.0,0.0,0.0)) ;


//////////////////////////////CAMERA////////////////////////////////////////////////////////////////////////////////////

    irr::scene::ICameraSceneNode *camera3 = sceneManager->addCameraSceneNode();
    camera3->setParent(Ncube);

//////////////////////////////RECEPTEUR EVENNEMENTS//////////////////////////////////////////////////////////////

    CLEventReceiver receiver(Nperso, camera3, playerLastPosition);//On créé un objet instance de la classe CEventReceiver : c'est notre capteur d'évènements
    device->setEventReceiver(&receiver);//on définit cet objet comme le capteur pour notre device
...


//////////////////////////////RENDU////////////////////////////////////////////////////////////////////////////////////

  while (device->run()) {
    driver->beginScene(true, true, irr::video::SColor(0,255,255,255));

    receiver.majPosMesh();
    receiver.majAnimMesh();

    sceneManager->drawAll ();
    driver->endScene ();


            //==============================================================//
            //=== Actualisation de la camera                             ===//
            //==============================================================//
            camera3->setTarget(Nperso->getPosition());
            //camera3->setPosition(vector3df(-60,50,0));

  }
  device->drop ();
  return 0;
}

Hors ligne


#1 

01-03-2013 16:20:49

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

Bon je vais surement me répondre tout seul, mais j'ai réussi à faire tourner ma caméra autour de mon perso en 3D je me suis inspiré de cela :

http://irrlicht.sourceforge.net/forum/viewtopic.php?t=36240

Donc il me reste plus qu'à ce que la caméra suive le personnage ... Si quelqu'un a une idée...

Merci.

Hors ligne


#2 

02-03-2013 10:50:36

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Pour créer ta camera le mieux serait d'utiliser un IAnimatorSceneNode que tu attaches à une camera. La camera doit être enfant de ton personnage pour le positionnement relatif.
Dans ton animator de camera tu gères la rotation, le upvector et la position de la camera.
Pour la rotation: il te suffit d'utiliser la méthode rotateByXZ() de vector3d sur le vecteur former par "position_cam - position_joueur".
Pour le positionnement: puisque ta camera est l'enfant de ton personnage tu as juste à faire un setPosition() et ta camera sera positionnée par rapport à ton perso.

Pour mieux comprendre comment utiliser une camera perso, va voir le code source de ICameraSceneNodeFPS. C'est ce que j'avais fait pour comprendre comment gérer la camera et le code est assez simple.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#3 

03-03-2013 00:02:33

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

Oui merci de t'as réponse du coups je me suis lancé sur un système qui fonctionne pas trop mal en m'inspirant du lien que j'ai mis juste au dessus. Ma caméra suis le perso et elle est totalement libre (niveau rotation) par rapport à celui-ci . Ouf enfin !

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
881 membres
1426 sujets
11116 messages
Dernier membre inscrit: Bidule
16 invités en ligne
Aucun membre connecté
RSS Feed