Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1503 connectés 

  FORUM HardWare.fr
  Programmation

  [OpenGL/C++] Gestion de caméra

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[OpenGL/C++] Gestion de caméra

n°79941
Tetedeienc​h
Head Of God
Posté le 10-12-2001 à 00:22:39  profilanswer
 

Je galère depuis plus de 2 jours la dessus... merci de m'aider !
 
En fait, il me faudrait juste une chtite fonction ...
 
Un truc qui doit etre couru en +, mais j'ai rien trouvé.
 
Il me faudrait une fonction qui prenne en compte la position actuelle de la caméra (donc x , y , z ) , son futur changement(via deltaX, DeltaY, DeltaAngle) , et qui fasse le changement de plan...
 
Donc comme OpenGL n'a pas de caméra, il me faudrait une fonction qui calcule la transformation inverse ds objets...
 
En gros, on fait reculer les objets pour avoir l'illusion qu'elle avance...
 
Bref, en fait, juste 3 fonctions mathématiques calculant la nouvelle position de la cam. via un delta X, Y et angle de vue  me seraient utiles ...
 
Merci d'avance ! (je préfèrerais le code qd mm ;) )
 
PS : avancer reculer une caméra j'y arrive sans probs via une trasnlation inverse du reste... idem gauche/droite.
 
Mais calculer la nouvelle position de la caméra alors que l'on a regardé a 30° vers le haut et qu'on a avancé ben... dur dur dur :/

 

[edtdd]--Message édité par Tetedeiench--[/edtdd]


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
mood
Publicité
Posté le 10-12-2001 à 00:22:39  profilanswer
 

n°79950
bjone
Insert booze to continue
Posté le 10-12-2001 à 02:19:32  profilanswer
 

ben tu maintiens la position de ta caméra dans une matrice, pi tu parts de l'inverse de cette matrice ? (houla si je dis des conneries fo m'excuser fatiguey)
 
matrix cam, cam_i
 
cam_1 <- inverse cam  
 
glpush cam_1
 
glpush matrix_obj1
  traçage obj1
glpop
 
glpush cam_2
  traçage obj2
glpop
 
je serais étonné qu'il y est po d'approche comme ça ? (ou la matrice inverse à la fin)

 

[edtdd]--Message édité par bjone--[/edtdd]

n°79962
Tetedeienc​h
Head Of God
Posté le 10-12-2001 à 06:52:08  profilanswer
 

ouaip, j'y ai pensé (C équivalent a faire les transformations a la main).
 
En fait, ce qui m'ennuie C de calculer les positions de la camera dans l'espace...
 
Mais je crois que j'ai eu une idée en utilisant un peu + les rotations ...
 
je m'explique.
 
le gars avance/recule va a gauche / droite : la C tout con, on calcule x et z et on update les positions mémorisées de la caméra, on fait une translation de -x et -z
 
le gars tourne sa caméra a gauche/droite , avance/recule : on update L'ANGLE passé en paramètre, représentant son écart par rapport au Z d'origine, et on calcule les positions avec sinus/cosinus (ca doit marcher a peu pres bieng).
 
Apres il suffit d'y placer la caméra et de  faire une rotation de cet angle.
 
le gars grimpe la caméra vers le haut ou le bas => On update l'angle formé avec l'axe X/Y  d'origine, en gros l'angle avec lequel il regarde  en haut.
 
On regarde de combien il avance, on calcule d'abord l'écart Z et Y que cela implique sans qu'il aie bougé (de toute facon cai la même chose sans prendre en compte l'angle latéral) on applique, on translate la caméra et on remets l'angle ou il était.
 
enfin, quand je dis translater la caméra je me comprends : j'induis "translater les objets inversement".
 
Et finalement C plutot bête a faire car il me suffira de remettre après chaque LoadIdentity un translatef et un rotatef et zouuuuu, elle est bonne :)
 
je teste ce soir en étant rentré de la facc :hot:
 
Ce qui est bizarre C que je me suis endormi, et que je me suis reveillé avec cette solution...
 
J'ai bossé en dormant ou quoi :??:
 
:D
 
Verra si ca marche :)


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
n°80012
LeGreg
Posté le 10-12-2001 à 11:25:29  profilanswer
 

C'est parce que tu t'y prends mal:
il ne faut pas calculer la position de la camera
de maniere incrementale
mais il faut conserver dans un coin les parametres
globaux de ta camera (position absolue, rotation par rapport au monde)
Donc calculer la nouvelle matrice de projection + view
n'est pas plus difficile apres zero mouvement qu'apres
mille mouvements.
 
LEGREG

n°80171
wave
Posté le 10-12-2001 à 15:38:01  profilanswer
 

