#1 

01-03-2013 01:10:25

jonath313
Membres
Date d'inscription:
Messages: 240
IP: 31.37.221.53
Courriel

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 :)
{
    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


#2 

01-03-2013 15:20:49

jonath313
Membres
Date d'inscription:
Messages: 240
IP: 31.37.221.53
Courriel

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


#3 

02-03-2013 09:50:36

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.216.13
Courriel

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


#4 

02-03-2013 23:02:33

jonath313
Membres
Date d'inscription:
Messages: 240
IP: 31.37.221.53
Courriel

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