Accueil > Forum > > > > Probleme de rotation
Probleme de rotation
mardi 14 février 2006 à 12:19:45 |
Probleme de rotation

Mick7
|
bon voila je veux faire une camera comme dans un fps le probleme c'est que je ne sait pas comment on fait des rotation autour des axes x et y de la camera car mes rotation s'effectuent autour des axes de la carte
|
|
mardi 14 février 2006 à 12:28:53 |
Re : Probleme de rotation

wxccxw
|
ah les math :) j'espere que tu est tres bon en math :p et tres bon en OpenGL/D3d mais je vais te filer un truc tout fait :)
|
|
mardi 14 février 2006 à 12:30:14 |
Re : Probleme de rotation

wxccxw
|
#include"CCamera.h"
CCamera::CCamera() { // Initialize variables... mPos = CVector4(0.0f, 0.0f, 0.0f); mView = CVector4(0.0f, 0.0f, 0.0f); mUp = CVector4(0.0f, 0.0f, 0.0f); mStrafe = CVector4(0.0f, 0.0f, 0.0f);
currentRotationAngle = 0.0f; }
void CCamera::SetCamera(float x, float y, float z, float xv, float yv, float zv, float xu, float yu, float zu) { // Here we set the camera to the values sent in to us. This is mostly used to set up a // default position. mPos = CVector4(x, y, z); mView = CVector4(xv, yv, zv); mUp = CVector4(xu, yu, zu); }
void CCamera::GetDirection(CVector4 &Direction) { // The look direction is the view (where we are looking) minus the position (where we are). Direction = mView - mPos; }
void CCamera::MoveCamera(float speed) { // Moving the camera requires a little more then adding 1 to the z or subracting 1. // First we need to get the direction at which we are looking. CVector4 Direction;
// Get the direction and store it in the object Direction. GetDirection(Direction);
Direction.Normal();
// Call UpdateCamera to move our camera in the direction we want. UpdateCamera(Direction, speed);
// NOTE if the camera moves too slow try increasing the UP and DOWN values in the header. // The camera is frame based so it will move differently for you. }
void CCamera::UpdateCamera(CVector4 Direction, float speed) { // Move the camera on the X and Z axis. mPos.x += Direction.x * speed; mPos.y += Direction.y * speed; mPos.z += Direction.z * speed;
// Move the view along with the position mView.x += Direction.x * speed; mView.y += Direction.y * speed; mView.z += Direction.z * speed; }
void CCamera::StrafeCam(float speed) { CalculateStrafe(); // Calculate the straft direction. UpdateCamera(mStrafe, speed); // Then add it to the camera's position. }
void CCamera::CalculateStrafe() { CVector4 Direction; CVector4 Cross; float magnitude = 0.0;
// Strafing is just like moving the camera forward and backward. First we will get the // direction we are looking. GetDirection(Direction);
// Now if we were to call UpdateCamera() we will be moving the camera foward or backwards. // We don't want that here. We want to strafe. To do so we have to get the cross product // of our direction and Up direction view. The up was set in SetCamera to be 1 positive // y. That is because anything positive on the y is considered up. After we get the // cross product we can save it to the strafe variables so that can be added to the // camera using UpdateCamera().
// Get the cross product of the direction we are looking and the up direction. Cross.CrossProduct(Direction, mUp);
// Normalize it. Cross.Normal();
// Save our strafe (cross product) values in the mStrafe object. mStrafe = Cross; }
void CCamera::RotateCamera(float AngleDir, CVector4 Speed) { CVector4 newDir; CVector4 LookDirection; float CosineAngle, SineAngle = 0.0;
// First we will need to calculate the cos and sine of our angle. I created two macros to // do this in the CCamera.h header file called GET_COS and GET_SINE. To use the macros // we just send in the variable we ant to store the results and the angle we need to // calculate. GET_COS(CosineAngle, AngleDir); GET_SINE(SineAngle, AngleDir);
// Next get the look direction (where we are looking) just like in the move camera function. GetDirection(LookDirection);
// Calculate the new X position. newDir.x = (CosineAngle + (1 - CosineAngle) * Speed.x) * LookDirection.x; newDir.x += ((1 - CosineAngle) * Speed.x * Speed.y - Speed.z * SineAngle)* LookDirection.y; newDir.x += ((1 - CosineAngle) * Speed.x * Speed.z + Speed.y * SineAngle) * LookDirection.z;
// Calculate the new Y position. newDir.y = ((1 - CosineAngle) * Speed.x * Speed.y + Speed.z * SineAngle) * LookDirection.x; newDir.y += (CosineAngle + (1 - CosineAngle) * Speed.y) * LookDirection.y; newDir.y += ((1 - CosineAngle) * Speed.y * Speed.z - Speed.x * SineAngle) * LookDirection.z;
// Calculate the new Z position. newDir.z = ((1 - CosineAngle) * Speed.x * Speed.z - Speed.y * SineAngle) * LookDirection.x; newDir.z += ((1 - CosineAngle) * Speed.y * Speed.z + Speed.x * SineAngle) * LookDirection.y; newDir.z += (CosineAngle + (1 - CosineAngle) * Speed.z) * LookDirection.z;
// Last we add the new rotations to the old view to correctly rotate the camera. mView = mPos + newDir; }
void CCamera::RotateByMouse(int mousePosX, int mousePosY, int midX, int midY) { float yDirection = 0.0f; // Direction angle. float yRotation = 0.0f; // Rotation angle.
// If the mouseX and mouseY are at the middle of the screen then we can't rotate the view. if((mousePosX == midX) && (mousePosY == midY)) return;
// Next we get the direction of each axis. We divide by 1000 to get a smaller value back. yDirection = (float)((midX - mousePosX)) / 1000.0f; yRotation = (float)((midY - mousePosY)) / 1000.0f;
// We use curentRotX to help use keep the camera from rotating too far in either direction. currentRotationAngle -= yRotation;
// Stop the camera from going to high... if(currentRotationAngle > 1.5f) { currentRotationAngle = 1.5f; return; }
// Stop the camera from going to low... if(currentRotationAngle < -1.5f) { currentRotationAngle = -1.5f; return; }
// Next we get the axis which is a perpendicular vector of the view direction and up values. // We use the cross product of that to get the axis then we normalize it. CVector4 Axis; Axis.CrossProduct(mView - mPos, mUp); Axis.Normal();
// Rotate the camera. RotateCamera(yRotation, CVector4(Axis.x, Axis.y, Axis.z)); RotateCamera(yDirection, CVector4(0, 1, 0)); }
|
|
mardi 14 février 2006 à 12:30:54 |
Re : Probleme de rotation

wxccxw
|
la haut ct CCamera.cpp et la CCamera.H
#ifndef CCAMERA_H #define CCAMERA_H
#include // Math header that allows us to use cos() and sin(). #include"CVector.h" // CVector3 class.
#define FORWARD 1.0 // Forward speed. #define BACKWARD -1.0 // Backward speed. #define UP 0.03 // Up speed. #define DOWN -0.03 // Down speed. #define LEFT 0.03 // Left speed. #define RIGHT -0.03 // Right speed. #define STRAFE_LEFT -1.0 // Left straft speed. #define STRAFE_RIGHT 1.0 // Right straft speed.
#define GET_COS(a, b) a = (float)cos(b) // Get the cos angle of b and store it in a. #define GET_SINE(a, b) a = (float)sin(b) // Get the sine angle of b and store it in a.
class CCamera { public: CCamera(); // Constructor.
void SetCamera(float x, float y, float z, // Set the camera's position. float xv, float yv, float zv, float xu, float yu, float zu);
void GetDirection(CVector4 &Direction); // Get the view direction. void MoveCamera(float speed); // Move the camera forwards and backwards. void UpdateCamera(CVector4 Direction, float speed);// Update the camera's position. void StrafeCam(float speed); void CalculateStrafe(); // Calculate the direction of the straft. void RotateCamera(float AngleDir, CVector4 Speed); // Rotate the camera around a point. void RotateByMouse(int mousePosX, int mousePosY, int midX, int midY);
CVector4 mPos; // Camera position. CVector4 mView; // Look at position. CVector4 mUp; // Up direction. CVector4 mStrafe; // Strafe direction. float currentRotationAngle; // Keeps us from going too far up or down. };
#endif
|
|
mardi 14 février 2006 à 12:32:06 |
Re : Probleme de rotation

wxccxw
|
http://www.ultimategameprogramming.com/zips/Gl_BspLoader.ZIP
et le lien complet : Camera Style FPS, BSP loader (les maps BSP), texture et lumiere
|
|
mardi 14 février 2006 à 19:41:38 |
Re : Probleme de rotation

Mick7
|
je vais essayer de comprendre mais en faite j'aimerai bien tester le loader mais je sais pas comment on link GLext.h
|
|
mercredi 15 février 2006 à 12:31:02 |
Re : Probleme de rotation

wxccxw
|
Tu telecharge OpenGL sur le site tu dezip les .h dans ton dossier Include, et les .lib dans le dossier lib ;)
apres #include <GLext.h> et pour openGl lib si tu est sous VC++ tu fais #pragma comment(lib,"ta lib.lib")
sinon Projet->Option->Liens-> et tu ajout le opengl.lib
|
|
jeudi 16 février 2006 à 14:05:56 |
Re : Probleme de rotation

Mick7
|
Le probleme c'est que j'ai pas VC++ mais Dev-c++ si quelqu'un sait comment on link cette librairie... Et sinon je voudrai juste qu'on m'explique mathematiquement comment on change de repere, c'est plus interessant que d'avoir un truc deja tout pret.
|
|
vendredi 21 juillet 2006 à 17:23:27 |
Re : Probleme de rotation

gouessej
|
Bonjour Juste un petit rappel. Le code que l'on t'a proposé fonctionnera pleinement si tu te contentes vraiment de tourner autour de 2 axes mais si un jour, tu veux faire tourner un objet en fonction de 3 axes, cette méthode ne marche pas. C'est due à une limitation de l'utilisation des transformations Eulériennes. Cette limitation est appelée "verrou de Cardan" et aussi "gimbal lock". J'ai eu beaucoup de problème à cause de ça et il y a un tas d'inepsies qui circulent sur le net à propos des façons de résoudre ce problème. Alors, si ça t'intéresse, fais moi signe (je précise que j'ai fait vérifier mes travaux par plusieurs professeurs d'informatique graphique).  yeah! vive java 
|
|
Cette discussion est classée dans : probleme, rotation, camera, autour, axes
Répondre à ce message
Sujets en rapport avec ce message
camera [ par un4given ]
Bonjour a tous !Bon je suis bien conscient que ce sujet a été traité 1000 fois mais le probleme c'est que c'est 1000 fois d'une facon differente et me
pb de camera [ par mauvaisdawa ]
je suis sur un projet de simulation d'helicoptère. j'ai un probleme concernant mes caméras. celle du dessus, ya aucun probleme, mais celle de derrière
Problème : rotation d'une camera [ par bathof ]
Bonjour,Je suis en train de développer un jeu 3D de type HomeWorld2,malheureusement j'ai deux trois problèmes du coté de la camera.La caméra doit être
Rotation et origine [ par goutbouyo ]
Salut, Salut, Je veut faire une fonction réseau sur mon jeu, donc il faut que je représente les persos ennemies. Pour cela, je prends les coordonnés e
Modeleur 3d : Probleme de back spin ds l affichage (opengl/Qt) [ par serialtom ]
salut a tousje vous ecris car j ai un souci... je realise actuellement un modeleur 3d et j ai un problème avec l une de mes fonctions. je veux effectu
gestion camera [ par chucky_666 ]
Voila mon pb :je modelise un terrain 3D et g fixe une camera au dessus avec gluLookAt().Je me sert de la souris pour effectuer des rotation de la came
probleme de rotation [ par zizu89 ]
bjr tous le monde [^^happy13] j'ai un projet en opengl d'un rubiks cube j'ai commencé la creation des cube et je voulais tout d'abord le faire tourne
Probleme webcam [ par Bryan33 ]
[i][/i]Bonjours, J'ai une web cam logitech STX : je suis sue windows7,,je ne suis plus capable d'entrer ds des chat qui se serve de camfrog ? l'image
shell_notifyicon [ par simmet ]
Bonjour J'ai un probleme par rapport a la fonction shell_notifyicon j'arrive bien a mettre mon icone dans la systray mais des que je passe la souris d
Probleme lors de l'exécution en mode release dans QT [ par housie ]
Bonjour à tous [^^happy13] , Je suis sous windows et je construit une application Qt, dans mon programme j'ai installer un event filtre sur un QSlide
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|