Historique des modifications - Message

Message #11179

Sujet: Petite caméra 3ème personne simple à intégrer


Type Date Auteur Contenu
Création du message 09-04-2013 19:27:59 jonath313
Voici ma caméra 3éme personne :

CLEventReceiver .h
#include <irr/irrlicht.h>
#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace irr;
using namespace core;
using namespace gui;
using namespace video;
using namespace scene;

class CLEventReceiver : public irr::IEventReceiver//On créé une classe CEventReceiver , fille de la classe IEventReceiver
{
public ://dans la partie publique , on va mettre les prototypes de nos fonctions

    CLEventReceiver(irr::scene::IAnimatedMeshSceneNode* Nperso,
                    irr::scene::ICameraSceneNode* camera3);//On créé le constructeur , qui prend en parametre le node de notre modele(ici , Sydney , donc)

    virtual bool OnEvent(const irr::SEvent &event);//Cette fonction est lancée en cas d'évenement

    void majPosMesh();//On met à jour la position de notre mesh
    void majAnimMesh();//On met à jour l'animation du mesh , si besoin est

    void CameraTourneHorizontal(scene::ISceneNode *node, const core::vector3df &origin, const core::vector3df &angle);
    void CameraTourneVerticale(scene::ISceneNode *node, const core::vector3df &origin, const core::vector3df &angle);


private ://dans la partie privée , on met nos attributs

    irr::scene::IAnimatedMeshSceneNode* m_Nperso;//Le node que l'on va manipuler
    irr::scene::ICameraSceneNode* m_Ncamera3;//Le node que l'on va manipuler

    bool m_camGauche;
    bool m_camDroite;
    bool m_camHaut;
    bool m_camBas;
    bool m_PivoCamHorizontal;
    bool m_PivoCamVerticale;

};

CLEventReceiver .cpp
#include "CLEventReceiver.h"
#include <cstdlib>
#include <windows.h>
#include <iostream>


using namespace std;

CLEventReceiver::CLEventReceiver(irr::scene::IAnimatedMeshSceneNode* Nperso,
                                 irr::scene::ICameraSceneNode* camera3)//revoilà notre constructeur :)
{
    m_Nperso = Nperso;//On pointe le mesh passe en parametre.
    m_Ncamera3 = camera3;

    m_animrun = true;//et comme l'animation n'est du coup pas "courir" , on met notre booléen à false aussi


    m_isAvance = false;//Par défaut , le modele est immobile .Donc le booléen qui indique si l'on bouge est à false
    m_isRecule = false;
    m_isDroite = false;
    m_isGauche = false;
    m_isSauterAvant = false;
    m_isSauterArriere = false;
    m_isPivoterDroite = false;
    m_isPivoterGauche = false;

    m_camGauche = false;
    m_camDroite = false;
    m_camHaut   = false;
    m_camBas    = false;
    m_PivoCamHorizontal = false;
    m_PivoCamVerticale  = false;

    m_isCourrir = false;
    m_isMarcher = 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;
    }
    if(m_Ncamera3 != 0  && event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.Key == irr::KEY_UP)
    {
        if(event.KeyInput.PressedDown == true)
        m_camHaut = true;
        else
        m_camHaut = false;
        return true;
    }
    if(m_Ncamera3 != 0  && event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.Key == irr::KEY_DOWN)
    {
        if(event.KeyInput.PressedDown == true)
        m_camBas = true;
        else
        m_camBas = false;
        return true;
    }
    return false;
}



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


    if(m_Ncamera3 != 0 && m_camGauche == true){ //Rotation a gauche de la caméra
         m_PivoCamHorizontal = true;
         CLEventReceiver::CameraTourneHorizontal(m_Ncamera3, m_Nperso->getPosition()+250, core::vector3df(0,0.2*speedCamera,0)); // Fonction pour tourner la caméra 
        }
        if(m_Ncamera3 != 0 && m_camGauche == false){
         m_PivoCamHorizontal = false;
         CLEventReceiver::CameraTourneHorizontal(m_Ncamera3, m_Nperso->getPosition()+250, core::vector3df(0,0,0)); // On coupe la rotation de la caméra
        }
    if(m_Ncamera3 != 0 && m_camDroite == true){ //Rotation a droite de la caméra
         m_PivoCamHorizontal = true;
         CLEventReceiver::CameraTourneHorizontal(m_Ncamera3, m_Nperso->getPosition()+250, core::vector3df(0,-0.2*speedCamera,0));
        }
        if(m_Ncamera3 != 0 && m_camDroite == false){
         m_PivoCamHorizontal = false;
         CLEventReceiver::CameraTourneHorizontal(m_Ncamera3, m_Nperso->getPosition()+250, core::vector3df(0,0,0)); // On coupe la rotation de la caméra
        }
    if(m_Ncamera3 != 0 && m_camHaut == true){ //Rotation a droite de la caméra
         m_PivoCamVerticale = true;
         CLEventReceiver::CameraTourneVerticale(m_Ncamera3, m_Nperso->getPosition()+250, core::vector3df(-0.05*speedCamera,0,0));
        }
        if(m_Ncamera3 != 0 && m_camHaut == false){
         m_PivoCamVerticale = false;
         CLEventReceiver::CameraTourneVerticale(m_Ncamera3, m_Nperso->getPosition()+250, core::vector3df(0,0,0)); // On coupe la rotation de la caméra
        }
    if(m_Ncamera3 != 0 && m_camBas == true){ //Rotation a droite de la caméra
         m_PivoCamVerticale = true;
         CLEventReceiver::CameraTourneVerticale(m_Ncamera3, m_Nperso->getPosition()+250, core::vector3df(0.05*speedCamera,0,0));
        }
        if(m_Ncamera3 != 0 && m_camBas == false){
         m_PivoCamVerticale = false;
         CLEventReceiver::CameraTourneVerticale(m_Ncamera3, m_Nperso->getPosition()+250, core::vector3df(0,0,0)); // On coupe la rotation de la caméra
        }
}



