Il y a 26 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

OpenGL et camera

 
n°56147
TriadPtale
Posté le 02-03-2007 à 21:46:55  profilanswer
 

Bonjour à tous,
 
Je débute en OpenGL, et j'aurais l'une ou l'autre question à vous poser.
 
Voilà ce que je veux faire :
 
- dessiner un cube centré sur l'origine
 
- faire une "caméra" qui va me permettre de tourner autour du cube.
 
Pour y arriver:
 
- j'arrive à dessiner le cube
 
- j'arrive à l'afficher et à le faire tourner, mais mal.
 
Via Qt je sais recupérer des déplacement de souris ou de clavier.
 
Voilà où j'en suis :
 
- j'ai 4 valeurs modifiée par le claiver ou la souris : distance_origine , angulation[X], angulation[Y] et angulation[Z].
 
Le but est de donner l'impression que le cube est fixe et qu'on sais se ballader autour : vers la gauche/ droite, vers le haut/bas, le faire tourner "j'incline la tête" et l'éloigner / le rapprocher.
 

Code :
  1. glMatrixMode(GL_MODELVIEW);
  2.  glLoadIdentity();
  3. gluLookAt(
  4.  distance_origine*sin(angulation[X])*cos(angulation[Y]),
  5.  distance_origine*sin(angulation[X])*cos(angulation[X]),
  6.  distance_origine*cos(angulation[X]),
  7.  0.0, 0.0, 0.0,
  8.  sin(angulation[Z]), cos(angulation[Z]), 0
  9.  );


 
Voilà ce que j'ai actuelement.
 
L'idée est d'être en coordonnée sphériques ( theta = angulation[X] et phi = angulation[Y] ).
Je demande alors a glulookat de me mettre au bon endroit en polaire, et de regarder l'origine.
 
Pour pouvoir "incliner" la tête, je définit la verticale en coordonnées polaire avec r = 1 fixe et theta_polaire = angulation[Z].
 
Cela fonctionne mais le cube tourne très bizarrement.
 
Comment feriez vous ?
 
Merci :)


Message édité par TriadPtale le 02-03-2007 à 21:47:38
n°56149
Ashe
reenignE esreveR
Posté le 02-03-2007 à 22:09:05  profilanswer
 

En fait une fois que tu as cree la matrice de la projection (glFrustum ou autre), tu mets la modelview comme matrice "active" (a faire qu'a l'initialisation)

Code :
  1. glMatrixMode( GL_MODELVIEW );


Apres t'as plus besoin de changer la matrice active vu que tu touches plus a la projection... et donc a chaque boucle t'en refais un truc tout propre et tu definis la transformation de ta camera

Code :
  1. glLoadIdentity();
  2. glTranslatef( x, y, z );
  3. glRotatef( anglex, 1.0f, 0.0f, 0.0f );
  4. glRotatef( angley, 0.0f, 1.0f, 0.0f );
  5. glRotatef( anglez, 0.0f, 0.0f, 1.0f );


Apres en gros tu dessines ton cube ou t'as envie, avec une rotation ou autre, bon toi c'est a l'origine donc ca sert pas a grand chose mais c'est pour l'exemple:

Code :
  1. glPushMatrix();
  2. glTranslatef( 0.0f, 0.0f, 0.0f ); // pas super utile
  3. glRotatef( anglex, 1.0f, 0.0f, 0.0f ); // axe X
  4. glRotatef( angley, 0.0f, 1.0f, 0.0f ); // axe Y
  5. glRotatef( anglez, 0.0f, 0.0f, 1.0f ); // axe Z
  6. // dessiner le cube
  7. glPopMatrix();


Le push et pop permet de copier la matrice sur une pile d'une taille qui depend du pilote (glGet() pour voir sa taille, mais bon y a de la marge). Ce qui fait que les glTranslatef/glRotatef n'ont "plus" d'effet et tu reviens a la "position de ta camera".
 
