Bonjour!
J'ai quelques problèmes à déterminer ce qui est le plus adapté pour développer mon petit moteur de jeu (projet perso pour apprendre).
J'ai un système de "scene graph"avec nœuds parents/enfants et chaque objet/entité à une position et rotation relative à son parent.
Jusque là pas de soucis. Lors du rendu, j'utilise avec succès la récursivité pour traverser les nœuds et j'ajoute successivement la rotation et la position à la matrice courante avant de dessiner les objets.
Dans mon moteur, tout peut être une entité imbriquée dans la hiérarchie. Aussi bien un mesh qu'une caméra ... et c'est là que ça commence à se compliquer pour moi.
Comme une caméra peut être "imbriquée" profondément dans la hiérarchie de la scène, je dois retrouver sa position et rotation absolue !
En effet, comme dans beaucoup d'applis OpenGL j'imagine, dans ma méthode de rendu je procède comme ceci:
Ça implique donc que j'ai la position/rotation absolue de la caméra à utiliser pour le rendu, mais je ne connais que les relatives !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Render(){ -réglage matrice projection -réglage matrice modelView avec position/rotation caméra -rendu récursif des éléments de la hiérarchie }
Comment gérer ce cas en général ?
Avant la méthode de rendu j'ai une méthode "d'update". Je pensais l'utiliser pour traverser avec récursivité ma scène et utiliser une matrice comme je le fais pour le rendu (accumulation des positions/rotations et push/pop sur la matrice) pour retrouver facilement la matrice absolue de chaque entité. Ainsi j'aurais tout à disposition pour régler ma caméra lors du rendu.
De plus, pour chaque entité, je stocke position et rotation sous forme de vecteurs et j'utilise "glRotate","glTranslate" et "push/pop" lors du rendu et non des matrices. Je sais que ce n'est pas terrible et que j'aurais des problèmes, mais c'est le seul moyen que j'ai pour l'instant pour disposer ma scène simplement.
Serait-il vraiment plus judicieux que je gère tout par matrices ?
Existe-t-il une méthode simple pour gérer ce genre de cas ? Comment procèderiez-vous ?
Merci d'avance pour votre aide.
Partager