#0 

02-04-2012 23:05:26

RVM
Membre
Date d'inscription: 08-08-2010
Messages: 20

Hello,

Je cherche à apprendre a créer mes propres caméras, pour cela j'ai suivit le tutoriel du SDZ.
Pour tester j'ai implémenté une caméra comme celle dans le tuto, j'ai rajouté les méthodes manquantes : createclone & le destructeur en me basant sur les sources d'Irrlicht.
Mon createclone :

Code c++ :


irr::scene::ISceneNodeAnimator* CSceneNodeAnimatorCameraTrackball::createClone(irr::scene::ISceneNode* node, irr::scene::ISceneManager* newManager = 0)
{
    irr::scene::ISceneNodeAnimator * newCTAnim = new CSceneNodeAnimatorCameraTrackball(m_driver,m_cursorControl,m_radius, m_moveSpeed,m_rotateSpeed);
    return newCTAnim;
}


Le destructeur :

Code c++ :


CSceneNodeAnimatorCameraTrackball::~CSceneNodeAnimatorCameraTrackball()
{
    if(m_cursorControl)
    {
        m_cursorControl->drop();
    }
}



Puis donc mon main je l'utilise :

Code c++ :


    //Ajoute une camera
    irr::scene::ICameraSceneNode* cam = SceneManager->addCameraSceneNode(node_2, irr::core::vector3df(0,20,-30),irr::core::vector3df(0,0,0));
    CSceneNodeAnimatorCameraTrackball *cam_animator = new CSceneNodeAnimatorCameraTrackball(VideoDriver, Irr_Device->getCursorControl(), 50,4,6);

    cam->addAnimator(cam_animator);
    cam_animator->drop();



Et après compilation cela ne fonction pas... D'abord j'ai cru que c'était la partie OnEvent mais après test cela s'avère faux.
Quelqu'un aurait il une piste ?

Merci,
RVM

Hors ligne


#1 

02-04-2012 23:47:15

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Est-ce que ça marchait avant de rajouter createclone et le destructeur?


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


#2 

03-04-2012 09:06:22

RVM
Membre
Date d'inscription: 08-08-2010
Messages: 20

Même sans rajouter createclone et le destructeur sa ne marchait pas.
Par contre, d'après mes tests, s'est dans le OnEvent qu'il y a le problème : les conditions ne passent pas...

Edit :
Les conditions case irr::EMIE_LMOUSE_PRESSED_DOWN:, case irr::EMIE_LMOUSE_LEFT_UP:, case irr::EMIE_MOUSE_WHEEL: ne passent  pas.

RVM

Dernière modification par RVM (03-04-2012 10:25:01)

Hors ligne


#3 

03-04-2012 10:24:36

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Bon, j'ai trouvé le tuto dont tu me parlais(Tuto SDZ).
Comme je te l'ai dit l'autre fois, "mets ton code!". Parce que, trouver un problème dans ton OnEvent sans en avoir le code... Et donne aussi les liens lorsque tu cites une source. Les personnes qui passent pour aider n'ont pas forcément le temps de chercher comme je viens de le faire. Si tu ne donnes pas assez d'informations, celui qui n'a pas le temps ne répondra pas alors que, s'il avait eu les bonnes infos, il aurait peut-être résolu ton problème.

Je n'essaie pas d'être désagréable mais pour ceux qui aident, il est bien plus agréable de le faire quand la personne explique correctement son problème. Donc un texte explicatif de ce qui se passe(ou se passe pas^^), une ou des images pour ilustrées si besoin et SURTOUT du CODE serait le bien venu. Par contre, pour ton écriture, c'est parfait wink .

Sur ce, au prochain post.


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 

03-04-2012 10:46:57

RVM
Membre
Date d'inscription: 08-08-2010
Messages: 20

johnplayer :

