#0 

10-11-2008 04:42:44

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

Voila je voudrai savoir si quelqu'un aurait une idée de comment réaliser une camera genre "World of warcraft"
-la molette permettrai de faire un zoom avant ou arière...
-avec le bouton gauche enfoncer tourner la camera autour de la cible
-avec le droit pareille sauf que qu'en on relâche le bouton la cible tourne selon l'angle de  la camera...

Dernière modification par pspmy (10-11-2008 11:48:13)

Hors ligne


#1 

10-11-2008 07:31:56

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

Hors ligne


#2 

10-11-2008 11:46:15

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

merci de ta réponse mais je vais mieux m'expliquez:
-la molette permettrai de faire un zoom avant ou arière...
-avec le bouton gauche enfoncer tourner la camera autour de la cible
-avec le droit pareille sauf que qu'en on relâche le bouton la cible tourne selon l'angle de  la camera...

voila

Hors ligne


#3 

11-11-2008 02:47:59

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

up

Hors ligne


#4 

11-11-2008 09:39:22

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

en gros tu veux une camera à la neverwinter nights , non ?
J'en ai vu une sur le forum officiel , mais j'ai pas réussi à la faire marcher >
http://irrlicht.sourceforge.net/phpBB2/ … php?t=3245

Ca m'interesse aussi , alors si quelqu'un a une idée de la cause de ces messages d'erreurs (obtenus en copie-collant juste la classe , hein , sans rien modifier)

Code:

-------------- Build: Debug in 3rdperson ---------------

Compiling: 3rdperson.cpp
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp: In member function `void cFollowCamera::Update()':
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:24: erreur: « cData » n'a pas été déclaré
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:24: erreur: « Get » n'a pas été déclaré dans cet horizon
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:26: erreur: « cData » n'a pas été déclaré
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:30: erreur: « cData » n'a pas été déclaré
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:32: erreur: « cData » n'a pas été déclaré
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp: In constructor `cFollowCamera::cFollowCamera(irr::scene::ISceneNode*)':
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:75: erreur: « cData » n'a pas été déclaré
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:75: erreur: « Get » n'a pas été déclaré dans cet horizon
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:75: attention : variable « Get » inutilisée
Process terminated with status 1 (0 minutes, 0 seconds)
8 errors, 0 warnings

Peut etre est ce dû au changement de version d'Irrlicht ? mais cData est bien un attribut de IEventReceiver ?non ?

Hors ligne


#5 

11-11-2008 10:56:15

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

ramis :

mais cData est bien un attribut de IEventReceiver ?non ?


En fait non wink

Comme le dit NightBird, la classe cData est un singleton dans lequel il a prépositionné des donné qui vont justement servir dans son code de camera.
Vite fait sur le gaz, voici des codes qui sont valide.

d'abord  la classe cData, un singleton, il faut bien sur alimenter au préalable avant emploi

Code:

class cData
{
 protected:
    float cameraspeed;
    int        width;
    int        height;
    IrrlichtDevice *device;

    static cData *data_instance;

    cData()
    {
    }
    ~cData()
    {
    }
 public:
    static cData* Get()
    {
           if(data_instance==0)
           {
               data_instance = new cData;
           }
           return data_instance;
    }
    static void Kill()
    {
        if (data_instance!=0)
        {
            delete data_instance;
            data_instance=0;
        }
    }

    float CameraSpeed()    {        return cameraspeed;    }
    int Width()    { return width; }
    int Height(){ return height; }
    IrrlichtDevice * Device() { return device; }
    
    void SetCameraSpeed(float value)    {        cameraspeed= value;    }
    void Width(int value)    {  width=value; }
    void Height(int value){  height=value; }
    void Device(IrrlichtDevice *dev ) { device=dev; }
};
cData *cData::data_instance=0;

puis le code de cFollowCamera, légèrement modifié pour employer la cData

Code:

class cFollowCamera: public IEventReceiver
{
 public:
    ISceneNode *Target() 
    {
        return m_target;
    }
    void Target(ISceneNode *value) 
    {
        m_target = value;
        m_lastTargetPos = value->getPosition();
        m_target->grab();
    }
    void Update() 
    {
        if (!m_Cam || !m_target) return;
        if (MouseX <= cData::Get()->Width()*.05f) 
        {
            m_updated = true;
            m_yRotationAngle += cData::Get()->CameraSpeed();
            while (m_yRotationAngle > 2*PI)
                m_yRotationAngle -= 2*PI;
        }
        else if (MouseX >= cData::Get()->Width()*.95f) 
        {
            m_updated = true;
            m_yRotationAngle -= cData::Get()->CameraSpeed();    
            while (m_yRotationAngle < 2*PI)
                    m_yRotationAngle += 2*PI;
        }

        if (m_lastTargetPos != m_target->getPosition()) 
        {
            m_updated = true;
            m_lastTargetPos = m_target->getPosition();
        }
        if (m_updated) 
        {
            m_updated = false;
            vector3df m_Camerapos = m_lastTargetPos;
            m_Camerapos.X += distance*sin(m_yRotationAngle);
            m_Camerapos.Z += distance*cos(m_yRotationAngle);
            m_Camerapos.Y += distance;
            m_Cam->setPosition(m_Camerapos);
            m_Cam->setTarget(m_lastTargetPos);
        }
    }

