Historique des modifications - Message

Message #4040

Sujet: mouvements sacadés


Type Date Auteur Contenu
Création du message 21-05-2008 09:16:21 littleben
Voici mon fichier principal :

#include "stdafx.h"

#include <irrlicht.h>
#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <vector>
#include <exception>
#include <fstream>
#include <string>
#include "Fonctions.h"

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

#pragma comment(lib, "Irrlicht.lib")



IrrlichtDevice		*	Device			;
ISceneManager		*	Smgr			;
IVideoDriver		*	Driver			;
IGUIEnvironment		*	Guienv			;
IAnimatedMesh		*	MeshDecor		;
ISceneNode			*	Decor			;
IAnimatedMeshSceneNode			*	Drone			;
ICameraSceneNode	*	CameraExterne	;
ICameraSceneNode	*	CameraInterne	;
ICameraSceneNode	*	Cameras[2]		;
bool					PremierTour		;
int						Zoom			;
float					AngleMax		;


class MyEventReceiver : public IEventReceiver
{
public:
	virtual bool OnEvent(const SEvent& event)
	{
		if (Drone != 0 && event.EventType == irr::EET_KEY_INPUT_EVENT)
		{
			switch(event.KeyInput.Key)
			{
			case KEY_RIGHT:
			case KEY_LEFT :
				{
					MoveDrone (Device, Drone, 0, 0, (event.KeyInput.Key == KEY_RIGHT) ? -10.0f : 10.0f, 
						(event.KeyInput.Key == KEY_RIGHT) ? -1.0f : 1.0f, 0, 0, CameraExterne, CameraInterne, PremierTour, AngleMax) ;
				} 
				break ;

			case KEY_DOWN :
			case KEY_UP   :
				{
					MoveDrone (Device, Drone, (event.KeyInput.Key == KEY_UP) ? 10.0f : -10.0f, 0, 0, 
						0, 0,(event.KeyInput.Key == KEY_UP) ? 1.0f : -1.0f, CameraExterne, CameraInterne, PremierTour, AngleMax) ;
				} 
				break ;

			case KEY_NUMPAD8:
			case KEY_NUMPAD2:
				{
					MoveDrone (Device, Drone, 0, 0, 0, 
						0, (event.KeyInput.Key == KEY_NUMPAD8) ? 1.0f : -1.0f, 0, CameraExterne, CameraInterne, PremierTour, AngleMax) ;
				} 
				break ;

			case KEY_NUMPAD4:
			case KEY_NUMPAD6:
				{
					MoveDrone (Device, Drone, 0, (event.KeyInput.Key == KEY_NUMPAD6) ? 10.0f : -10.0f, 0, 
						0, 0, 0, CameraExterne, CameraInterne, PremierTour, AngleMax) ;
				} 
				break ;

			case KEY_ADD     :
				{
					if (Zoom < 6)
					{
						CameraInterne->setFOV ( CameraInterne->getFOV() - 0.174f) ;
						++Zoom;
					}
				}
				break ;

			case KEY_SUBTRACT:
				{
					if (Zoom > 0)
					{
						CameraInterne->setFOV ( CameraInterne->getFOV() + 0.174f) ;
						--Zoom;
					}
				}
				break ;

			case KEY_PRIOR     :
				{
					if (AngleMax > -180.0f)
					{	
						AngleMax -= 10.0f ;
						core::vector3df Target = CameraInterne->getTarget();
						core::vector3df PosCam = CameraInterne->getPosition();
						float Z = Target.Z - PosCam.Z;
						float Y = Z * tan (AngleMax/ 180 * 3.141592654f);
						core::vector3df RotCam = CameraInterne->getRotation();
						CameraInterne->setRotation (core::vector3df(RotCam.X - 10.0f, 0.0f, 0.0f)) ;
						CameraInterne->setTarget (core::vector3df (Target.X, Y, Target.Z));
						cout << AngleMax << endl;
					}
				}
				break ;

			case KEY_NEXT     :
				{
					if (AngleMax < 180.0f)
					{
						AngleMax += 10.0f ;
						core::vector3df RotCam = CameraInterne->getRotation();
						CameraInterne->setRotation (core::vector3df(RotCam.X + 10.0f, 0.0f, 0.0f)) ;
						cout << AngleMax << endl;
					}
				}
				break ;

			case KEY_KEY_A :
				{
					core::vector3df posix = Drone->getRotation();
					cout << posix.X << " " << posix.Y << " " << posix.Z << endl;
				}


			}
			if(event.KeyInput.PressedDown)
				PremierTour = false ;
			else
			{
				PremierTour = true ;
				core::vector3df posDrone = Drone->getRotation();
				Drone->setRotation (core::vector3df(0, posDrone.Y, 0));
				CameraInterne->setRotation(Drone->getRotation());
			}
			return true;
		}

		return false;
	}
};