en parlant de ça, quelqu'un aurait une formule de "réparation" de matrice de rotation, pour compenser les erreurs de calcul successives sur les martices de rotations qu'on modifie à chaque VBL, histoire que ça reste une vraie matrice de rotation qui ne déforme pas l'objet?

n°80173
chrisbk
-
Posté le 10-12-2001 à 15:41:42  profilanswer
 

wave a écrit a écrit :

en parlant de ça, quelqu'un aurait une formule de "réparation" de matrice de rotation, pour compenser les erreurs de calcul successives sur les martices de rotations qu'on modifie à chaque VBL, histoire que ça reste une vraie matrice de rotation qui ne déforme pas l'objet?  




 
ca arrive a force de faire des rotations successives non ?
me semble (pas sur de mon coup, qu'on me dise si je dis n'imp...) que le plus simple, c'est de convertir en quaternion, normaliser le quaternion et reconvertir en matrice

n°80178
LeGreg
Posté le 10-12-2001 à 15:54:48  profilanswer
 

chrisbk a écrit a écrit :

 
ca arrive a force de faire des rotations successives non ?
me semble (pas sur de mon coup, qu'on me dise si je dis n'imp...) que le plus simple, c'est de convertir en quaternion, normaliser le quaternion et reconvertir en matrice  




mouai le quaternion je le vois bien pour gerer
des trucs compliques comme simulateur de vol/espace
(ou tu es potentiellement dans toutes les orientations possibles)
ou alors des mouvements de camera complexes et fluides.
 
Par contre pour un quake like, les angles d'euler
ca marche tres bien => d'ou la matrice
et du meme coup ca te resoud les problemes d'approximations successives. (dans un quake like pas trop complique
tu n'as meme besoin que de memoriser deux angles.)
 
A+
LEGREG

n°80180
LeGreg
Posté le 10-12-2001 à 15:56:27  profilanswer
 

Bon si t'avais programme sous DirectX  
j'aurais pas dit :)
parce que tu as les fonctions pour
calculer les quaternions (angles->quaternion, quaternion->matrice) dans la librairie standard..
 
Sous OpenGL, faudra trouver des sources ou faire
les calculs toi meme.
 
A+
LEGREG

n°80189
chrisbk
-
Posté le 10-12-2001 à 16:06:26  profilanswer
 

legreg a écrit a écrit :

 
mouai le quaternion je le vois bien pour gerer
des trucs compliques comme simulateur de vol/espace
(ou tu es potentiellement dans toutes les orientations possibles)
ou alors des mouvements de camera complexes et fluides.
 
Par contre pour un quake like, les angles d'euler
ca marche tres bien => d'ou la matrice
et du meme coup ca te resoud les problemes d'approximations successives. (dans un quake like pas trop complique
tu n'as meme besoin que de memoriser deux angles.)
 
A+
LEGREG  




 
vi je sais, mais dans l'idee c'etait que visiblement il faisait des transfo successives . Au bout d'un moment ta matrice part un peu en couille fo la reorthogonaliser . C un truc relou, qui est bpc plus facile a faire avec les quaternions, me semble t-il

n°80205
LeGreg
Posté le 10-12-2001 à 16:18:21  profilanswer
 

ca n'a rien a voir.
 
tu composes ta matrice a partir
des nouveaux angles, tu remplaces
la matrice view existante: pas (trop) d'approximation,
cad elle est aussi propre que si tu etais
passee par les quaternions.
 
Par contre les quaternions peuvent t'aider a eviter
les fameux "gimbal locks" quand tu veux etre dans n'importe
quelle orientation possible: tu peux continuer a travailler
avec les angles d'euler mais uniquement dans ton repere local.
et il permettent egalement d'interpoler
naturellement entre entre deux rotations  
ce que les angles d'Euler ne permettent pas.
(tu ne peux pas non plus interpoler lineairement les
matrices..)
 
A+
LEGREG

mood
Publicité
Posté le 10-12-2001 à 16:18:21  profilanswer
 

n°80211
chrisbk
-
Posté le 10-12-2001 à 16:25:29  profilanswer
 

legreg a écrit a écrit :

ca n'a rien a voir.
 
tu composes ta matrice a partir
des nouveaux angles, tu remplaces
la matrice view existante: pas (trop) d'approximation,
cad elle est aussi propre que si tu etais
passee par les quaternions.
 
Par contre les quaternions peuvent t'aider a eviter
les fameux "gimbal locks" quand tu veux etre dans n'importe
quelle orientation possible: tu peux continuer a travailler
avec les angles d'euler mais uniquement dans ton repere local.
et il permettent egalement d'interpoler
naturellement entre entre deux rotations  
ce que les angles d'Euler ne permettent pas.
(tu ne peux pas non plus interpoler lineairement les
matrices..)
 