    void Zoom(float amount) 
    {
        distance *= amount;
        if (distance == 0) distance = 2; //there should be more elaborate capping of things here..
        m_updated = true;
    }
    bool OnEvent(SEvent event) 
    {
        if (event.EventType == EET_MOUSE_INPUT_EVENT) 
        {
            switch (event.MouseInput.Event) 
            {
            case EMIE_MOUSE_WHEEL:
                    Zoom(((-event.MouseInput.Wheel)+1)/2+.5f); //make it be from .5 to 1.5
                    return true;
                    break;
            case EMIE_MOUSE_MOVED:
                    MouseX = event.MouseInput.X;
                    return true;
                    break;
            }
        }
        return false;
    }

    cFollowCamera(ISceneNode *target) 
    {
        Target(target);
        m_Cam = cData::Get()->Device()->getSceneManager()->addCameraSceneNode(0,m_lastTargetPos + vector3df(0,20,20),m_lastTargetPos);
        m_yRotationAngle = 0.0f;
        distance = 20;
    }
    
    ~cFollowCamera(void) 
    {
        m_target->drop();
    }
private:
    ISceneNode* m_target;
    ICameraSceneNode* m_Cam;
    vector3df m_lastTargetPos;
    bool m_updated;
    int MouseX;
    float distance;

    float m_yRotationAngle; //the angle about the Y axis
};

Voilà, c'est pas testé et c'est codé au saut du lit, donc à valider
wink


Force et sagesse...

Hors ligne


#6 

11-11-2008 12:47:27

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

merci pour ton code tmyke big_smile
Encore quelques erreurs mais je sens que ca va finir par marcher ^^

Code:

-------------- Build: Debug in 3rdperson ---------------

