Vers un graphique de scène ou non vers un graphique de scène?

10

J'ai eu du mal à prendre une décision concernant l'implémentation ou non d'un graphique de scène dans mon jeu. J'ai certains cas d'utilisation qui nécessitent un tel outil, mais je n'ai pas pu passer en revue certains détails de la mise en œuvre.

Quelques antécédents: j'écris un jeu de type shooter spatial destiné à une plate-forme mobile (Android, principalement) et mon code est presque entièrement en C ++. Je n'utilise aucun middleware; les moteurs de rendu et de physique en particulier sont mes propres créations. Mon moteur physique met à jour les emplacements des objets en fonction des forces et des impulsions. Je n'ai pas de système d'animation pour le moment mais je peux le visiter à un moment donné (ce qui peut ou non avoir quelque chose à voir avec cette discussion).

Tout d'abord, je vais décrire un bon cas d'utilisation. J'aimerais avoir un boss composé de plusieurs pièces discrètes, chacune pouvant être endommagée / détruite indépendamment. Par exemple, je pourrais avoir un boss qui a un bras qui peut recevoir des dégâts indépendamment du reste de l'entité boss. Lorsque le bras est détruit, un effet de particules de feu situé sur l'épaule du boss pourrait indiquer que le bras est maintenant détruit.

En l'état, j'ai décidé d'essayer de résoudre de tels problèmes avec des contraintes dans mon moteur physique pour garder ces objets composés ensemble. Une telle contrainte fournit 0 degré de liberté et est essentiellement une matrice de transformation. C'est vraiment une tentative de contourner un problème qui m'a finalement désactivé des graphiques de scène en premier lieu, décrits ci-dessous.

La principale raison pour laquelle je me suis détourné de l'utilisation d'un graphique de scène est que je n'ai pas trouvé de moyen efficace de conserver les objets imbriqués (objets qui héritent d'une transformation de leur parent) dans le monde de la physique et dans la scène de rendu. Le monde de la physique a besoin que les objets soient dans l'espace-monde (ou au moins le même espace) tandis que la scène de rendu a besoin d'objets dans l'espace-parent. Le suivi des emplacements dans les deux espaces peut aider (et être inévitable) mais soulève ses propres préoccupations, notamment la performance.

Cependant, étant donné les cas d'utilisation comme celui décrit ci-dessus, je pense que pouvoir `` travailler '' dans l'espace parent deviendra très important, et essayer de forcer mon moteur physique à maintenir ces relations en utilisant des contraintes va devenir problématique.

Étant donné le cas d'utilisation et la situation difficile décrits ci-dessus, dois-je utiliser une structure de graphe pour passer des transformations d'un objet à un autre? Si oui, comment mon moteur physique doit-il calculer de nouveaux emplacements et effectuer des tests d'intersection pour des objets dans différents espaces?

notlesh
la source

Réponses:

11

Avez-vous réellement essayé un graphique hiérarchique et mesuré les performances?

Avez-vous étudié des moteurs physiques simples pour voir comment ils gèrent le problème, même un moteur 2D qui a un lien entre des objets vous aiderait à vous guider dans une direction éprouvée.

Je n'essaierais pas d'exécuter votre physique dans plusieurs espaces, la complexité serait intimidante. Exécutez la physique dans l'espace mondial et ajoutez des fonctionnalités pour créer des transformations de votre hiérarchie pour déplacer des objets spatiaux locaux vers l'espace mondial et inversement. Vos contraintes, par nécessité, doivent se trouver dans l'espace local par rapport à l'objet parent.

En guise de remarque, même un pur tableau d'objets est un "graphique de scène", juste très simple. N'ayez pas peur d'organiser les données de manière à résoudre les problèmes et surtout ne décidez pas que les performances de cette organisation de données sont un facteur sans même avoir mesuré ces performances.

Patrick Hughes
la source
J'ai essayé de contourner ce problème non pas à cause des performances mais à cause du temps. Lorsque vous êtes indépendant, rester coincé sur quelque chose pendant une longue période peut nuire au progrès et à l'état d'esprit. J'ai regardé un peu dans le moteur Spring RTS mais je n'ai pas trouvé ce que je cherchais. Donc, si j'essaie un graphique, dans le moteur physique, je devrai mettre à jour les emplacements des objets dans l'espace local, puis calculer l'orientation de l'espace mondial et y accrocher pour l'utiliser avec la détection de collision. Vous mentionnez "et inversement", cependant - cela nécessite de calculer la matrice inverse, non? Quand aurais-je besoin de faire ça?
notlesh
J'aurais pensé que si le temps était un problème, alors utiliser une bibliothèque de physique serait plus rapide, pour économiser une tonne de temps de débogage. Si vous ne faites que de la 2D, alors box2d.org peut-être? J'ai suggéré le "et le dos" car c'est juste un inverse, comme vous l'avez deviné. À un moment donné, vous voudrez probablement prendre quelque chose dans l'espace mondial et l'attacher à un autre modèle, qui en aurait besoin.
Patrick Hughes