int main (void)
{
	

	VInt_t VI = Resolution ();

	MyEventReceiver Receiver;

	Device = createDevice( video::EDT_OPENGL, dimension2d<s32>(VI[0],VI[1]), 32,
			false, false, false, &Receiver);
	Smgr = Device->getSceneManager() ;
	Driver = Device->getVideoDriver();
	Guienv = Device->getGUIEnvironment();

	Driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);
	ISceneNode * Box= Smgr->addSkyBoxSceneNode(
	Driver->getTexture("../../../media/irrlicht2_up.jpg"),
	Driver->getTexture("../../../media/irrlicht2_dn.jpg"),
	Driver->getTexture("../../../media/irrlicht2_lf.jpg"),
	Driver->getTexture("../../../media/irrlicht2_rt.jpg"),
	Driver->getTexture("../../../media/irrlicht2_ft.jpg"),
	Driver->getTexture("../../../media/irrlicht2_bk.jpg"));
	Driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true);
	Box->setScale(core::vector3df (10.0f,10.0f,10.0f));

	IAnimatedMesh* Mesh = Smgr->getMesh("../../media/drone.x");
	Drone = Smgr-> addAnimatedMeshSceneNode (Mesh);
	Drone->setMaterialFlag(EMF_LIGHTING, false);
	Drone->setMaterialTexture( 0, Driver->getTexture("../../../media/drone.bmp") );
	Drone->setPosition (core::vector3df (0, 0, 0)); 
	Drone->setScale (core::vector3df (0.02f, 0.02f, 0.02f));
	Drone->setMaterialFlag(EMF_LIGHTING, true);
	Drone->getMaterial(0).EmissiveColor.set(0,0,0,0);

	/*Drone = Smgr->addCubeSceneNode(50.0f, 0, -1, core::vector3df(0,0,0), core::vector3df(0,0,0)) ;
	Drone->setMaterialTexture(0, Driver->getTexture("../../media/t351sml.jpg"));
	Drone->setMaterialFlag(video::EMF_LIGHTING, false);*/

	CreateCameras (Smgr, Drone, Cameras) ;
	CameraExterne = Cameras[0] ;
	CameraInterne = Cameras[1] ;

	VRect_t VR = SplitScreen() ;

	PremierTour = true ;
	Zoom = 0;
	AngleMax = 0;

	IAnimatedMesh* mesh = Smgr->getMesh("../../media/sydney.md2");
    IAnimatedMeshSceneNode* node = Smgr->addAnimatedMeshSceneNode( mesh );
	node->setMaterialFlag(EMF_LIGHTING, false);
	node->setFrameLoop(0, 310);	
	node->setMaterialTexture( 0, Driver->getTexture("../../media/sydney.bmp") );
	node->setPosition (core::vector3df (0, 0, 100.0f)); 

	CreateCollision (node, mesh, Smgr, Drone);

	core::vector3df pos = Drone->getPosition();
	core::vector3df rot = Drone->getRotation();
	cout << pos.X << " " << pos.Y << " " << pos.Z << endl;
	cout << rot.X << " " << rot.Y << " " << rot.Z << endl;

	while(Device->run())
	{
		Driver->setViewPort(rect<s32>(0,0,VI[0],VI[1]));
		Driver->beginScene(true, true, SColor(255,100,101,140));

		Smgr->setActiveCamera(CameraExterne);
        Driver->setViewPort(VR[0]);
        Smgr->drawAll();

		Driver->setViewPort(VR[1]);
        Smgr->setActiveCamera(CameraInterne);
        Driver->setViewPort(VR[1]);
        Smgr->drawAll();

		Guienv->drawAll();

		Driver->endScene();
	}
	Device->drop();

	return 0;
}








