#1 

10-11-2008 03:42:44

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.46
Courriel

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...


Hors ligne


#2 

10-11-2008 06:31:56

ramis
Membres
Date d'inscription:
Messages: 92
IP: 92.133.110.184
Courriel

Hors ligne


#3 

10-11-2008 10:46:15

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.46
Courriel

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


#4 

11-11-2008 01:47:59

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.46
Courriel

up


Hors ligne


#5 

11-11-2008 08:39:22

ramis
Membres
Date d'inscription:
Messages: 92
IP: 92.133.110.184
Courriel

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/viewtopic.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


#6 

11-11-2008 09:56:15

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 90.56.146.231
Courriel

ramis Ecris:

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
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
wink


Force et sagesse...

Hors ligne


#7 

11-11-2008 11:47:27

ramis
Membres
Date d'inscription:
Messages: 92
IP: 92.133.110.184
Courriel

merci pour ton code tmyke big_smile
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 big_smile

Hors ligne


#8 

11-11-2008 11:51:27

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 90.56.146.231
Courriel

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


#9 

11-11-2008 12:15:58

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.46
Courriel

finalement jai développez la mienne si sa interrese quelqun


Hors ligne


#10 

11-11-2008 12:19:14

ramis
Membres
Date d'inscription:
Messages: 92
IP: 92.133.110.184
Courriel

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

merci beaucoup à tmyke , en tout cas !

Hors ligne


#11 

11-11-2008 12:23:02

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.46
Courriel

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


Hors ligne


#12 

11-11-2008 12:32:36

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.46
Courriel

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


Hors ligne


#13 

11-11-2008 12:59:05

ramis
Membres
Date d'inscription:
Messages: 92
IP: 92.133.110.184
Courriel

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--' :

-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 ???)

Hors ligne


#14 

11-11-2008 13:00:09

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.46
Courriel

moi je dit faudrai ouvrire une categorie aide - camera xD


Hors ligne


#15 

11-11-2008 13:13:18

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 90.56.146.231
Courriel

ramis Ecris:

(par contre j'ai toujours un bug avec la camera NWM :
-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 Ecris:

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


#16 

11-11-2008 13:22:01

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.46
Courriel

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


Hors ligne


#17 

11-11-2008 13:47:50

ramis
Membres
Date d'inscription:
Messages: 92
IP: 92.133.110.184
Courriel

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


#18 

11-11-2008 13:48:07

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 90.56.146.231
Courriel

pspmy Ecris:

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 Ecris:

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 Ecris:

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


#19 

11-11-2008 13:53:17

ramis
Membres
Date d'inscription:
Messages: 92
IP: 92.133.110.184
Courriel

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


#20 

11-11-2008 15:40:08

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.46
Courriel

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


Hors ligne


#21 

11-11-2008 17:47:52

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 90.56.146.231
Courriel

ç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


#22 

11-11-2008 18:10:19

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.46
Courriel

aufait esque je peut postuler pour etre moderateur ?


Hors ligne


#23 

11-11-2008 18:25:21

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 90.56.146.231
Courriel

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


#24 

11-11-2008 18:29:16

hardcpp
Membres
Avatar de hardcpp
Date d'inscription:
Messages: 229
IP: 83.198.244.46
Courriel

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


#25 

11-11-2008 19:08:13

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 90.56.146.231
Courriel

pspmy Ecris:

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 Ecris:

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é
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
119 invités en ligne
membre en ligne: -
RSS Feed