Compiling: 3rdperson.cpp
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp: In static member function `static cData* cData::Get()':
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:33: attention : « return » manquant dans une fonction devant retourner une valeur
Compiling: main.cpp
In file included from /home/romain/sdz/tutoirrlicht/3rdperson/main.cpp:2:
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp: In static member function `static cData* cData::Get()':
/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:33: attention : « return » manquant dans une fonction devant retourner une valeur
Linking console executable: bin/Debug/3rdperson
obj/Debug/main.o:/usr/include/c++/3.4/bits/locale_facets.tcc:2444: multiple definition of `cData::data_instance'
obj/Debug/3rdperson.o:/home/romain/sdz/tutoirrlicht/3rdperson/3rdperson.cpp:148: first defined here
collect2: ld a retourné 1 code d'état d'exécution
Process terminated with status 1 (0 minutes, 2 seconds)
4 errors, 0 warnings

Voilà les erreurs .Je pense que rajouter return data_instance; dans     static cData* Get() pourrait resoudre un probleme (enfin , je crois ? o_o )
Merci beaucoup de ton aide en tout cas big_smile

Hors ligne


#7 

11-11-2008 12:51:27

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

C'est de ma faute, j'ai oublié une ou deux lignes, le code initiale plus haut à été mis à jour.
Désolé, mal réveillé.
wink


Force et sagesse...

Hors ligne


#8 

11-11-2008 13:15:58

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

finalement jai développez la mienne si sa interrese quelqun

Hors ligne


#9 

11-11-2008 13:19:14

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

je veux bien voir comment tu as fait  smile
parsque moi --'

merci beaucoup à tmyke , en tout cas !

Dernière modification par ramis (11-11-2008 13:19:24)

Hors ligne


#10 

11-11-2008 13:23:02

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

event.h

Code:

#ifndef __EVENT__
#define __EVENT__

#include <irr/irrlicht.h>

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

class MyReceiver : public IEventReceiver
{
    public:
        virtual bool OnEvent(const SEvent& event)
        {
            if(event.EventType == irr::EET_KEY_INPUT_EVENT)
        {
            keys[event.KeyInput.Key] = event.KeyInput.PressedDown;
        return false;
        }
            return false;
        }

        bool keys[KEY_KEY_CODES_COUNT];
};

#endif

Dernière modification par pspmy (11-11-2008 13:32:56)

Hors ligne


#11 

11-11-2008 13:32:36

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

main.cpp

Code:

#include <irr/irrlicht.h>
#include "event.h"

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

IrrlichtDevice *device;
ISceneManager* smgr;
IVideoDriver* driver;
vector3df playerLastPosition;
bool playerMove;

int main()
{
    MyReceiver receiver;
    device = createDevice(EDT_OPENGL, dimension2d<s32>(800, 600),32, false, true, true);
    driver = device->getVideoDriver();
    smgr = device->getSceneManager();

    ICameraSceneNode *camera = smgr->addCameraSceneNode();
    IAnimatedMesh* mesh = smgr->getMesh("data\\game\\players\\1\\1.md2");
    IAnimatedMeshSceneNode *player = smgr->addAnimatedMeshSceneNode(mesh);

    this->device->setEventReceiver(receiver);
    camera->setParent(player);

    while(this->device->run())
    {    
    this->driver->beginScene(true, true, SColor(255,100,101,140));

    smgr->drawAll();

    driver->endScene();

            //==============================================================//
            //=== Recuperation de la position du player pour l'animation ===//
            //==============================================================//
            playerLastPosition = player->getPosition();
            //==============================================================//
            //=== Actualisation de la camera                             ===//
            //==============================================================//
            camera->setTarget(player->getPosition());
            camera->setPosition(vector3df(-60,50,0));
            //=============================================================//
            //=== Deplacement du personnage                             ===//
            //=============================================================//
            if (receiver.keys[KEY_UP])        //Avance
            {
                vector3df facing(cos(player->getRotation().Y * PI/180.0f), 0, -sin(player->getRotation().Y * PI/180.0f));
                                facing.normalize();
                                vector3df newPos = player->getPosition() + (facing - (facing * (f32)0.5));
                                player->setPosition(newPos);
            }
            if (receiver.keys[KEY_DOWN])    //Recule
            {
                vector3df facing(cos(player->getRotation().Y * PI/180.0f),0,-sin(player->getRotation().Y * PI/180.0f));
                                facing.normalize();
                                vector3df newPos = player->getPosition() - (facing- (facing * (f32)0.7));
                                player->setPosition(newPos);
                playerMove = true;
            }
            if (receiver.keys[KEY_LEFT])    //Rotation vers la gauche
            {
                player->setRotation(player->getRotation() - vector3df(0,1,0)); 
            }
            if (receiver.keys[KEY_RIGHT])    //Rotation vers la droite
            {
                player->setRotation(player->getRotation() + vector3df(0,1,0)); 
            }
            //==============================================================//
            //=== Animation du personnage                                ===//
            //==============================================================//
            if (playerLastPosition != player->getPosition())    //Si le joueur bouge
            {
                if (playerMove == false)                                //Si l'animation de deplacement n'est pas activer
                {
                    player->setMD2Animation(EMAT_RUN);                //Change l'animation du joueur
                    playerMove = true;
                }
            }
            else                                                            //Si le joueur ne bouge plus
            {
                if (playerMove == true)                                //Si l'animation "courire" a ete activer
                {
                    player->setMD2Animation(EMAT_STAND);                //Change l'animation du joueur
                    playerMove = false;
                }
            }

    if (receiver.keys[KEY_ESCAPE])
    {
        exit(0);
        }
    }
    return 0;
}

Dernière modification par pspmy (11-11-2008 13:33:58)

Hors ligne


#12 

11-11-2008 13:59:05

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

big_smile merci ! c'est sympa !


(par contre j'ai toujours un bug avec la camera NWM :'( ...avec le code identique au tien tmyke , j'doit vraiment être un boulet--' :

Code:

-multiple definition of `cData::data_instance'
-157: first defined here

2 errors, 0 warnings

pourtant ce code > cData *cData::data_instance=0;
devrait bien fonctionner , non ???)

Dernière modification par ramis (11-11-2008 14:00:33)

Hors ligne


#13 

11-11-2008 14:00:09

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

moi je dit faudrai ouvrire une categorie aide - camera xD

Hors ligne


#14 

11-11-2008 14:13:18

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

ramis :

