Historique des modifications - Message

Message #8937

Sujet: Faire avancer un mesh selon sa rotation Y et Z


Type Date Auteur Contenu
Dernière modification 27-10-2010 21:56:58 nabouill
Réponse un peu tardive mais je n'ai pas eu beaucoup de temps ces temps si.
Donc je me suis permis d'y intégrer un petite fonction supplémentaire pour alléger un peut le code au niveau des déplacements.
Aussi je n'est pas tout réécrit, mais seulement ce qui nous intéresse.

Code c++ :

#include <irrlicht.h>
#include "CShieldManager.h"
#include "Following_Camera.h"
#include "CEventManager.h"

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

// VARIABLE GLOBAL QUI TROUVERAIS BIEN MIEUX LEURS PLACES DANS UNE CLASS
f32 vitesse_avance = 100;
f32 vitesse_monte = 50;
f32 vitesse_tourne = 10;
f32 angle_rot = 30;
f32 frameDeltaTime; //le temps ecouler entre chaque frame


/// ////////////////////////////////////////////////
///                     LA FONCTIONS BOUGER
/// ////////////////////////////////////////////////
//une fonction qui sert a deplacer un objet dans un axe suivant sa rotation
//PS: remerciment a TUpac qui me la fait decouvrir
void bouger(irr::scene::ISceneNode *node, vector3df unite)
{
    matrix4 m;
    m.setRotationDegrees(node->getRotation());
    m.transformVect(unite);
    node->setPosition(node->getPosition() + unite);
    node->updateAbsolutePosition();
}

/// ////////////////////////////////////////////////
///                     LA FONCTIONS event_manager
/// ////////////////////////////////////////////////
void event_manager(MyEventReceiver *receiver, IAnimatedMeshSceneNode *battle_turtle1, ISceneNode* inode)
{


    if(receiver->IsKeyDown(KEY_KEY_Z)) //on avance
    {
        //on fait avancer inode tout droit
        f32 unit = vitesse_avance*frameDeltaTime;
        bouger(inode, vector3df(0.0,0.0,unit));
    }
    if(receiver->IsKeyDown(KEY_KEY_Q))//on tourne en a gauche
    {
        //on fait tourner inode sur l'axe Y
        vector3df rota(0.0,vitesse_tourne*frameDeltaTime,0.0);
        inode->setRotation(inode->getRotation() - rota);
        //on verifie la rotation de battle_turtle1
        //pour lui faire une rotation si il ne la fait pas deja
        if(battle_turtle1->getRotation().Z < 1)
        {
            battle_turtle1->setRotation(vector3df(battle_turtle1->getRotation().X,//on garde la rotation en X
                                                  0.0,
                                                  angle_rot));
        }


    }
    if(receiver->IsKeyDown(KEY_KEY_D))//on tourne en a droite
    {
        //on fait tourner inode sur l'axe Y
        vector3df rota(0.0,vitesse_tourne*frameDeltaTime,0.0);
        inode->setRotation(inode->getRotation() + rota);

        //on verifie la rotation de battle_turtle1
        //pour lui faire une rotation si il ne la fait pas deja
        if(battle_turtle1->getRotation().Z > -1)
        {
            battle_turtle1->setRotation(vector3df(battle_turtle1->getRotation().X,//on garde la rotation en X
                                                  0.0,
                                                  0.0 - angle_rot));
        }
    }
    if(receiver->IsKeyDown(KEY_KEY_A))//on monte
    {
        //on fait monter inode
        f32 unit = vitesse_monte*frameDeltaTime;
        bouger(inode, vector3df(0.0,unit,0.0));
        //on verifie la rotation de battle_turtle1
        //pour lui faire une rotation si il ne la fait pas deja
        if(battle_turtle1->getRotation().X > -1)
        {
            battle_turtle1->setRotation(vector3df(0.0 - angle_rot,
                                                  0.0,
                                                  battle_turtle1->getRotation().Z));//on garde la rotation en Z
        }
    }
    if(receiver->IsKeyDown(KEY_KEY_E))//on descend
    {
        //on fait descendre inode
        f32 unit = vitesse_monte*frameDeltaTime;
        bouger(inode, vector3df(0.0, 0.0-unit,0.0));
        //on verifie la rotation de battle_turtle1
        //pour lui faire une rotation si il ne la fait pas deja
        if(battle_turtle1->getRotation().X < 1)
        {
            battle_turtle1->setRotation(vector3df(angle_rot,
                                                  0.0,
                                                  battle_turtle1->getRotation().Z));//on garde la rotation en Z
        }
    }
    if(!receiver->IsKeyDown(KEY_KEY_E) && !receiver->IsKeyDown(KEY_KEY_A))
    { //si on n'appuis ni sur A ou E on remet le vaisseau droit sur l'axe X
            battle_turtle1->setRotation(vector3df(0.0,
                                                                   0.0,
                                                                   battle_turtle1->getRotation().Z));//on garde la rotation en Z
    }
    if(!receiver->IsKeyDown(KEY_KEY_Q) && !receiver->IsKeyDown(KEY_KEY_D))
    { //si on n'appuis ni sur Q ou D on remet le vaisseau droit sur l'axe X
            battle_turtle1->setRotation(vector3df(battle_turtle1->getRotation().X,//on garde la rotation en X
                                                                   0.0,
                                                                   0.0));
    }

}