void CLEventReceiver::majAnimMesh()//Ici , on met à jour l'animation
{
 ...
}


core::vector3df Rotation;

void CLEventReceiver::CameraTourneHorizontal(scene::ISceneNode *node, const core::vector3df &origin,
   const core::vector3df &angle)
{
   core::vector3df pos = node->getPosition() - origin; //position courante du node par rapport à l'origine
   Rotation += angle;                                   //Nouvelle rotation du node
   f32 distance = pos.getLength();                      // position were node is when unrotated
   core::vector3df newPos(0,0,distance);                 // this assumes Z axis points "forward"
   core::matrix4 m;                                        // now rotate position vector with new rotation // to find out new position of node
   m.setRotationDegrees(Rotation);
   m.rotateVect(newPos);
   newPos += origin;                                     // get it absolute
   node->setPosition(newPos);                           // position node
}

// this one allows rotation around all 3 axes, but rotation will be relative

void CLEventReceiver::CameraTourneVerticale(scene::ISceneNode *node, const core::vector3df &origin,
   const core::vector3df &angle)
{
        core::vector3df pos = node->getPosition() - origin; //position courante du node par rapport à l'origine
        Rotation += angle;                                  //Nouvelle rotation du node
        f32 distance = pos.getLength();                      // position were node is when unrotated
        core::vector3df newPos(0,0,distance);                 // this assumes Z axis points "forward"
        core::matrix4 m;                                        // now rotate position vector with new rotation // to find out new position of node
        m.setRotationDegrees(Rotation);
        m.rotateVect(newPos);
        newPos += origin;                                     // get it absolute
        node->setPosition(newPos);                           // position node
        //cout << "angle: " << pos.Y <<endl;
}

main.cpp
#include <iostream>
#include <cstdlib>
#include <irr/irrlicht.h>
#include "CLEventReceiver.h"

using namespace irr;
using namespace std;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

////////////////////CREATION DE LA FENETRE//////////////////////////////

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

int main(void) {

    /* PERSO*/
    irr::scene::IAnimatedMesh* perso;//Ici ...
    perso = (irr::scene::IAnimatedMesh*)sceneManager->getMesh("model/perso22.b3d");  /*testbox5.X*/ //ennemi12.b3d ennemi15.b3d
    irr::scene::IAnimatedMeshSceneNode* Nperso = sceneManager->addAnimatedMeshSceneNode(perso);
    Nperso->setMaterialTexture(0, driver->getTexture("images/skin6.jpg"));
    Nperso->setMaterialFlag(irr::video::EMF_LIGHTING, true);
    Nperso->setPosition(irr::core::vector3df(0.0,500.0,0.0)) ;
//////////////////////////////CAMERA////////////////////////////////////////////////////////////////////////////////////

    irr::scene::ICameraSceneNode *camera3 = sceneManager->addCameraSceneNode();
    camera3->setFarValue(camera3->getFarValue() + 40000.0f);
    camera3->setNearValue(0.3f); //0.03f
//////////////////////////////RECEPTEUR EVENNEMENTS/////////////////////////////

    CLEventReceiver receiver(Nperso,
                             camera3);//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();//a chaque frame , on appelle la fonction qui met à jour la position du Mesh
    receiver.majAnimMesh();//a chaque frame , on appelle la fonction qui , si besoin est  , modifie l'animation du mesh

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

           camera3->setTarget(Nperso->getPosition());       //Actualisation de la camera
           camera3->setPosition(vector3df(Nperso->getPosition().X-500, Nperso->getPosition().Y, Nperso->getPosition().Z - 500));

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

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