Merci à vous deux pour vos réponses.
noals->j'ai regardé ton lien je suppose que ça marche mais je n'ai pas testé car ça marchait déjà.
dark_calculator->en effet désolé de ne pas avoir regardé avant
J'ai repris le code de nilska(voir topic rotation / déplacement) et l'ai modifié selon les besoins de mon modèle et de mes attributs.
Ma classe donne ça au final:
#ifndef IR_EVENTRECIEVER
#define IR_EVENTRECEIVER
#include <iostream>
#include <IRR/irrlicht.h>
using namespace std;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
class IR_EventReceiver : public IEventReceiver
{
public:
IR_EventReceiver(ISceneNode *Nmodele)
{
m_Nmodele = Nmodele;
for(int i = 0; i < 4; i++)
{
m_isMoving[i] = false;
}
}
virtual bool OnEvent(const SEvent &event) //capte les événements et met à jour les attributs
{
if(m_Nmodele != 0 && event.EventType == EET_KEY_INPUT_EVENT)
{
switch (event.KeyInput.Key)
{
case KEY_KEY_Z:
m_isMoving[AVANT] = event.KeyInput.PressedDown;
return true;
case KEY_KEY_S:
m_isMoving[ARRIERE] = event.KeyInput.PressedDown;
return true;
case KEY_KEY_Q:
m_isMoving[GAUCHE] = event.KeyInput.PressedDown;
return true;
case KEY_KEY_D:
m_isMoving[DROITE] = event.KeyInput.PressedDown;
return true;
}
}
return false;
}
void manageEvents() //gère les événements
{
matrix4 Mat;
vector3df v = m_Nmodele->getPosition();
vector3df r = m_Nmodele->getRotation();
if (m_isMoving[AVANT])
{
r.Y += 90;
Mat.setRotationDegrees(r);
vector3df Target(5,0,0);
Mat.transformVect(Target);
vector3df NewPos = m_Nmodele->getPosition();
NewPos += Target;
m_Nmodele->setPosition(NewPos);
}
else if (m_isMoving[ARRIERE])
{
r.Y += 90;
Mat.setRotationDegrees(r);
vector3df Target(-2,0,0);
Mat.transformVect(Target);
vector3df NewPos=m_Nmodele->getPosition();
NewPos += Target;
m_Nmodele->setPosition(NewPos);
}
if (m_isMoving[GAUCHE])
{
r.Y -= 3;
m_Nmodele->setRotation(r);
}
else if (m_isMoving[DROITE])
{
r.Y += 3;
m_Nmodele->setRotation(r);
}
}
private:
enum {AVANT, ARRIERE, GAUCHE, DROITE}; //directions du modèle
bool m_isMoving[4]; //tableau de bool pour connaître la direction du mouvement
ISceneNode *m_Nmodele; //le scene node auquel on applique la gestion des événements
};
#endif
Il manque une chose pour que le programme fonctionne pleinement: il faut que la caméra suive le modèle dans ses rotations et déplacements:
je suis allé fouiner dans la doc:
"doc" Ecris:
virtual ICameraSceneNode* irr::scene::ISceneManager::addCameraSceneNodeFPS ( ISceneNode * parent = 0,
f32 rotateSpeed = 100.0f,
f32 moveSpeed = 500.0f,
s32 id = -1,
SKeyMap * keyMapArray = 0,
s32 keyMapSize = 0,
bool noVerticalMovement = false,
f32 jumpSpeed = 0.f
) [pure virtual]
Parameters:
parent,: Parent scene node of the camera. Can be null.
donc j'ai déclaré ma caméra ainsi dans le main: ICameraSceneNode *camera = sceneManager->addCameraSceneNodeFPS(Nf50);
ça marche mais je me retrouve au centre du modele :p
J'ai essayé d'initialiser la caméra à une position donnée mais dès que l'on bouge le modèle elle se place au centre de celui-ci.
On peut faire à chaque tour de boucle:
camera->setTarget(Nf50->getPosition());
mais ça ne résout pas le problème du placement à l'arrière du mesh.
Voilà y à t-il moyen de toujours placer la caméra derrière le model autrement qu'en testant la rotation de celui-ci (ce qui serait d'ailleurs lourd et peu agréable à utiliser) ?