A+
LEGREG  




 
Nan ce que je pensais (scrogneugneu :) ), c'est qu'il ne creait pas une nouvelle matrice a chaque frame, mais qu'il utilisait la matrice de la precedente frame qu'il ajustait avec les nouvelles input de l'utilisateurs => imprecision au bout d'un moment
 
Sinon pour le reste je suis bien d'acc avec toi

 

[edtdd]--Message édité par chrisbk--[/edtdd]

n°80272
wave
Posté le 10-12-2001 à 17:10:55  profilanswer
 

c'est exactement ce que je pensais. Sur la playstation y'a des librairies qui font ça très bien, mais je cherche le code pour faire la même chose sur PC.

n°80298
LeGreg
Posté le 10-12-2001 à 17:56:41  profilanswer
 

wave a écrit a écrit :

en parlant de ça, quelqu'un aurait une formule de "réparation" de matrice de rotation, pour compenser les erreurs de calcul successives sur les martices de rotations qu'on modifie à chaque VBL, histoire que ça reste une vraie matrice de rotation qui ne déforme pas l'objet?  




 
hum a partir d'une matrice 3x3 quelconque revenir
a une matrice orthonormee?
un truc facile a comprendre et a implanter:
tu consideres chaque colonne de ta matrice
comme les coordonnees d'une base quelconque et tu orthonormalises
cette base:  
prends le premier vecteur, tu le divises par sa norme, c'est v'1.
tu prends le deuxieme vecteur, tu prends la partie orthogonale
a ton premier vecteur (v2 - (v'1.v2)*v'1 ), et tu divises le resultat par sa norme => v'2
Troisieme vecteur => meme processus mais avec les deux precedents
vecteurs => v'3
(v'1, v'2, v'3) est donc par construction une nouvelle
base orthonormee.
 
c'est peut-etre pas la meilleure solution
de toute facon ca reste une approximation d'approximations.
 
A+
LEGREG

 

[edtdd]--Message édité par legreg--[/edtdd]

n°80300
wave
Posté le 10-12-2001 à 17:59:32  profilanswer
 

Ok merci!

n°80415
Tetedeienc​h
Head Of God
Posté le 10-12-2001 à 23:08:52  profilanswer
 

J'ai un probleme quand meme ...
 
Voila ce que j'ai pondu : (je prends en compte que horizontalement dans un premier temps)
 

Code :
  1. void GlUpdatePosCam(GLfloat *X , GLfloat *Y , GLfloat *Z , GLfloat Deltahori, GLfloat Deltavert, GLfloat *Delta)
  2. {
  3. if (Deltavert == 0.0f)
  4. {
  5.  *Z += ((*Delta) * (-1.0f) * (GLfloat) cos((double)Deltahori));
  6.  *X += ((*Delta) * (-1.0f) * (GLfloat) sin((double)Deltahori));
  7.  *Delta = 0.0f;
  8.  return;
  9. }
  10. }
  11. void GLPosCam(GLfloat X , GLfloat Y , GLfloat Z , GLfloat Deltahori, GLfloat Deltavert)
  12. {
  13. //glTranslatef(X,Y,Z);
  14. glRotatef(Deltahori,0.0f,1.0f,0.0f);
  15. glRotatef(Deltavert,0.0f,1.0f,0.0f);
  16. glTranslatef(X,Y,Z);
  17. return;
  18. }


 
X,Y et Z sont les positions de ma caméra.
 
Delta le déplacement a prendre en compte.
 
Deltahori = Angle formé horizontalement avec l'axe Z.
 
DeltaVert = Angle formé verticalement avec l'axe Y.
 
Sur le plan maths, ca se tiens a l'aise.
 
je pense avoir pondu un truc plutot correct (a des signes pres, bon, ca rends des choses inverses au pire des cas).
 
Sauf que la... C pas trop le cas.
 
le blem viens de cos ou sinus...
 
Si l'angle = 0.0f no problem.
 
Si il augmente un peu, ma sphère de référence translate de 45° de gauche a droite en avancant (en diagonale style carré donc, alors que ca ne devrait pas etre le cas).
 
Je tourne encore un peu, cette fois ci elle va horizontalement.
 
je retourne encore un peu, ca deviens carrément du délire, elle reviens parrallèle a moi en avancant / reculant...
 
Evidemment entre les deux je tombe sur des angles bizarre... que je ne capte décidément pas.
 
J'ai merdé ou la pour avoir un comportement aussi étrange ?
 
m'est avis que ca viens du sinus/cos, pourtant, voula ce que j'ai fait comme gestion d'évènement :

Code :
  1. if (keys[VK_UP])
  2.    {
  3.     Delta += 0.01f;
  4.    }
  5.    if (keys[VK_DOWN])
  6.    {
  7.     Delta -= 0.01f;
  8.    }
  9.    if (keys[VK_RIGHT])
  10.    {
  11.     Deltahori += 0.05f;
  12.    }
  13.    if (keys[VK_LEFT])
  14.    {
  15.      Deltahori -= 0.05f;
  16.    }


Cai ou que j'ai merdouillé ? :??:
 
Je fais bien un GLloadIdentity avant d'appeler les deux fonctions dans mon loop...

 

[edtdd]--Message édité par Tetedeiench--[/edtdd]


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
n°80429
Tetedeienc​h
Head Of God
Posté le 10-12-2001 à 23:29:51  profilanswer
 

En fait...
 
J'(ai l'impression qu'il me fait un cos-1 (vous savez, la fonction inverse du cosinus) au lieu d'un cosinus classique...
 
car ca change de signe tres souvent ...
 
En gros, des que l'angle dépasse une unité...
 
Style cos(1.5f) > 0 et cos (2.5f) < 0 ...
 
J'ai tout oublié de mes maths ou je me suis planté grave ?


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
n°80436
Tetedeienc​h
Head Of God
Posté le 10-12-2001 à 23:42:18  profilanswer
 

Putain j'ai trouvé grace a ma calculette...
 
le cos de math.h C des radians les enculés :D
 
rah les salauds :D
 
Du coup ca change tout :D


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
n°80450
chrisbk
-
Posté le 11-12-2001 à 08:23:21  profilanswer
 

Tetedeiench a écrit a écrit :

Putain j'ai trouvé grace a ma calculette...
 
le cos de math.h C des radians les enculés :D
 
rah les salauds :D
 
Du coup ca change tout :D  




 
 
:D
 
ttes les fonction trigo sont en radian . c bon a savoir hein ? :D

n°80527
flo850
moi je
Posté le 11-12-2001 à 13:28:22  profilanswer
 

non , pour les degres y'a cosd , sind ...
parceque   double cos(double angl_en _radian);
           double cosd(double angle_e _deg);
           float cosdf(float angle_e _deg);


---------------

n°80553
LeGreg
Posté le 11-12-2001 à 14:17:57  profilanswer
 

ou sont elles definies tes fonctions
cosd et cosdf?
ca ne m'a pas l'air d'etre tres standard.
 
LEGREG

n°80557
flo850
moi je
Posté le 11-12-2001 à 14:28:49  profilanswer
 

tapes man cos
 et tu verra , elle sont definies avec cos , sin et  tan .
c vrai qu'on ne peux pas avoir leman directement.
je ne les ai pas testé sous win, mais seulement sous unix


---------------

n°80558
LeGreg
Posté le 11-12-2001 à 14:31:48  profilanswer
 

mouai c'est ca le pb
si elles ne sont definies que sous unix..
y'a pas une note sur AnsiC dans ton man?
 
(dans la doc MSDN y'a toujours un petit <compatibility notes>
ou <microsoft specific>, comme ca pas d'embrouilles.)
 
A+
LEGREG

n°80570
flo850
moi je
Posté le 11-12-2001 à 14:48:00  profilanswer
 

il ne disent rien de + dans le man .
généralement , quand ils ne precisent rien , c'est que c'est dans la norme ansiC , mais je ne peux rien affirmer
si quelqu'un a un PC sous win , ce serait sympa qu'il regarde .
au pire ,je regarderai chez moi ce soir ( sous borland par exemple )


---------------

n°80571
chrisbk
-
Posté le 11-12-2001 à 14:49:12  profilanswer
 

cosd visu connais pas

n°80593
flo850
moi je
Posté le 11-12-2001 à 15:22:18  profilanswer
 

tant pis :cry:
desolé, je croyais que c'était standard


---------------

n°80607
wave
Posté le 11-12-2001 à 16:04:45  profilanswer
 

c'est pas grave on peut les refaire facilement des fonctions comme ça.
 
float cosd(float x)
{
   return(cos(x*PI/180.0f));
}
 
enfin PI s'appelle peut-être pas comme ça, je me souviens plus.

n°80660
flo850
moi je
Posté le 11-12-2001 à 18:49:56  profilanswer
 

c'est M_PI dabs la norme ansi je crois , mais PI marche dans l'immense pajorité des cas


---------------

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [OpenGL/C++] Gestion de caméra

 

Sujets relatifs
[D3D] Bouger la caméra[3D] Comment faire bouger une caméra?
[ Les STARS d'OPENGL et GLUT HELP SVP ] => gestion sourisphp : gestion de fichiers
[C][OpenGL] Texture ...Evolution d'OpenGL
[JavaScript] gestion des dates[ PHP ] Un script de gestion de download...
[PHP] gestion de comptes... 
Plus de sujets relatifs à : [OpenGL/C++] Gestion de caméra


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR