#0 

25-10-2010 15:24:02

kiricou974
Membre
Date d'inscription: 18-10-2010
Messages: 34

Bonjour je cherche le calcule à faire pour que mon mesh avance selon la rotation Y et Z.
c'est à dire quand il est tourné vers le bas (rotation de Z) il avance vers le bas, et quand il regarde vers le haut il avance vers le haut.

Et je voudrais savoir comment faire (s'il y a un calcul) pour que les axes de rotation ne tournent pas avec le mesh, regardez l'image.
http://i1128.photobucket.com/albums/m49 … r/3d-1.jpg

Voilà merci d'avance.

Dernière modification par kiricou974 (25-10-2010 20:31:26)

Hors ligne


#1 

25-10-2010 21:38:26

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

Pour ta 1ere question jette un œil par là:
http://irrlicht-fr.org/viewtopic.php?id=1350
void moveCamera(irr::scene::ISceneNode *node, vector3df unite)
ça correspond à peu près à ce que tu veux faire je pense..


Sinon pour ta 2eme question, j'ai pas bien compris ce que tu veux faire, ne pas tourner l'axe de quoi ? ton mesh ? ton monde ?....

Hors ligne


#2 

25-10-2010 21:56:10

kiricou974
Membre
Date d'inscription: 18-10-2010
Messages: 34

Pour ma 2eme question je voudrais savoir comment faire pour que les axes de rotation du mesh, de l'objet que je contrôle (vaisseaux spatiale) ne tournent pas avec le mesh.
excuse moi si je m'exprime mal j'ai du mal à le décrire.

Merci pour la première question mais j'ai trouvé par moi-même.

Dernière modification par kiricou974 (25-10-2010 21:57:43)

Hors ligne


#3 

25-10-2010 22:06:04

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

ok je vois ce que tu veux dire,
Une petite idée (parmi d'autres) tu crées un noeud de scene "noeud1" , tu en crées ensuite un deuxième qui contient ton vaisseau.
tu mets le deuxième en fils de "noeud1".
Tu peut donc tourner ton vaisseau sur l'axe que tu veux, sans modifier l'axe de "noeud1"
ensuite j'imagine que tu contrôles "noeud1" pour gérer les déplacements"

Dernière modification par nabouill (25-10-2010 22:07:28)

Hors ligne


#4 

25-10-2010 22:16:07

kiricou974
Membre
Date d'inscription: 18-10-2010
Messages: 34

j'ai déjà essayé ça mais le problème c'est que avec la camera 3eme personne que j'ai sans fait un joli bug mais je vais retenter.

bon voila le code que j'ai fait :

Code:

#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;

void event_manager(MyEventReceiver *receiver, IAnimatedMeshSceneNode *battle_turtle1)
{
    int rot1 = 0, rot2 = 0;
    vector3df rot, rrot;
    rot.Y += 0.7;

    ISceneNode *plane = battle_turtle1->getParent();

    if(receiver->IsKeyDown(KEY_KEY_Z))
    {
        vector3df facing(cos(battle_turtle1->getRotation().Y * PI/180.0f), -sin(battle_turtle1->getRotation().Z * PI/180.0f), -sin(battle_turtle1->getRotation().Y * PI/180.0f));
        facing.normalize();
        vector3df newPos = battle_turtle1->getPosition() - (facing + (facing * (f32)0.5f));
        battle_turtle1->setPosition(newPos);

        if(receiver->IsKeyDown(KEY_KEY_Q))
        {
            if (battle_turtle1->getRotation().X <= -30)
            {
                rot1 = 0;
            }
            else
            {
                rot1 = rot1 + 1;
            }

            battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(-rot1,-rot.Y,0));
        }
        else if(receiver->IsKeyDown(KEY_KEY_D))
        {
            if (battle_turtle1->getRotation().X >= 30)
            {
                rot2 = 0;
            }
            else
            {
                rot2 = rot2 + 1;
            }

            battle_turtle1->setRotation(battle_turtle1->getRotation()+ vector3df(rot2,rot.Y,0));
        }
        else if(receiver->IsKeyDown(KEY_KEY_Q) == false && receiver->IsKeyDown(KEY_KEY_D) == false)
        {
            if (battle_turtle1->getRotation().X < 0)
            {
                rot1 = rot1 + 1;
            }
            else if (battle_turtle1->getRotation().X == 0)
            {
                rot1 = 0;
                rot2 = 0;
            }
            else if (battle_turtle1->getRotation().X > 0)
            {
                rot2 = rot2 - 1;
            }

            battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot1,0,0));
            battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot2,0,0));
        }
    }
    else if(receiver->IsKeyDown(KEY_KEY_Q))
    {
        if (battle_turtle1->getRotation().X <= -30)
        {
            rot1 = 0;
        }
        else
        {
            rot1 = rot1 + 1;
        }

        battle_turtle1->setRotation(battle_turtle1->getRotation()+vector3df(-rot1,-rot.Y,0));
    }

    else if(receiver->IsKeyDown(KEY_KEY_A))
    {
        battle_turtle1->setRotation(battle_turtle1->getRotation()+vector3df(0,0,1));
    }
    else if(receiver->IsKeyDown(KEY_KEY_E))
    {
        battle_turtle1->setRotation(battle_turtle1->getRotation()-vector3df(0,0,1));
    }

    else if(receiver->IsKeyDown(KEY_KEY_D))
    {
        if (battle_turtle1->getRotation().X >= 30)
        {
            rot2 = 0;
        }
        else
        {
            rot2 = rot2 + 1;
        }

        battle_turtle1->setRotation(battle_turtle1->getRotation()+ vector3df(rot2,rot.Y,0));
    }

    else if(receiver->IsKeyDown(KEY_KEY_Q) == false && receiver->IsKeyDown(KEY_KEY_D) == false)
    {
        if (battle_turtle1->getRotation().X < 0)
        {
            rot1 = rot1 + 1;
        }
        else if (battle_turtle1->getRotation().X == 0)
        {
            rot1 = 0;
            rot2 = 0;
        }
        else if (battle_turtle1->getRotation().X > 0)
        {
            rot2 = rot2 - 1;
        }

        battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot1,0,0));
        battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot2,0,0));
    }
}

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 ();

    scene::IAnimatedMeshSceneNode *shield_node;

    sceneManager->addSkyBoxSceneNode(
            driver->getTexture("Data/skybox/irrlicht2_up.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_dn.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_lf.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_rt.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_ft.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_bk.jpg"));

    scene::ILightSceneNode* lumiere = sceneManager->addLightSceneNode(0,vector3df(500000,0,10000),SColorf(255, 255, 255),5000000.0f);

    lumiere->getLightData().Type = ELT_POINT;

    f32 radius = 0.1;
    u32 duration = 500;
    video::SColorf impact_color(1,1,1,1);

    device->getCursorControl ()-> setVisible (true);    // curseur invisible

    scene::IMeshManipulator *manipulator = sceneManager->getMeshManipulator();

    CShieldManager *shieldmanager = new CShieldManager(sceneManager,device->getTimer());

    scene::ISceneNode * plane = sceneManager->addCubeSceneNode(0.0001f);
    scene::IAnimatedMeshSceneNode *battle_turtle1 = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/dedale.b3d"), plane);
    scene::ISceneNode * planet = sceneManager->addSphereSceneNode(5,96);
    scene::ISceneNode * soleil = sceneManager->addSphereSceneNode(5,96);

    planet->setScale(vector3df(20,20,20));
    planet->setPosition(vector3df(20000,0,0));
    soleil->setScale(vector3df(20*18,20*18,20*18));
    soleil->setPosition(vector3df(0,0,0));
    soleil->setMaterialFlag(EMF_LIGHTING, false);
    lumiere->setPosition(soleil->getPosition());
    battle_turtle1->setScale(core::vector3df(1,1,1));
    battle_turtle1->setPosition(core::vector3df(20000,0,100));

    battle_turtle1->setMaterialFlag(EMF_LIGHTING, true);
    shield_node = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/shield_dedale.b3d"),battle_turtle1);
    shield_node->setMaterialTexture(0,driver->getTexture("Data/textures/water.jpg"));
    shield_node->setMaterialTexture(1,driver->getTexture("Data/textures/gradient_blinds.png"));
    planet->setMaterialTexture(0,driver->getTexture("Data/textures/terre.jpg"));
    soleil->setMaterialTexture(0,driver->getTexture("Data/textures/soleil.png"));

    manipulator->scaleTCoords(shield_node->getMesh(),core::vector2df(6,6),1);
    shield_node->setMaterialFlag(video::EMF_BACK_FACE_CULLING,false);
    shield_node->setScale(core::vector3df(1,1,1));
    shield_node->setVisible(false);

    scene::ITriangleSelector *selector = sceneManager->createTriangleSelector(shield_node->getMesh(),shield_node);
    selector = sceneManager->createTriangleSelector(shield_node->getMesh(),shield_node);
    shield_node->setTriangleSelector(selector);
    selector->drop();

    scene::ITriangleSelector *selector1;

    shieldmanager->addShield(shield_node);

    FollowingCamera* MaCamera = new FollowingCamera(battle_turtle1, sceneManager,false, 50000,selector1,-3,0.5f,0,vector3df(7,2,0));   // Position initiale.

    MyEventReceiver receiver;
    device->setEventReceiver(&receiver);

    int lastFPS = -1;
    u32 lastMS = device->getTimer()->getRealTime();

    while (device->run())                                // la boucle de rendu
    {
        u32 difMs = device->getTimer()->getRealTime()-lastMS;
        lastMS = device->getTimer()->getRealTime();
        f32 alignSpeed = difMs/16.0;

        if(lastMS%(rand()%20+30)==0)
        {
            core::vector3df source = vector3df(50,10,50);
            core::vector3df target = battle_turtle1->getPosition();

            const core::line3df ray(source,target);

            core::vector3df result = shieldmanager->addImpact(shield_node, ray,radius*250,duration,impact_color);
            core::matrix4 trans = shield_node->getAbsoluteTransformation();
            trans.makeInverse();
            trans.transformVect(result);
        }

        event_manager(&receiver,battle_turtle1);

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

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

Dernière modification par kiricou974 (25-10-2010 22:32:27)

Hors ligne


#5 

25-10-2010 22:35:15

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

essaye d'utiliser les balise de code C++ stp pour poster ton code, ce sera plus lisible.
Et quand tu dis ça bug, c'est quoi/comment ça  bug ?

Hors ligne


#6 

25-10-2010 22:48:24

kiricou974
Membre
Date d'inscription: 18-10-2010
Messages: 34

Excuse moi pour les balises ben quand je dit que sa bug ben la camera ne suit plus le vaisseau et quand je tourne avec le vaisseau ben il disparaît. mais avec le code que j'ai mis il a pas de problème mais le vaisseau ne tourne pas comme il faut quand je monte ou descends.

Hors ligne


#7 

25-10-2010 23:06:54

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

ok, si je peux me permettre une petit remarque au passage (mais le prend pas mal) ça manque un peu de commentaires ton code, ça devient un peu difficile à lire (enfin pour moi toujours).

Donc si j'ai bien compris, tu crées un sceneNode "plane" à qui tu attaches un autre sceneNode "battle_turtle1".
Tu as une camera qui suit en permanence "battle_turtle1". Avec les touches du clavier, tu changes les positions de "battle_turtle1". on ne voit pas le code de "FollowingCamera", mais j'imagine que vu que la camera suit "battle_turtle1", quand tu fais une rotation sur "battle_turtle1" la camera en fait autant donc l'effet devient transparent. d'autre part, tu ne bouges jamais "plane", lui il reste à sa position, "battle_turtle1" en est son fils mais se déplace toujours seul, donc l'intérêt ici il n'y en a pas.

Si mon petit résumé est bon, je pense pouvoir corriger cela en:

tu continues de mettre "battle_turtle1" fils de "plane" mais quand tu bouges, tu bouges "plane" et non plus "battle_turtle1". Par contre quand tu montes ou descends, tu fais une rotation sur "battle_turtle1" sur l'axe X pour que "battle_turtle1" penche en avant ou en arrière.
Et MaCamera ne doit pas suivre "battle_turtle1" mais "plane" (ce que tu avais du faire je pense, mais si pour les déplacements tu déplaçais "battle_turtle1" au lieu de plane, "battle_turtle1" se barrait bien vite et loin donc tu ne le voyais plus)

Je pense que ça devrait rouler (si j'ai bien compris le code et ce que tu voulais faire)

Bon courage!


ps: pense au balise de code http://irrlicht-fr.org/help.php#bbcode

Dernière modification par nabouill (25-10-2010 23:09:25)

Hors ligne


#8 

25-10-2010 23:10:08

kiricou974
Membre
Date d'inscription: 18-10-2010
Messages: 34

C'est exactement ça et pour les commentaires c'est une habitude que je dois prendre désolé.

Hors ligne


#9 

25-10-2010 23:14:26

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

pas de soucis, redis sinon si ça marche pas

Hors ligne


#10 

25-10-2010 23:20:19

kiricou974
Membre
Date d'inscription: 18-10-2010
Messages: 34

ben je viens de faire tes modifications mais quand je monte et que je tourne à droite ou à gauche il fait une boucle bizarre qui n'est pas bon voilà le code que j'ai fait

Code:

#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;

void event_manager(MyEventReceiver *receiver, IAnimatedMeshSceneNode *battle_turtle1, ISceneNode* plane)
{
    int rot1 = 0, rot2 = 0;
    vector3df rot, rrot;
    rot.Y += 0.7;

    if(receiver->IsKeyDown(KEY_KEY_Z))
    {
        vector3df facing(cos(battle_turtle1->getRotation().Y * PI/180.0f), -sin(battle_turtle1->getRotation().Z * PI/180.0f), -sin(battle_turtle1->getRotation().Y * PI/180.0f));
        facing.normalize();
        vector3df newPos = battle_turtle1->getPosition() - (facing + (facing * (f32)0.5f));
        battle_turtle1->setPosition(newPos);

        if(receiver->IsKeyDown(KEY_KEY_Q))
        {
            if (battle_turtle1->getRotation().X <= -30)
            {
                rot1 = 0;
            }
            else
            {
                rot1 = rot1 + 1;
            }

            battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(-rot1,-rot.Y,0));
        }
        else if(receiver->IsKeyDown(KEY_KEY_D))
        {
            if (battle_turtle1->getRotation().X >= 30)
            {
                rot2 = 0;
            }
            else
            {
                rot2 = rot2 + 1;
            }

            battle_turtle1->setRotation(battle_turtle1->getRotation()+ vector3df(rot2,rot.Y,0));
        }
        else if(receiver->IsKeyDown(KEY_KEY_Q) == false && receiver->IsKeyDown(KEY_KEY_D) == false)
        {
            if (battle_turtle1->getRotation().X < 0)
            {
                rot1 = rot1 + 1;
            }
            else if (battle_turtle1->getRotation().X == 0)
            {
                rot1 = 0;
                rot2 = 0;
            }
            else if (battle_turtle1->getRotation().X > 0)
            {
                rot2 = rot2 - 1;
            }

            battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot1,0,0));
            battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot2,0,0));
        }
    }
    else if(receiver->IsKeyDown(KEY_KEY_Q))
    {
        if (battle_turtle1->getRotation().X <= -30)
        {
            rot1 = 0;
        }
        else
        {
            rot1 = rot1 + 1;
        }

        battle_turtle1->setRotation(battle_turtle1->getRotation()+vector3df(-rot1,-rot.Y,0));
    }

    else if(receiver->IsKeyDown(KEY_KEY_A))
    {
        battle_turtle1->setRotation(battle_turtle1->getRotation()+vector3df(0,0,1));
    }
    else if(receiver->IsKeyDown(KEY_KEY_E))
    {
        battle_turtle1->setRotation(battle_turtle1->getRotation()-vector3df(0,0,1));
    }

    else if(receiver->IsKeyDown(KEY_KEY_D))
    {
        if (battle_turtle1->getRotation().X >= 30)
        {
            rot2 = 0;
        }
        else
        {
            rot2 = rot2 + 1;
        }

        battle_turtle1->setRotation(battle_turtle1->getRotation()+ vector3df(rot2,rot.Y,0));
    }

    else if(receiver->IsKeyDown(KEY_KEY_Q) == false && receiver->IsKeyDown(KEY_KEY_D) == false)
    {
        if (battle_turtle1->getRotation().X < 0)
        {
            rot1 = rot1 + 1;
        }
        else if (battle_turtle1->getRotation().X == 0)
        {
            rot1 = 0;
            rot2 = 0;
        }
        else if (battle_turtle1->getRotation().X > 0)
        {
            rot2 = rot2 - 1;
        }

        battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot1,0,0));
        battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot2,0,0));
    }
}

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 ();

    scene::IAnimatedMeshSceneNode *shield_node;

    sceneManager->addSkyBoxSceneNode(
            driver->getTexture("Data/skybox/irrlicht2_up.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_dn.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_lf.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_rt.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_ft.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_bk.jpg"));

    scene::ILightSceneNode* lumiere = sceneManager->addLightSceneNode(0,vector3df(500000,0,10000),SColorf(255, 255, 255),5000000.0f);

    lumiere->getLightData().Type = ELT_POINT;

    f32 radius = 0.1;
    u32 duration = 500;
    video::SColorf impact_color(1,1,1,1);

    device->getCursorControl ()-> setVisible (true);    // curseur invisible

    scene::IMeshManipulator *manipulator = sceneManager->getMeshManipulator();

    CShieldManager *shieldmanager = new CShieldManager(sceneManager,device->getTimer());

    scene::ISceneNode * plane = sceneManager->addCubeSceneNode(0.0001f);
    scene::IAnimatedMeshSceneNode *battle_turtle1 = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/dedale.b3d"), plane);
    scene::ISceneNode * planet = sceneManager->addSphereSceneNode(5,96);
    scene::ISceneNode * soleil = sceneManager->addSphereSceneNode(5,96);

    planet->setScale(vector3df(20,20,20));
    planet->setPosition(vector3df(20000,0,0));
    soleil->setScale(vector3df(20*18,20*18,20*18));
    soleil->setPosition(vector3df(0,0,0));
    soleil->setMaterialFlag(EMF_LIGHTING, false);
    lumiere->setPosition(soleil->getPosition());
    battle_turtle1->setScale(core::vector3df(1,1,1));
    battle_turtle1->setPosition(core::vector3df(20000,0,100));

    battle_turtle1->setMaterialFlag(EMF_LIGHTING, true);
    shield_node = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/shield_dedale.b3d"),battle_turtle1);
    shield_node->setMaterialTexture(0,driver->getTexture("Data/textures/water.jpg"));
    shield_node->setMaterialTexture(1,driver->getTexture("Data/textures/gradient_blinds.png"));
    planet->setMaterialTexture(0,driver->getTexture("Data/textures/terre.jpg"));
    soleil->setMaterialTexture(0,driver->getTexture("Data/textures/soleil.png"));

    manipulator->scaleTCoords(shield_node->getMesh(),core::vector2df(6,6),1);
    shield_node->setMaterialFlag(video::EMF_BACK_FACE_CULLING,false);
    shield_node->setScale(core::vector3df(1,1,1));
    shield_node->setVisible(false);

    scene::ITriangleSelector *selector = sceneManager->createTriangleSelector(shield_node->getMesh(),shield_node);
    selector = sceneManager->createTriangleSelector(shield_node->getMesh(),shield_node);
    shield_node->setTriangleSelector(selector);
    selector->drop();

    scene::ITriangleSelector *selector1;

    shieldmanager->addShield(shield_node);

    FollowingCamera* MaCamera = new FollowingCamera(battle_turtle1, sceneManager,false, 50000,selector1,-3,0.5f,0,vector3df(7,2,0));   // Position initiale.

    MyEventReceiver receiver;
    device->setEventReceiver(&receiver);

    int lastFPS = -1;
    u32 lastMS = device->getTimer()->getRealTime();

    while (device->run())                                // la boucle de rendu
    {
        u32 difMs = device->getTimer()->getRealTime()-lastMS;
        lastMS = device->getTimer()->getRealTime();
        f32 alignSpeed = difMs/16.0;

        if(lastMS%(rand()%20+30)==0)
        {
            core::vector3df source = vector3df(50,10,50);
            core::vector3df target = battle_turtle1->getPosition();

            const core::line3df ray(source,target);

            core::vector3df result = shieldmanager->addImpact(shield_node, ray,radius*250,duration,impact_color);
            core::matrix4 trans = shield_node->getAbsoluteTransformation();
            trans.makeInverse();
            trans.transformVect(result);
        }

        event_manager(&receiver,battle_turtle1,plane );

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

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

Hors ligne


#11 

25-10-2010 23:34:02

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

tu n'as pas appliqué toutes mes modifications, car tu ne bouges toujours pas "plane"
l'idée est que tu ne déplaces JAMAIS "battle_turtle1". quand tu te déplaces, tu déplaces seulement "plane". "battle_turtle1" étant son fils va suivre tout seul.
une fois que ça c'est fait, tu peux alors appliquer une rotation a "battle_turtle1" quand tu montes ou descends ou tournes , mais seulement une rotation PAS de déplacement. Et ta camera DOIT suivre "plane"

Aussi si tu veux plus de détails, commente les lignes évènements que je comprenne à quoi servent réellement les touches (avancer, tourner...) pour que j'essaye de retoucher un peu ton code.



ps: pour les balises de code, utilise plutôt la balise  =>   Code=cpp

Dernière modification par nabouill (25-10-2010 23:35:44)

Hors ligne


#12 

26-10-2010 00:57:40

kiricou974
Membre
Date d'inscription: 18-10-2010
Messages: 34

bon voila se que j'ai fait mais le problème c'est que la camera ne pivote pas avec le vaisseau et il faut toujours une boucle bizard. si je peut te poster mes source et les bin

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;

void event_manager(MyEventReceiver *receiver, IAnimatedMeshSceneNode *battle_turtle1, ISceneNode* plane)
{
    int rot1 = 0, rot2 = 0;
    vector3df rot, rrot;
    rot.Y += 0.7;

    if(receiver->IsKeyDown(KEY_KEY_Z)) //la touche Z fait avancer le vaiseau
    {
        vector3df facing(cos(battle_turtle1->getRotation().Y * PI/180.0f), -sin(battle_turtle1->getRotation().Z * PI/180.0f), -sin(battle_turtle1->getRotation().Y * PI/180.0f));
        facing.normalize();
        vector3df newPos = plane->getPosition() - (facing + (facing * (f32)0.5f));
        plane->setPosition(newPos);

        if(receiver->IsKeyDown(KEY_KEY_Q))//si on appuis sur Z et Q on avance et on tourne en a gauche en meme temps
        {
            if (battle_turtle1->getRotation().X <= -30)
            {
                rot1 = 0;
            }
            else
            {
                rot1 = rot1 + 1;
            }

            battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(-rot1,-rot.Y,0));
        }
        else if(receiver->IsKeyDown(KEY_KEY_D))//si on appuis sur Z et D on avance et on tourne en a droite en meme temps
        {
            if (battle_turtle1->getRotation().X >= 30)
            {
                rot2 = 0;
            }
            else
            {
                rot2 = rot2 + 1;
            }

            battle_turtle1->setRotation(battle_turtle1->getRotation()+ vector3df(rot2,rot.Y,0));
        }
        else if(receiver->IsKeyDown(KEY_KEY_Q) == false && receiver->IsKeyDown(KEY_KEY_D) == false)//remise a plomb du vaisseau si il y a que Z appuier
        {
            if (battle_turtle1->getRotation().X < 0)
            {
                rot1 = rot1 + 1;
            }
            else if (battle_turtle1->getRotation().X == 0)
            {
                rot1 = 0;
                rot2 = 0;
            }
            else if (battle_turtle1->getRotation().X > 0)
            {
                rot2 = rot2 - 1;
            }

            battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot1,0,0));
            battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot2,0,0));
        }
    }
    else if(receiver->IsKeyDown(KEY_KEY_Q))//si on appuis que sur Q on vire a gauche
    {
        if (battle_turtle1->getRotation().X <= -30)
        {
            rot1 = 0;
        }
        else
        {
            rot1 = rot1 + 1;
        }

        battle_turtle1->setRotation(battle_turtle1->getRotation()+vector3df(-rot1,-rot.Y,0));
    }

    else if(receiver->IsKeyDown(KEY_KEY_A))//si on appuis sur A on monte
    {
        battle_turtle1->setRotation(battle_turtle1->getRotation()+vector3df(0,0,1));
    }
    else if(receiver->IsKeyDown(KEY_KEY_E))//si on appuis que sur E on descend
    {
        battle_turtle1->setRotation(battle_turtle1->getRotation()-vector3df(0,0,1));
    }

    else if(receiver->IsKeyDown(KEY_KEY_D))//si on appuis que sur D on vire a droite
    {
        if (battle_turtle1->getRotation().X >= 30)
        {
            rot2 = 0;
        }
        else
        {
            rot2 = rot2 + 1;
        }

        battle_turtle1->setRotation(battle_turtle1->getRotation()+ vector3df(rot2,rot.Y,0));
    }

    else if(receiver->IsKeyDown(KEY_KEY_Q) == false && receiver->IsKeyDown(KEY_KEY_D) == false)//remise a plomb du vaisseau
    {
        if (battle_turtle1->getRotation().X < 0)
        {
            rot1 = rot1 + 1;
        }
        else if (battle_turtle1->getRotation().X == 0)
        {
            rot1 = 0;
            rot2 = 0;
        }
        else if (battle_turtle1->getRotation().X > 0)
        {
            rot2 = rot2 - 1;
        }

        battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot1,0,0));
        battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot2,0,0));
    }
}

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 ();

    scene::IAnimatedMeshSceneNode *shield_node;

    sceneManager->addSkyBoxSceneNode(
            driver->getTexture("Data/skybox/irrlicht2_up.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_dn.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_lf.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_rt.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_ft.jpg"),
            driver->getTexture("Data/skybox/irrlicht2_bk.jpg"));

    scene::ILightSceneNode* lumiere = sceneManager->addLightSceneNode(0,vector3df(500000,0,10000),SColorf(255, 255, 255),5000000.0f);

    lumiere->getLightData().Type = ELT_POINT;

    f32 radius = 0.1;
    u32 duration = 500;
    video::SColorf impact_color(1,1,1,1);

    device->getCursorControl ()-> setVisible (true);    // curseur invisible

    scene::IMeshManipulator *manipulator = sceneManager->getMeshManipulator();

    CShieldManager *shieldmanager = new CShieldManager(sceneManager,device->getTimer());

    scene::ISceneNode * plane = sceneManager->addCubeSceneNode(0.001);
    scene::IAnimatedMeshSceneNode *battle_turtle1 = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/dedale.b3d"), plane);
    scene::ISceneNode * planet = sceneManager->addSphereSceneNode(5,96);
    scene::ISceneNode * soleil = sceneManager->addSphereSceneNode(5,96);

    planet->setScale(vector3df(20,20,20));
    planet->setPosition(vector3df(20000,0,0));
    plane->setPosition(vector3df(20000,0,100));
    soleil->setScale(vector3df(20*18,20*18,20*18));
    soleil->setPosition(vector3df(0,0,0));
    soleil->setMaterialFlag(EMF_LIGHTING, false);
    lumiere->setPosition(soleil->getPosition());
    battle_turtle1->setScale(core::vector3df(1,1,1));

    battle_turtle1->setMaterialFlag(EMF_LIGHTING, true);
    shield_node = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/shield_dedale.b3d"),battle_turtle1);
    shield_node->setMaterialTexture(0,driver->getTexture("Data/textures/water.jpg"));
    shield_node->setMaterialTexture(1,driver->getTexture("Data/textures/gradient_blinds.png"));
    planet->setMaterialTexture(0,driver->getTexture("Data/textures/terre.jpg"));
    soleil->setMaterialTexture(0,driver->getTexture("Data/textures/soleil.png"));

    manipulator->scaleTCoords(shield_node->getMesh(),core::vector2df(6,6),1);
    shield_node->setMaterialFlag(video::EMF_BACK_FACE_CULLING,false);
    shield_node->setScale(core::vector3df(1,1,1));
    shield_node->setVisible(false);

    scene::ITriangleSelector *selector = sceneManager->createTriangleSelector(shield_node->getMesh(),shield_node);
    selector = sceneManager->createTriangleSelector(shield_node->getMesh(),shield_node);
    shield_node->setTriangleSelector(selector);
    selector->drop();

    scene::ITriangleSelector *selector1;

    shieldmanager->addShield(shield_node);

    FollowingCamera* MaCamera = new FollowingCamera(plane, sceneManager,false, 50000,selector1,-3,0.5f,0,vector3df(7,2,0));   // Position initiale.

    MyEventReceiver receiver;
    device->setEventReceiver(&receiver);

    int lastFPS = -1;
    u32 lastMS = device->getTimer()->getRealTime();

    while (device->run())                                // la boucle de rendu
    {
        u32 difMs = device->getTimer()->getRealTime()-lastMS;
        lastMS = device->getTimer()->getRealTime();
        f32 alignSpeed = difMs/16.0;

        if(lastMS%(rand()%20+30)==0)
        {
            core::vector3df source = vector3df(50,10,50);
            core::vector3df target = battle_turtle1->getPosition();

            const core::line3df ray(source,target);

            core::vector3df result = shieldmanager->addImpact(shield_node, ray,radius*250,duration,impact_color);
            core::matrix4 trans = shield_node->getAbsoluteTransformation();
            trans.makeInverse();
            trans.transformVect(result);
        }

        event_manager(&receiver,battle_turtle1,plane );

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

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

Dernière modification par kiricou974 (26-10-2010 00:58:24)

Hors ligne


#13 

27-10-2010 23:52:42

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

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/skybox/irrlicht2_up.jpg"), 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.

@+

Dernière modification par nabouill (27-10-2010 23:56:58)

Hors ligne


#14 

28-10-2010 16:50:15

kiricou974
Membre
Date d'inscription: 18-10-2010
Messages: 34

Merci de cette réponse mais j'ai changer la façon don le vaisseau se deplace merci quand meme.

Hors ligne


#15 

29-10-2010 08:29:54

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

ça aurait été bien de le dire, cela m'aurait éviter de perdre 1 heure pour rien.

Hors ligne


#16 

29-10-2010 14:10:47

kiricou974
Membre
Date d'inscription: 18-10-2010
Messages: 34

Désoler pour les dérangement nabouill

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
Analysé par
872 membres
1422 sujets
11104 messages
Dernier membre inscrit: Glider
12 invités en ligne
Aucun membre connecté
RSS Feed