Garder la rotation entre deux objets

9

Dans mon jeu XNA, j'ai deux objets qui entrent en collision. Lorsque le premier objet entre en collision avec l'autre, il est capable de s'y accrocher et de le déplacer dans le monde. J'ai un problème avec les mathématiques ici (les mathématiques ne sont pas mon point fort). J'ai actuellement le deuxième objet verrouillé sur le premier et je me déplace avec, mais je n'arrive pas à le garder dans sa direction d'origine. Donc, si l'objet est orienté vers le haut, il doit conserver cette direction par rapport à la façon dont il est tourné avec l'élément d'origine.

entrez la description de l'image ici

Des conseils sur la meilleure façon d'y parvenir?

user99
la source
Je pense que les deux objets tourneraient autour de l'axe du centre de l'autre objet.
MichaelHouse

Réponses:

3

En ce qui concerne l'angle, gardez simplement l'angle du deuxième objet le même que l'angle du premier. Pour la position, lorsque les deux objets entrent en collision, recherchez la distance du deuxième objet par rapport au premier à l'aide de la formule de distance.

distance = math.sqrt((x2 - x1)^2 + (y2 - y1)^2)

Pour trouver la position du deuxième objet par rapport au premier objet:

x2 = x1 + distance * math.cos(angle)
y2 = y1 + distance * math.sin(angle)
tesselode
la source
2

En plus de la réponse de @ tesselode, je vous recommande de garder une liste des objets attachés pour chaque objet du monde dans votre jeu. Quelque chose dans le sens de List<WorldObject> AttachedObjects. Ensuite, lorsque vous détectez une collision, vous ajoutez le rectangle noir au rouge AttachedObjects. Après cela, il suffit de mettre à jour les positions des enfants en utilisant la méthode de @ tesselode chaque fois que vous mettez à jour la position des parents.

Jesse Emond
la source
2

Je suppose que l'un des deux aura le contrôle sur l'autre, un peu comme un chariot élévateur. Dans votre dessin, je suppose que c'est le noir et le rouge le paquet. Vous mentionnez seulement que vous rencontrez des problèmes avec les angles, c'est donc tout ce que je vais couvrir.

Lorsque les objets se verrouillent ensemble, vous devez vous rappeler la différence d'angle entre les deux (je l'appellerai Thêta). J'ai dessiné ceci dans la figure 2 avec les flèches de la première figure tirées les unes sur les autres. Jusqu'à ce que les objets soient déverrouillés, l'angle de l'objet Rouge sera déterminé par l'angle du Noir plus Thêta, comme indiqué sur la figure 3.

// When Latching:
theta = Red.angle - Black.angle;

// When retrieving Red's angle:
Red.angle = Black.angle + theta

Diff Angle

John McDonald
la source
1

Vous pouvez implémenter une capacité à avoir des objets enfants pour un objet (où les objets enfants seraient automatiquement affectés par les modifications de la position / rotation du parent). Ensuite, lors d'une collision, quand ils devraient se verrouiller ensemble, vous faites un objet invisible et faites des deux objets attachés ses enfants. Ensuite, au lieu d'appliquer des transformations (mouvement, rotation) sur les objets individuels, vous l'appliquez sur le grand, OU vous pouvez toujours appliquer des forces aux objets enfants individuels, ce qui vérifierait "ai-je un parent?", Et si oui, la force serait envoyée au parent (ce qui fusionnerait les forces de tous les objets enfants en un seul vecteur qu'elle s'appliquerait à elle-même).

De plus, cette approche devrait gérer correctement leur rotation, si vous calculez le centre de masse du parent invisible en fonction du poids des objets verrouillés, ce que la méthode de John ne semble pas accomplir (l'objet joint tourne autour de son nouveau centre de masse partagé, pas autour du centre de masse de l'un des objets), et vous pourriez facilement imbriquer ce type de comportement sans aucun code supplémentaire requis. Il semble que ce soit l'approche la plus robuste et la plus flexible.

+ condition si la force appliquée à l'enfant est suffisamment forte pour briser l'articulation, et vous pouvez gérer son "déverrouillage" en supprimant simplement la relation parent-> enfant. S'il ne reste qu'un enfant, vous le séparez également et supprimez également le parent invisible.

Je peux fournir plus de détails (avec des images et au moins un pseudocode et autres) si cela vous intéresse.

code sh
la source