2009-09-16 13 views
0

Je suis très nouveau à la création de jeux (et de travailler dans OpenGL en général). J'essaie de faire un jeu en 2D, mais je suis tombé sur un point d'achoppement lorsque j'ai essayé de détecter la collision. Disons par exemple que je traduis la matrice courante, que je la fais tourner et que je traduise à nouveau, puis que je dessine un point. Comment puis-je savoir où se situe ce point par rapport à tout ce que j'ai pu dessiner?coordonnées absolues OpenGL

Existe-t-il un moyen de calculer des coordonnées "absolues" à partir de la matrice actuelle?

Veuillez expliquer aussi simplement que possible! merci :)

Répondre

3

D'autre part, la détection de collision est fonction de votre logique de jeu. Par conséquent, cela ne devrait rien avoir avec OpenGL, qui est juste le mécanisme de visualisation pour mettre une représentation visuelle sur l'écran - il ne sait rien sur vos objets de jeu et ne détient pas de données persistantes utiles sur eux. Si vous essayez de stocker la position d'un objet dans une matrice et que vous la déplacez via des transformations, vous pouvez éventuellement souffrir des effets d'erreurs cumulatives à virgule flottante menant à un comportement imprévisible.

Ce que vous devez faire à la place est de maintenir manuellement toutes les positions de votre objet (et orientations, vitesses, etc). Tous les mouvements d'objets doivent être effectués par vous dans le code de l'application. Quand vient le temps de rendre les objets, vous lisez leurs valeurs actuelles et les transmettez à OpenGL. Généralement, vous prenez les données de polygone pour chaque objet de type que vous voulez rendre, faites-le pivoter par l'orientation de l'instance de l'objet, traduisez-le par sa position, puis rendez-le. Répétez une fois par image.

Si vous êtes familier avec le paradigme Model-View-Controller, alors vos objets de jeu sont le modèle et OpenGL fournit une vue. En tant que tel, vous devez manipuler votre modèle selon vos besoins et juste lire la vue en cas de besoin.

+0

Je suppose que j'ai besoin de trouver un moyen approprié pour maintenir les positions manuellement puis – michael

+0

Un bon livre pour donner un moyen facile d'apprendre quelques trucs d'architecture de jeu serait le développement du jeu avec le livre pygame. Très facile et bien écrit. Cependant, je n'ai pas une vaste connaissance de ces livres. –

2

Il est préférable de simplement garder une trace de tous les objets de position absolue.

+0

C'était ma première mais il doit y avoir une façon plus gracieuse de gérer cela ?! – michael

+0

Une fois que vous avez transformé la matrice, elle a été transformée. Je ne suis pas sûr de ce que vous essayez de faire. Est-ce que vous traduisez simplement des objets au hasard? Lorsque vous restituez une image, vous savez ou devez savoir exactement où chaque objet va s'afficher. Je n'ai jamais vu de code de jeu n'ayant pas de coordonnées x, y [, z] pour chaque objet. –

0

Qu'entendez-vous par "absolu"?

Si vous voulez que votre point par rapport aux points précédents, vous pouvez inverser les transformations que vous venez de faire: traduire par le négatif de la deuxième translation, tourner dans le sens opposé autour du même axe du même montant, puis traduire par le négatif de la première traduction. Cela vous donnera une transformation de vos nouvelles coordonnées à l'ancien système.

Vous pouvez également utiliser la transformation que vous avez déjà pour transférer vos anciens points dans le nouveau système de coordonnées. OpenGL n'est pas un moteur de jeu mais une bibliothèque de rendu.

+0

Mais que se passe-t-il lorsque mes deux points ont été traduits? Par absolu, je veux dire les coordonnées alignées sur les axes qui n'ont pas eu de transformations ou de rotations. – michael

+0

J'ai l'impression que vous posez la mauvaise question ici. Qu'est-ce que vous essayez réellement d'accomplir à un niveau élevé? –

0

Suivez les positions des objets dans les coordonnées du monde et comparez-les directement.

Pour faire l'affichage, utilisez un modèle de caméra et appliquez toutes vos transformations.

1

Frustrant, n'est-ce pas? Tous les débutants en OpenGL et en programmation graphique ont des questions similaires aux vôtres. Garder une trace des différents cadres de référence peut être difficile.

La première chose que je recommanderais est d'obtenir une copie de l'OpenGL SuperBible d'Amazon ou d'un autre détaillant. Il commence au début absolu et construit progressivement à partir de là. L'affiche précédente qui a recommandé le site NeHe donne également de bons conseils. En ce qui concerne votre question elle-même, lorsque vous créez un programme OpenGL, vous pouvez définir la matrice "modelview" comme étant l'identité (voir SuperBible pour plus d'informations) et toutes les coordonnées définies dans les appels glPoint() seront définies à cette matrice comme le cadre de référence. Si vous ne faites rien d'autre que d'appeler glPoint() à partir de maintenant, tous vos objets seront dans le même système de coordonnées absolu.

Cela devient compliqué lorsque vous commencez à appeler glTranslate et glRotate et glLoadMatrix, car ces fonctions transforment le référentiel. Lorsque cela se produit, tous les appels glPoint() suivants sont alors relatifs à ce nouveau référentiel. Comme mentionné par une autre affiche, si vous voulez revenir au cadre de référence précédent, vous devez sauvegarder la matrice modelview sur une pile avant de la transformer, puis vous pouvez "pop" la pile et revenir à où vous étiez avant.)

Il est difficile de décrire cela sur un site de support, mais pensez-y comme une série de bras mécaniques dans une chaise de dentiste. Il peut déplacer le plateau sous le menton, puis le faire pivoter en biais pour le mettre en place. Chaque mouvement indépendant peut être considéré comme une transformation, implémentée dans OpenGL comme une matrice.

Comme je l'ai dit, il est difficile de décrire cela correctement en ligne. Prenez le livre SuperBible et cela aura beaucoup plus de sens. Bonne chance!