Mais bon au final dans l'histoire le truc le plus "complique" c'est de visualiser comment les matrices sont modifiees. Parce que par exemple faire le glTranslatef apres les glRotatef, ca fait pas pareil que dans l'autre sens (l'ordre a une importance); donc idealement il faudrait que tu joues un peu avec l'ordre pour essayer de comprendre l'influence que ca a sur ce qui s'affiche, parce que je connais pas de meilleure facon pour ca...


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°56150
Ashe
reenignE esreveR
Posté le 02-03-2007 à 22:10:06  profilanswer
 

(sinon une facon + propre/generale serait d'utiliser des quaternions mais la c'est + un topic math que software)


Message édité par Ashe le 02-03-2007 à 22:10:16

---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°56152
LostSoul
Manieur de hache
Posté le 02-03-2007 à 22:35:05  profilanswer
 

Tiens pour la réécriture du projet GPS pour Fortis on va devoir afficher des graphes d'arborescences de sociétés (normalement en 2D) sauf qu'ils parlent de l'ajout d'une 3e dimension ...
Qu'est-ce qui pourrait être le plus adapté pour faire un rendering correct de ses machins en sachant que les noeuds et les liens doivent a priori être cliquables (pour voir l'info les concernant) et qu'on doit avoir des possibilités de zoom / rotations / translations et de jolies couleurs ?
 
Mon pseudo collègue polytechnicien m'a parlé d'un truc 3D intégré à WinFX ... il me fait peur ...


---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56153
Ashe
reenignE esreveR
Posté le 02-03-2007 à 22:41:39  profilanswer
 

Ben deja du coup ca marcherait que sur XPVista
Mais wai y a de la 3D dans WPF, en gros c'est DirectX version XML, genre

<Viewport3D Name="machin" ClipToBounds="True">
<Viewport3D.Camera>
<PerspectiveCamera FarPlaneDistance="100" LookDirection="-1,-2,-3" UpDirection="0,1,0" NearPlaneDistance="1" Position="1,2,3" FieldOfView="70" />
</Viewport3D.Camera>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="White" Direction="-2,-3,-1" />
</ModelVisual3D.Content>
...
</ModelVisual3D>
</Viewport3D>


Mais bon a priori avec du bete D3D + D3DX ca te fait les 3/4 du boulot


Message édité par Ashe le 02-03-2007 à 22:42:00

---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°56154
LostSoul
Manieur de hache
Posté le 02-03-2007 à 22:49:34  profilanswer
 

A mon avis c'est ca qu'on va utiliser (ca doit tourner sur XP en final)
Paske bon la version actuelle avec son SVG doublé JavaScript faut avouer que c'est assez pourri ...

 

EDIT : cay marrant ton turc on dirait des directives pour POV ... ca a l'air sympa à faire (c'est le polytechnicien qui va se taper le boulot)


Message édité par LostSoul le 02-03-2007 à 22:50:34

---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56155
Ashe
reenignE esreveR
Posté le 02-03-2007 à 22:53:53  profilanswer
 

Bah XP va falloir leur installer WPF alors (et prier pour que ca tourne :D)
Mais bon le coup des directives pour POV, ben c'est un peu pareil pour D3DX/XNA/GLU(T)


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°56156
LostSoul
Manieur de hache
Posté le 02-03-2007 à 22:57:00  profilanswer
 

jamais fait de 3D donc  ...  
Notre vrai problème c'est de positionner tous les noeuds dans l' "espace" de visualisation de manière idéale pour que le graphe reste lisible.  
Maintenant le choix du renderer, ca pourrait encore être du VRML dans un browser que ce serait le cadet de mes soucis ...


---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56157
Ashe
reenignE esreveR
Posté le 02-03-2007 à 23:00:29  profilanswer
 

Ben les noeuds tu peux les afficher dans une 2eme passe en mettant le depth test sur always true, du coup ton noeud s'affichera d'office devant tout le reste


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°56158
LostSoul
Manieur de hache
Posté le 02-03-2007 à 23:01:51  profilanswer
 

je sens que je vais devoir potasser WPF dans pas longtemps :whistle:


Message édité par LostSoul le 02-03-2007 à 23:01:57

---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56160
TriadPtale
Posté le 02-03-2007 à 23:32:26  profilanswer
 

Merci Ashe :)
 
J'arrive à quelque chose.
 
Je vous ferai quelques captures une fois le projet fini.


---------------
Triad.

Aller à :
Ajouter une réponse