Bon, j'ai trouvé le tuto dont tu me parlais(Tuto SDZ).
Comme je te l'ai dit l'autre fois, "mets ton code!". Parce que, trouver un problème dans ton OnEvent sans en avoir le code... Et donne aussi les liens lorsque tu cites une source. Les personnes qui passent pour aider n'ont pas forcément le temps de chercher comme je viens de le faire. Si tu ne donnes pas assez d'informations, celui qui n'a pas le temps ne répondra pas alors que, s'il avait eu les bonnes infos, il aurait peut-être résolu ton problème.

Je n'essaie pas d'être désagréable mais pour ceux qui aident, il est bien plus agréable de le faire quand la personne explique correctement son problème. Donc un texte explicatif de ce qui se passe(ou se passe pas^^), une ou des images pour ilustrées si besoin et SURTOUT du CODE serait le bien venu. Par contre, pour ton écriture, c'est parfait ;) .

Sur ce, au prochain post.


Je comprends complétement et je m'excuse de cette oublie d'information.

Mon code OnEvent (un peu modifié par rapport au tuto) :

Code c++ :


bool CSceneNodeAnimatorCameraTrackball::OnEvent(const irr::SEvent& event)
{
    plog->Write("Event On");

    if(event.EventType == irr::EET_MOUSE_INPUT_EVENT)
    {
        plog->Write("Mouse IN");
        switch(event.MouseInput.Event)
        {
        case irr::EMIE_LMOUSE_PRESSED_DOWN:
            {
                plog->Write("LMOUSE Down");
                this->m_isPressed = true;
                return true;
            }
        case irr::EMIE_LMOUSE_LEFT_UP:
            {
                plog->Write("LMOUSE Left");
                this->m_isPressed = false;
                return true;
            }
        case irr::EMIE_MOUSE_WHEEL:
            {
                plog->Write("MOUSE Wheel");
                if ( event.MouseInput.Wheel > 0 )
                    {
                        m_radius -= 1.0f * m_moveSpeed;
                    }
                else
                    {
                        m_radius += 1.0f * m_moveSpeed;
                    }
                this->m_wheel = true;
                return true;
            }
        case irr::EMIE_MOUSE_MOVED:
            {
                if (this->m_isPressed == false)
                {
                    this->m_cursorPos = this->m_cursorControl->getRelativePosition();
                    return true;
                }
                    // if the left button is pressed, then we get the change and
                    // set the rotation vector. And update the position
                else if (this->m_isPressed == true)
                {
                    m_cursorMove = m_cursorControl->getRelativePosition() - m_cursorPos;
                    m_rotation.X += m_cursorMove.X * m_rotateSpeed;
                    m_rotation.Y += m_cursorMove.Y * m_rotateSpeed;
                        // check the Y change to prevent vertical looping
                    if (m_rotation.Y >= MAXANGLE) { m_rotation.Y = MAXANGLE; }
                    else if (m_rotation.Y <= -MAXANGLE) { m_rotation.Y = -MAXANGLE; }
                    m_cursorPos = m_cursorControl->getRelativePosition();
                    return true;
                }
            }
        }
    }
    plog->Write("Event End");
    return false;   // event not proceeded
}


plog est une class pour log.