(par contre j'ai toujours un bug avec la camera NWM :

Code:

-multiple definition of `cData::data_instance'
-157: first defined here

2 errors, 0 warnings

pourtant ce code > cData *cData::data_instance=0;
devrait bien fonctionner , non ???)


dans quelle partie de ton code définis-tu 'cData *cData::data_instance=0;', cela doit être en globale normalement...

pspmy :

moi je dit faudrai ouvrire une categorie aide - camera xD


Il est difficile de créer une section pour chaque type de node du moteur, même si certaines amènent à des question ou des codes réguliers.
Par contre, pour s'y retrouver, mettre en en-tête du sujet un [CAMERA] peut aider e nterme de lisibilité des sujets (en complement du système de recherche du forum)
Une fois le Wiki réactivé, alors il y aura des sections spécifiques pour des petits code et aide....
wink


Force et sagesse...

Hors ligne


#15 

11-11-2008 14:22:01

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

ou faire des sous section dans la section aide c++
sinon tu ne pense coi de mon code ?

et j'oublier de vous dire ce seai biezn de crée une rubrique archive pour aide c++
car sa deborde de vieu topic

Dernière modification par pspmy (11-11-2008 14:23:21)

Hors ligne


#16 

11-11-2008 14:47:50

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

tmyke > Je l'ai définie juste en dessous de la classe cData , juste entre les deux classes .Comme toi dans ton code , d'ailleurs .
A propos du wiki , c'est pour bientôt ?? wink

Hors ligne


#17 

11-11-2008 14:48:07

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

pspmy :

ou faire des sous section dans la section aide c++


L'idée est bonne, et je pense qu'effectivement ranger certains codes dans des sous-rubriques pourrait permettre de
gagner en lisibilité et souplesse, je vais voir cela, et de déterminer les sous rubriques ... wink

pspmy :

sinon tu ne pense coi de mon code ?


C'est du tout bon, j'ai pris le temps d'essayer, cela tourne, donc pas de soucis, j'ai vue que tu avais créé un topic avec ce code dans la
rubrique 'Routines' et tu as bien fais. smile


pspmy :

et j'oublier de vous dire ce serai bien de crée une rubrique archive pour aide c++
car sa déborde de vieux topic


Certains code ne sont pas jeunes, bien que le forum ne soit pas si vieux, mais si je créé des sous rubrique, je m'évertuerais à y placer
tout les codes qui s'y rapportent pour aérer les choses.


Force et sagesse...

Hors ligne


#18 

11-11-2008 14:53:17

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

eh ben wink que de bonnes idées en quelque minutes big_smile
bon , la camera NWM ne m'aime pas , dirait on ...

>Erreur de segmentation (core dumped)<

Tant pis wink

Hors ligne


#19 

11-11-2008 16:40:08

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

et une autre idée : une new categorie : code snipet

Hors ligne


#20 

11-11-2008 18:47:52

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

ça vient direct du forum off ça non ?
Je vais voir dans les jours a venir comment aussi ré-architecturer la parite Tuto/Aides/Snipet etc...

wink


Force et sagesse...

Hors ligne


#21 

11-11-2008 19:10:19

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

aufait esque je peut postuler pour etre moderateur ?

Hors ligne


#22 

11-11-2008 19:25:21

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Pour être franc, pour le moment le forum n'a pas trop besoin de moderateur. Je suis la tous les jours, Izguit passe
malgrés tout régulièrement faire un petit tour, pas de spam à la con et le trafic du forum reste pour le moment
pas suffisement important pour envisager de s'attacher les services d'une armée de modérateurs.

Ceci dit, j'ai parfois des périodes ou je dois m'éloigner un peu (raisons professionnelles), et donc dans l'avenir si le site
atteint un niveau raisonnable d'affluence, et qu'il apparait que je sois obliger de laisser une ou deux personnes
dont la présence régulière garantisse la bonne tenue du forum, alors je ferais un 'recrutement'.

Pas de soucis, dans ce cas tu pourras alors postuler wink


Force et sagesse...

Hors ligne


#23 

11-11-2008 19:29:16

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

ok merci !! je passerais souvent pour aider les autre et tan que j'i suis il serai possible de classer les routine (gui, 2d, 3d , system, ...)

Hors ligne


#24 

11-11-2008 20:08:13

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

pspmy :

ok merci !! je passerais souvent pour aider les autre


C'est cool de ta part, la communauté à besoin de gens qui ont une certaines fidélité, et d'un certains nombres de piliers, pour animer et
aider. wink

pspmy :

et tan que j'i suis il serai possible de classer les routine (gui, 2d, 3d , system, ...)


Je ne peux pas créer autant de sous-forum qu'il existe de cathegorie d'éléments ou de classes  dans Irrlichrt.
Mais au fils des jours j'en créerais quelques autres malgré tout en fonction de la complexité des sujet (comme les shaders, déjà créé) ou
de leur popularités... (terrain, animation, etc...)


Force et sagesse...

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
17 invités en ligne
Aucun membre connecté
RSS Feed