J'écris un moteur physique/simulateur qui intègre vol spatial 3D, la gravitation planétaire/stellaire, la poussée des navires et des effets relativistes. Jusqu'à présent, il va très bien, cependant, une chose que je besoin d'aide est le calcul de la détection de collision algorithim.détection de collision entre Accelerating Sphères
La simulation itérative de mouvement que je me sers est essentiellement comme suit:
(Note:. 3D vecteurs sont MAJUSCULES)
For each obj
obj.ACC = Sum(all acceleration influences)
obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2 (*EQ.2*)
obj.VEL = obj.VEL + (obj.ACC * dT)
Next
Où:
obj.ACC is the acceleration vector of the object
obj.POS is the position or location vector of the object
obj.VEL is the velocity vector of the object
obj.Radius is the radius (scalar) of the object
dT is the time delta or increment
Ce que je essentiellement besoin de faire est de trouver une formule efficace qui découle de (eq.2) ci-dessus pour deux objets (obj1, obj2) et dire si elles entrent en collision jamais, un sd si oui, à quelle heure. J'ai besoin l'heure exacte à la fois pour que je puisse déterminer si elle est dans cet incrément de temps particulier (parce accelleratons sera différent à différents incréments de temps) et aussi pour que je puisse localiser la position exacte (que je sais comment faire, compte tenu de la temps)
pour ce moteur, je modélise tous les objets comme des sphères, tout cette formule/algortithim doit faire est de comprendre à quel points:
(obj1.POS - obj2.POS).Distance = (obj1.Radius + obj2.Radius)
où .distance est une valeur scalaire positive. (Vous pouvez également conciliez les deux parties si cela est plus facile, d'éviter la fonction racine carrée implicite dans le calcul .distance). (Oui, je suis au courant de beaucoup, beaucoup d'autres questions de détection de collision, cependant, leurs solutions semblent toutes être très particulières à leur moteur et hypothèses, et aucune ne semble correspondre à mes conditions: 3D, sphères et accélération appliquées . dans les incréments de simulation Permettez-moi de savoir si je me trompe)
Quelques Clarifications:.
1) Il ne suffit pas pour moi de vérifier pour * Intersection * des deux sphères avant et après la incrément de temps. Dans de nombreux cas, leurs vitesses et changements de position dépasseront de loin leurs rayons.
2) RE: efficacité, je ne suis pas besoin d'aide (à ce moment de toute façon) par rapport à déterminer les candidats probables pour les collisions, je pense que j'ai que couvert.
Une autre précision, ce qui semble venir beaucoup:
3) Mon équation (EQ .2) de mouvement incrémental est une équation quadratique qui applique à la fois la vitesse et Accélération:
obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2
les moteurs de physique que je l'ai vu, (et certainement tous les moteurs de jeu que j'ai jamais entendu parler) que linéaire équations de mouvement incrémental qui s'appliquent seulement Velocity:
obj.POS = obj.POS + (obj.VEL * dT)
Voilà pourquoi je ne peux pas utiliser les solutions couramment publiées pour la détection des collisions trouvées sur pile Débordement, sur Wikipédia et partout sur le Web, tel que trouver l'intersection/approche la plus proche de deux segments de ligne. Ma simulation traite des accélérations variables qui sont fondamentales pour les résultats, donc ce dont j'ai besoin est l'intersection/approche la plus proche de deux segments paraboliques.
merci tcovo, c'est un bon début sur exactement ce dont j'ai besoin. Une idée de comment étendre la solution d'équation cubique de Wikipedia aux coefficients vectoriels? – RBarryYoung
L'équation cubique que j'ai écrite a des coefficients scalaires: le produit scalaire de deux vecteurs est un scalaire, et le carré de la magnitude est aussi un scalaire. J'ai édité ma réponse pour élaborer sur ceux-ci. – tcovo
Ah, super! Merci ... – RBarryYoung