/// ////////////////////////////////////////////////
///                     LA FONCTIONS MAIN
/// ////////////////////////////////////////////////
int main(void)
{

    IrrlichtDevice* device = irr::createDevice(EDT_OPENGL,dimension2d<irr::u32>(1024,768),32,false,false,true);
    IVideoDriver* driver = device->getVideoDriver ();
    ISceneManager *sceneManager = device->getSceneManager ();
    MyEventReceiver receiver;
    device->setEventReceiver(&receiver);


    // on creer un noeud de scene vierge
    ISceneNode* inode = sceneManager->addEmptySceneNode();
    // on creer un noeud de scene au quel on charge me vaisseaux en mesh
    //on le met fils de inode
    scene::IAnimatedMeshSceneNode *battle_turtle1 = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/dedale.b3d"), inode);
    //la camera qui va suivre inode
    FollowingCamera* MaCamera = new FollowingCamera(inode, sceneManager,false, 50000,selector1,-3,0.5f,0,vector3df(7,2,0));   // Position initiale.


    u32 tempsPasser = device->getTimer()->getTime();
    u32 tempsAcutel = device->getTimer()->getTime();

    while (device->run())
    {
        //recuperation du temps passer depuis la derniere frame
        tempsAcutel = device->getTimer()->getTime();
        frameDeltaTime = (f32)(tempsAcutel - tempsPasser) / 1000.f; // Time in seconds
        tempsPasser = tempsAcutel;

        event_manager(&receiver,battle_turtle1,inode);

        driver->beginScene(true,true,SColor(0,200,200,200));
        MaCamera->Update();
        sceneManager->drawAll ();
        driver->endScene ();
    }

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


Je n'ai pas put tester, il faudra bien-sur ajuster un peut tout ça (vitesse de rotation, vitesse déplacement...) il est aussi possible qu'il y est des erreur dans les sens de rotation, a voir.
En espérant que sa t'aide un peu.

@+
Création du message 27-10-2010 21:52:42 nabouill
Réponse un peu tardive mais je n'ai pas eu beaucoup de temps ces temps si.
Donc je me suis permis d'y intégrer un petite fonction supplémentaire pour alléger un peut le code au niveau des déplacements.
Aussi je n'est pas tout réécrit, mais seulement ce qui nous intéresse.

Code c++ :

#include <irrlicht.h>
#include "CShieldManager.h"
#include "Following_Camera.h"
#include "CEventManager.h"

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

// VARIABLE GLOBAL QUI TROUVERAIS BIEN MIEUX LEURS PLACES DANS UNE CLASS
f32 vitesse_avance = 100;
f32 vitesse_monte = 50;
f32 vitesse_tourne = 10;
f32 angle_rot = 30;
f32 frameDeltaTime; //le temps ecouler entre chaque frame


/// ////////////////////////////////////////////////
///                     LA FONCTIONS BOUGER
/// ////////////////////////////////////////////////
//une fonction qui sert a deplacer un objet dans un axe suivant sa rotation
//PS: remerciment a TUpac qui me la fait decouvrir
void bouger(irr::scene::ISceneNode *node, vector3df unite)
{
    matrix4 m;
    m.setRotationDegrees(node->getRotation());
    m.transformVect(unite);
    node->setPosition(node->getPosition() + unite);
    node->updateAbsolutePosition();
}

/// ////////////////////////////////////////////////
///                     LA FONCTIONS event_manager
/// ////////////////////////////////////////////////
void event_manager(MyEventReceiver *receiver, IAnimatedMeshSceneNode *battle_turtle1, ISceneNode* inode)
{


    if(receiver->IsKeyDown(KEY_KEY_Z)) //on avance
    {
        //on fait avancer inode tout droit
        f32 unit = vitesse_avance*frameDeltaTime;
        bouger(inode, vector3df(0.0,0.0,unit));
    }
    if(receiver->IsKeyDown(KEY_KEY_Q))//on tourne en a gauche
    {
        //on fait tourner inode sur l'axe Y
        vector3df rota(0.0,vitesse_tourne*frameDeltaTime,0.0);
        inode->setRotation(inode->getRotation() - rota);
        //on verifie la rotation de battle_turtle1
        //pour lui faire une rotation si il ne la fait pas deja
        if(battle_turtle1->getRotation().Z < 1)
        {
            battle_turtle1->setRotation(vector3df(battle_turtle1->getRotation().X,//on garde la rotation en X
                                                  0.0,
                                                  angle_rot));
        }


    }
    if(receiver->IsKeyDown(KEY_KEY_D))//on tourne en a droite
    {
        //on fait tourner inode sur l'axe Y
        vector3df rota(0.0,vitesse_tourne*frameDeltaTime,0.0);
        inode->setRotation(inode->getRotation() + rota);

        //on verifie la rotation de battle_turtle1
        //pour lui faire une rotation si il ne la fait pas deja
        if(battle_turtle1->getRotation().Z > -1)
        {
            battle_turtle1->setRotation(vector3df(battle_turtle1->getRotation().X,//on garde la rotation en X
                                                  0.0,
                                                  0.0 - angle_rot));
        }
    }
    if(receiver->IsKeyDown(KEY_KEY_A))//on monte
    {
        //on fait monter inode
        f32 unit = vitesse_monte*frameDeltaTime;
        bouger(inode, vector3df(0.0,unit,0.0));
        //on verifie la rotation de battle_turtle1
        //pour lui faire une rotation si il ne la fait pas deja
        if(battle_turtle1->getRotation().X > -1)
        {
            battle_turtle1->setRotation(vector3df(0.0 - angle_rot,
                                                  0.0,
                                                  battle_turtle1->getRotation().Z));//on garde la rotation en Z
        }
    }
    if(receiver->IsKeyDown(KEY_KEY_E))//on descend
    {
        //on fait descendre inode
        f32 unit = vitesse_monte*frameDeltaTime;
        bouger(inode, vector3df(0.0, 0.0-unit,0.0));
        //on verifie la rotation de battle_turtle1
        //pour lui faire une rotation si il ne la fait pas deja
        if(battle_turtle1->getRotation().X < 1)
        {
            battle_turtle1->setRotation(vector3df(angle_rot,
                                                  0.0,
                                                  battle_turtle1->getRotation().Z));//on garde la rotation en Z
        }
    }
    if(!receiver->IsKeyDown(KEY_KEY_E) && !receiver->IsKeyDown(KEY_KEY_A))
    { //si on n'appuis ni sur A ou E on remet le vaisseau droit sur l'axe X
            battle_turtle1->setRotation(vector3df(0.0,
                                                                   0.0,
                                                                   battle_turtle1->getRotation().Z));//on garde la rotation en Z
    }
    if(!receiver->IsKeyDown(KEY_KEY_Q) && !receiver->IsKeyDown(KEY_KEY_D))
    { //si on n'appuis ni sur Q ou D on remet le vaisseau droit sur l'axe X
            battle_turtle1->setRotation(vector3df(battle_turtle1->getRotation().X,//on garde la rotation en X
                                                                   0.0,
                                                                   0.0));
    }

}

/// ////////////////////////////////////////////////
///                     LA FONCTIONS MAIN
/// ////////////////////////////////////////////////
int main(void)
{

    IrrlichtDevice* device = irr::createDevice(EDT_OPENGL,dimension2d<irr::u32>(1024,768),32,false,false,true);
    IVideoDriver* driver = device->getVideoDriver ();
    ISceneManager *sceneManager = device->getSceneManager ();
    MyEventReceiver receiver;
    device->setEventReceiver(&receiver);


    // on creer un noeud de scene vierge
    ISceneNode* inode = sceneManager->addEmptySceneNode();
    // on creer un noeud de scene au quel on charge me vaisseaux en mesh
    //on le met fils de inode
    scene::IAnimatedMeshSceneNode *battle_turtle1 = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/dedale.b3d"), inode);
    //la camera qui va suivre inode
    FollowingCamera* MaCamera = new FollowingCamera(inode, sceneManager,false, 50000,selector1,-3,0.5f,0,vector3df(7,2,0));   // Position initiale.


    u32 tempsPasser = device->getTimer()->getTime();
    u32 tempsAcutel = device->getTimer()->getTime();

    while (device->run())
    {
        //recuperation du temps passer depuis la derniere frame
        tempsAcutel = device->getTimer()->getTime();
        frameDeltaTime = (f32)(tempsAcutel - tempsPasser) / 1000.f; // Time in seconds
        tempsPasser = tempsAcutel;

        event_manager(&receiver,battle_turtle1,inode);

        driver->beginScene(true,true,SColor(0,200,200,200));
        MaCamera->Update();
        sceneManager->drawAll ();
        driver->endScene ();
    }

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


Je n'ai pas put tester, il faudra bien-sur ajuster un peut tout ça (vitesse de rotation, vitesse déplacement...) il est aussi possible qu'il y est des erreur dans les sens de rotation, a voir.
En espérant que sa t'aide un peu.

@+

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