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
http://forum.irrlicht.fr/viewtopic.php?id=416
un petit tour par là te sera utile
Hors ligne
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
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)
-------------- 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
ramis :
mais cData est bien un attribut de IEventReceiver ?non ?
En fait non
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
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
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
Hors ligne
merci pour ton code tmyke
Encore quelques erreurs mais je sens que ca va finir par marcher ^^
-------------- 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
Hors ligne
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é.
Hors ligne
finalement jai développez la mienne si sa interrese quelqun
Hors ligne
je veux bien voir comment tu as fait
parsque moi --'
merci beaucoup à tmyke , en tout cas !
Dernière modification par ramis (11-11-2008 13:19:24)
Hors ligne
event.h
#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
main.cpp
#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
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--' :
-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
moi je dit faudrai ouvrire une categorie aide - camera xD
Hors ligne
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 warningspourtant 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....
Hors ligne
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
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 ??
Hors ligne
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 ...
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.
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.
Hors ligne
et une autre idée : une new categorie : code snipet
Hors ligne
ç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...
Hors ligne
aufait esque je peut postuler pour etre moderateur ?
Hors ligne
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
Hors ligne
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.
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...)
Hors ligne