voici les fonctions qui m'intéressent en question :

	void MoveCameras (ISceneNode * Drone, 
		ICameraSceneNode * CameraExterne, ICameraSceneNode * CameraInterne, float CameraRotation)
	{
		core::vector3df PosDrone = Drone->getPosition();
		CameraExterne->setTarget (PosDrone);

		CameraInterne->setPosition(PosDrone);
		core::vector3df RotDrone = Drone->getRotation();
		CameraInterne->setRotation(core::vector3df( RotDrone.X + CameraRotation, RotDrone.Y, RotDrone.Z));

	} // MoveCameras()



	void MoveDrone (IrrlichtDevice * Device, scene::ISceneNode* Drone, 
		int VRotationX, int VRotationY, int VRotationZ, 
		int VTranslationX, int VTranslationY, int VTranslationZ,
		ICameraSceneNode * CameraExterne, ICameraSceneNode * CameraInterne, 
		bool PremierTour, float CameraRotation)
	{
		static u32 lastTime, Time;

		if (PremierTour)
		{
			lastTime = 0;
			Time = 0;
		}
		else
		{
			Time = Device->getTimer()->getRealTime();
		}
		
		core::vector3df v = Drone->getPosition();

		core::vector3df vr = Drone->getRotation();

		if (vr.X >= 10.0f || vr.X <= -10.0f)
			VRotationX = 0;
		if (vr.Z >= 10.0f || vr.Z <= -10.0f)
			VRotationZ = 0;

		float vrRadY = -vr.Y / 180 * 3.141592654f;

		float CosTargetX = cos (vrRadY + (3.14f/2.0f));
		float SinTargetZ = sin (vrRadY + (3.14f/2.0f));

		float CosLateralX = cos ((vrRadY + (3.14f)));
		float SinLateralZ = sin ((vrRadY + (3.14f)));

		v.X += ( ((float) VTranslationZ * CosTargetX + CosLateralX * (float) VTranslationX ) * 50.0f) * ( (Time - lastTime) / 1000.0f);
		v.Y += ( ((float) VTranslationY) * 50.0f) * ( (Time - lastTime) / 1000.0f);
		v.Z += ( ((float) VTranslationZ * SinTargetZ + SinLateralZ * (float) VTranslationX ) * 50.0f) * ( (Time - lastTime) / 1000.0f);

		vr.X += ((float) VRotationX); //( ((float) VRotationX) * 360.0f) * ( (Time - lastTime) / 1000.0f);
		vr.Y += ((float) VRotationY); //( ((float) VRotationY) * 360.0f) * ( (Time - lastTime) / 1000.0f);
		vr.Z += ((float) VRotationZ); //( ((float) VRotationZ) * 360.0f) * ( (Time - lastTime) / 1000.0f);
		
		cout << vr.Y << endl;

		Drone->setPosition(v);
		Drone->setRotation(vr);

		if (PremierTour) 
		{
			Time = Device->getTimer()->getRealTime();
		}

		lastTime = Time ;

		MoveCameras (Drone, CameraExterne, CameraInterne, CameraRotation) ;

	} // MoveDrone()


	void CreateCollision (ISceneNode * Decor, IAnimatedMesh * Mesh, ISceneManager* Smgr, scene::ISceneNode * Drone)
	{
		scene::ITriangleSelector* selector = 
			Smgr->createOctTreeTriangleSelector(Mesh->getMesh(0), Decor, 128);

			Decor->setTriangleSelector(selector);
		
		selector->drop();

		scene::ISceneNodeAnimator* anim = 
			Smgr->createCollisionResponseAnimator(
			selector, Drone, core::vector3df(30,50,30),
			core::vector3df(0,0,0), core::vector3df(0,50,0));

		Drone->addAnimator(anim);

		anim->drop();

	} // CreateCollision()

A noter que ce n'est encore qu'une ébauche.

Retour

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
239 invités en ligne
membre en ligne: -
RSS Feed