Comment fixer le cercle et le rectangle de chevauchement dans la collision de réponse?
Depuis dans le monde du numérique un véritable collision ne se produit presque jamais, nous aurons toujours une situation où la "collision" cercle chevauche le rectangle.
Comment remettre le cercle dans la situation où elle se heurte parfaitement avec le rectangle sans chevauchement?
Supposons que le rectangle est à l'arrêt (vitesse nulle) et de l'axe-alignés.
Je voudrais résoudre ce problème avec a posteriori approche (en deux dimensions).
En bref, je dois résoudre cette équation pour t:
Où:
- est un nombre qui répond à la question: combien d'images il y a la
collision arriver à la perfection? - est le rayon du cercle.
- est le centre du cercle
- est sa vitesse.
- sont les fonctions qui retournent les coordonnées x et y de
le point où le cercle et le rectangle de collision (lorsque le cercle est
au position, qui est dans la position dans laquelle parfaitement entrer en collision avec le rectangle).
Récemment, j'ai résolu un problème similaire pour les collisions entre les cercles, mais maintenant je ne sais pas le droit de les fonctions A et B.
OriginalL'auteur VanDir | 2013-09-09
Vous devez vous connecter pour publier un commentaire.
Après des années de regarder ce problème, et de ne jamais venir avec une solution parfaite, je l'ai enfin fait!
C'est à peu près un simple algorithme, pas besoin de boucle et d'approximations.
C'est la façon dont il fonctionne à un niveau supérieur:
Et maintenant, pour les détails sanglants!
L'entrée à la fonction est de limite (qui est à gauche, haut, droite, bas) et d'un point courant (start) et un moment de l'avenir (à la fin).
La sortie est une classe appelée croisement a x, y, temps, nx et ny.
Nous avons commencer avec la mise en cache des variables que nous utilisons souvent:
Et de calcul de l'intersection avec chaque côté de l'avion (si le vecteur entre le début et la fin passer au-dessus de l'avion):
Maintenant, nous essayons de voir si c'est strictement un côté intersection (et pas un coin). Si le point de collision se trouve sur le côté puis retourner l'intersection:
Nous avons obtenu jusqu'ici nous savons donc il n'y a pas d'intersection, ou il est entré en collision avec un coin. Nous avons besoin de déterminer le coin:
Nous avons maintenant suffisamment d'informations pour résoudre le triangle. Il utilise la formule de la distance, de trouver l'angle entre deux vecteurs, et la loi des sinus (deux fois):
Maintenant que nous avons résolu de tous les côtés et les angles, nous pouvons déterminer le temps et tout le reste:
Woo! C'était amusant... ce qui a beaucoup de place pour des améliorations de l'efficacité va. Vous pourriez les réorganiser le côté de l'intersection de la vérification pour échapper dès que possible, tout en apportant quelques calculs que possible.
J'espérais qu'il y aurait un moyen de le faire sans les fonctions trigonométriques, mais j'ai dû céder!
Voici un exemple de m'appeler et l'utiliser pour calculer la nouvelle position du cercle à l'aide de la normale à refléter et à l'intersection de temps pour calculer l'ampleur de la réflexion:
Et j'ai posté le code complet sur pastebin complètement interactif, vous pouvez par exemple tracer les points de début et de fin et il vous montre le temps et résultant rebondir hors du rectangle.
Si vous voulez le remettre en marche tout de suite, vous aurez à télécharger code de mon blog, sinon le coller dans votre propre Java2D application.
EDIT:
J'ai modifié le code en pastebin pour inclure également le point de collision, et a également fait quelques améliorations de la vitesse.
EDIT:
Vous pouvez modifier ce pour une rotation d'un rectangle à l'aide du rectangle de l'angle de l'onu-faire pivoter le rectangle avec le cercle de points de début et fin. Vous devrez effectuer l'intersection de vérifier puis de tourner la résultante des points et les normales.
EDIT:
J'ai modifié le code sur pastebin pour quitter plus tôt si la délimitation du volume de la trajectoire du cercle ne se croisent pas avec le rectangle.
Je veux dire que je suis en train de mettre en œuvre ce à mon JavaScript jeu..
Bravo. C'est magnifique.
OriginalL'auteur ClickerMonkey
Trouver le moment du contact n'est pas trop dur:
Vous avez besoin de la position du cercle et le rectangle à la timestep avant la collision (B) et le timestep après (Un). Calculer la distance entre le centre du cercle à la ligne du rectangle, il entre en collision avec à la fois A et B (c'est à dire, une formule commune pour une distance d'un point à une ligne), et puis le temps de collision est:
où tC est le temps de la collision, le dt est la timestep, dB est la distance à la ligne avant la collision, dA, c'est la distance après la collision, et R est le rayon du cercle.
Cela suppose tout est localement linéaire, c'est que vos échéances sont raisonnablement petit, et donc que la vitesse, etc, n'est pas beaucoup de changement dans la timestep où vous calculer la collision. C'est, après tout, le point d'échéances: avec une assez petite timestep, les problèmes non-linéaires sont localement linéaire. Dans l'équation ci-dessus j'en profite: dB-R est la distance entre le cercle à la ligne, et dA+dB est le total de la distance parcourue, de sorte que cette question juste assimile le rapport de distance à la fois du ratio en supposant que tout est à peu près linéaire à l'intérieur de la timestep. (Bien sûr, au moment de la collision de l'approximation linéaire n'est pas son meilleur, mais de trouver le moment de la collision, la question est de savoir si c'est linéaire à l'intérieur d'un timestep jusqu'à au moment de la collision.)
OriginalL'auteur tom10
C'est un problème non linéaire, droite?
Vous prenez une étape de temps et de déplacer la balle à son déplacement calculé à l'aide de la vitesse au début de l'étape. Si vous trouver les chevauchements, de réduire la taille du pas de calcul jusqu'à la convergence.
Êtes-vous en supposant que les balles et les rectangles sont à la fois rigides, pas de déformation? Frottement de contact? Comment allez-vous gérer le mouvement de la balle après que le contact est établi? Êtes-vous transformer sur un système de coordonnées du contact (normal + tangentielle), le calcul, puis la transformation de retour?
Ce n'est pas un problème trivial.
Peut-être que vous devriez regarder dans un moteur physique, comme Box2D, plutôt que de coder vous-même.
Non, vous ne comprenez pas le fait que c'est un non-linéaire de la solution. Il n'existe pas de solution de l'équation.
Si je trouve la loi pour a et b des fonctions que je peux trouver la variable t. Regarder la question dans le 'problème similaire' lien.
Nope, je comprends la physique assez bien.
OriginalL'auteur duffymo