Je sais très bien comment vérifier les collisions, mais je ne sais pas comment gérer la collision dans le bon sens.
Simplifié, si deux objets entrent en collision, j'utilise certains calculs pour changer la direction de la vitesse. Si je ne déplace pas les deux objets, ils se chevaucheront toujours et si la vitesse n'est pas assez grande, ils entreront en collision après la prochaine mise à jour. Cela peut entraîner des objets coincés les uns dans les autres.
Mais que faire si j'essaie de déplacer les deux objets pour qu'ils ne se chevauchent pas. Cela semble être une bonne idée, mais j'ai réalisé que s'il y a plus de deux objets, cela devient très compliqué. Et si je déplace les deux objets et que l'un d'eux entre en collision avec d'autres objets, je dois donc les déplacer aussi et ils peuvent entrer en collision avec des murs, etc.
Je pense à un jeu 2D de haut en bas, mais je ne pense pas que cela y soit pour beaucoup. Comment les collisions sont-elles généralement gérées?
Cette question est posée au nom de Wooh
la source
Réponses:
Daniel Kodicek couvre ce sujet en détail dans son livre Mathematics & Physics for Programmers .
Kodicek fait deux choses pour obtenir une résolution de collision d'apparence naturelle:
J'ai téléchargé une démo basée sur la détection et la résolution des collisions de Kodicek .
mise à jour: voici un algorithme de détection et de résolution des collisions très similaire à la méthode de Kodicek. Avec le code source . Je recommande toujours le livre de Kodicek, car son algorithme est implémenté légèrement différemment et expliqué de manière beaucoup plus approfondie.
la source
Que se passe-t-il si vous vérifiez la collision avant que les objets ne bougent, plutôt qu'après? Ou, en d'autres termes, vous rejetez la nouvelle position si les objets entrent en collision, réutilisant l'ancienne dans ce cas?
Pseudocode:
De cette façon, les objets se heurteront lorsqu'ils sont sur le point d'entrer en collision , si votre étape de mise à jour est suffisamment petite, le joueur ne devrait rien remarquer d'étrange dans la représentation.
la source
Chaque fois que deux objets se chevauchent, vérifiez s'ils se rapprochent ou s'éloignent l'un de l'autre. Ne faites la collision que s'ils se rapprochent l'un de l'autre.
C'est assez facile avec les mathématiques vectorielles, calculez simplement:
dot_product (B.position - A.position, A.velocity - B.velocity)
Si le résultat est positif, les objets se rapprochent.
la source
Je pourrais me méprendre, mais il semble que vous posiez deux questions: 1. Quels sont les moyens généraux de gérer la résolution des collisions? Le terme que vous recherchez est «simulation basée sur les impulsions», et il y a un tas d'articles qui peut le faire mieux que moi.
En résumé, vous voulez faire avancer votre simulation physique dans l'espace de momentum, qui est la masse multipliée par la vitesse (ne faites pas les choses en fonction de la force, votre intégrateur ne le fait pas correctement de toute façon).
Pour la réponse angulaire, heureusement, les moments d'inertie les plus grands et les plus faibles peuvent toujours être réduits à deux axes orthogonaux (en 2D), ce qui signifie qu'une multiplication matricielle fonctionnera généralement, et si vous les alignez avec les axes X et Y, cela se transforme en un vecteur 2D.
Lorsque vous avez une collision, vous déterminez la réponse en fonction des moments linéaires et angulaires au point de collision, et un bon facteur de fudge est, si vous avez une interpénétration, d'appliquer une force de pénalité (comme mentionné ci-dessus) pour séparer les deux corps.
À partir du moment où vous finirez par ajouter de plus en plus de règles pour contrôler les comportements aberrants, comme limiter le moment angulaire maximal afin que les choses ne tournent pas comme des sommets, etc., mais c'est un bon début.
Restez simple si vous le pouvez.
La seule vraie façon de le faire est avec un système d'équations linéaires et beaucoup de résolution. La façon pratique de le faire est d'avoir un système comme celui ci-dessus et de faire en sorte que la physique se résorbe naturellement au fil du temps.
La plupart des jeux qui font des choses comme rouler ou se tenir debout sur des surfaces mobiles, ont un modèle hybride où vos pieds sont attachés à une surface (ou des roues à la route) pour s'adapter au temps physique (ce qui entraînerait des cycles d'interpénétration-réponse et ne fonctionnerait pas).
J'espère que cela t'aides. Si vous avez besoin d'exemples mathématiques, faites-le moi savoir.
la source
La façon dont cela est généralement résolu dans les moteurs physiques consiste à appliquer une force de pénalité. Déplacer le corps rigide après l'interpénétration n'aura pas l'air bien si vos corps rigides se déplacent à des vitesses plus élevées (vous verrez des mouvements saccadés momentanés), bien que dans un premier temps, vous devriez essayer cela et voir si cela convient à vos besoins.
A
penalty force
est appliqué comme un amortisseur à ressort, où la force de pénalité est augmentée plus vous avez pénétré le corps rigide et est diminué dans les cadres suivants. Considérez-le comme des ressorts. Lorsque deux corps rigides pénètrent entre eux, ils rencontrent chacun un ressort invisible qui amortit leur progression (c'est-à-dire qui empêche plus d'inter-pénétration) et applique le précédentpenalty force
jusqu'à ce que les corps ne pénètrent plus.C'est un sujet large mais j'espère que les informations ci-dessus vous aideront à démarrer.
la source