Mais je pense que le problème vient d'autre par car j'ai testé un CodeSnipet (Camera RPG (http://irrlicht.sourceforge.net/forum/v … mp;t=45607)) et sa ne fonctionne toujours pas...
Mon main au cas où : http://pastebin.com/DvV4Lwre

Merci de l'aide,
RVM

Hors ligne


#5 

03-04-2012 14:29:10

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Je ne vois aucune erreur mais d'après ce que j'ai compris : ton code compile, le programme tourne sans planter mais l'appui sur les touches ne fait rien.
Pour voir si c'est pas la souris qui pose problème, mets ton event en commentaire et essaie celui-ci:

Code:

bool CSceneNodeAnimatorCameraTrackball::OnEvent(const irr::SEvent& event)
{
    plog->Write("Event On");

    if (event.EventType == irr::EET_KEY_INPUT_EVENT)
    {
            switch(event.KeyInput.Key)
            {
                case irr::KEY_ESCAPE:
                    //
                return true;

                case irr::KEY_KEY_A:
                {
            plog->Write("Le bouton 'A' a bien été actionné.");
                    //
            if(event.KeyInput.PressedDown) this->m_isPressed = true;
            else this->m_isPressed = false;
                }
                return true;
            default:
            return true;
        }
    }


    if(event.EventType == irr::EET_MOUSE_INPUT_EVENT)
    {
        plog->Write("Mouse IN");
        switch(event.MouseInput.Event)
        {
    /**
        case irr::EMIE_LMOUSE_PRESSED_DOWN:
            {
                plog->Write("LMOUSE Down");
                this->m_isPressed = true;
                return true;
            }
        case irr::EMIE_LMOUSE_LEFT_UP:
            {
                plog->Write("LMOUSE Left");
                this->m_isPressed = false;
                return true;
            }
    **/
        case irr::EMIE_MOUSE_WHEEL:
            {
                plog->Write("MOUSE Wheel");
                if ( event.MouseInput.Wheel > 0 )
                    {
                        m_radius -= 1.0f * m_moveSpeed;
                    }
                else
                    {
                        m_radius += 1.0f * m_moveSpeed;
                    }
                this->m_wheel = true;
                return true;
            }
        case irr::EMIE_MOUSE_MOVED:
            {
                if (this->m_isPressed == false)
                {
                    this->m_cursorPos = this->m_cursorControl->getRelativePosition();
                    return true;
                }
                    // if the left button is pressed, then we get the change and
                    // set the rotation vector. And update the position
                else if (this->m_isPressed == true)
                {
                    m_cursorMove = m_cursorControl->getRelativePosition() - m_cursorPos;
                    m_rotation.X += m_cursorMove.X * m_rotateSpeed;
                    m_rotation.Y += m_cursorMove.Y * m_rotateSpeed;
                        // check the Y change to prevent vertical looping
                    if (m_rotation.Y >= MAXANGLE) { m_rotation.Y = MAXANGLE; }
                    else if (m_rotation.Y <= -MAXANGLE) { m_rotation.Y = -MAXANGLE; }
                    m_cursorPos = m_cursorControl->getRelativePosition();
                    return true;
                }
            }
        }
    }
    plog->Write("Event End");
    return false;   // event not proceeded
}

Si le bouton A n'a aucun effet, il faut peut-être voir à ce niveau du code :
"Comme nous l'avons vu plus haut, il est indispensable de redéfinir isEventReceiverEnabled pour indiquer au node auquel est attaché l'animator, que celui-ci doit bien recevoir les events."
Il en parle dans le tuto juste avant le paragraphe "Implémentation de la caméra".

Je compte me créer une camera personnelle aussi mais ce n'est pas encore au programme donc je vais avoir du mal a t'aider.

PS : Sinon tu peux aussi attacher ton animator à un ISceneNode avec un mesh et regarder comment le mesh se comporte.


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


#6 

03-04-2012 16:09:52

RVM
Membre
Date d'inscription: 08-08-2010
Messages: 20

J'ai testé ton code et l'action de la touche A fonctionne. Et j'ai trouvé pourquoi :
J'ai définit un EventReceiver que je set lors de la création de mon device. Mon EventReceiver prenait en compte les event de la souris et passait en priorité par rapport au eventreceiver de l'animator.
Mais je comprends pas pourquoi, mon event prend le pas sur le second que sur les boutons de la souris et pas sur la position.  Faudrait que le look le code source d'irrlicht de plus près.

Merci de l'aide johnplayer,
RVM

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
880 membres
1424 sujets
11113 messages
Dernier membre inscrit: mandrifidy
25 invités en ligne
Aucun membre connecté
RSS Feed