Je suis une période très difficile car je ne peux pas comprendre le problème:Distance changement de magnitude entre un objet et une planète en orbite autour de Unity 3D
Je suis en train de faire un mouvement d'objet sur une orbite circulaire autour une planète en utilisant une formule trouvée sur wikipedia, des façons voici mon code:
public void circularOrbit(Collider2D col,float planetMass){
mPlanet = planetMass;
dist = new Vector2 (col.gameObject.transform.position.x - gameObject.transform.position.x, col.gameObject.transform.position.y - gameObject.transform.position.y);
r = dist.magnitude;
print (r);
tdist = new Vector2 (-dist.y, dist.x).normalized; // 2D vector prependicular to the dist vector .
float speed = Mathf.Sqrt (G*mPlanet/r) ; // Calculate the velocity .
print (speed);
rigidbody2D.velocity = tdist * speed;
}
collisionneur 2D col
est le collisionneur de l'orbite de la planète, quand mon objet a frappé ce collisionneur il commence à se déplacer sur une voie circulaire selon les calculs que j'ai faits.
Tout se passe dans une mise à jour fixe avec quelques conditions (pas vraiment liées à ce sujet), le problème auquel je suis confronté est que mes grandeurs de distance ne cessent de changer everyframe, où j'en ai besoin pour rester le même!
Cela cause un problème puisque la vitesse va changer et pour d'autres scripts j'ai besoin de le réparer.
Voici quelques valeurs de r
la magnitude de distance:
4,602833
4,602901
4,603098
Le changement est très faible, mais il affecte mon jeu trop .
Alors s'il vous plaît expliquer pourquoi c'est hapenning?
Merci.
"Alors s'il vous plaît expliquer pourquoi c'est hapenning?" - Il y a beaucoup de calculs en virgule flottante sur votre code et la précision en virgule flottante est le diable ici je pense. Une autre chose peut-être l'impact de collision qui causent la distance de vos gameobjects change très légèrement. "Contournement" - Peut-être que vous pouvez utiliser Mathf.Round pour restreindre la valeur décimale à virgule flottante. "Solution peut-être" - En cas de collision avec le collisionneur de l'orbite de la planète, vérifiez une seule fois, prenez la valeur de r et faites l'orbite séparément. Pas besoin de vérifier la distance à chaque image ou FixedUpdate() etc. car les fonctions mathématiques sont lourdes. –
Eh bien, en fait j'essaie de le faire mais, il y a un autre problème: l'objet entre en orbite un petit moment, puis il sort de l'orbite. Aussi ma logique est que quand l'objet heurte le collisionneur de planètes isOrbit devient vrai, puis dans le FixedUpdate je vérifie cette variable booléenne et si c'est vrai, j'appelle cette fonction, j'ai fait tous les calculs dist et r sur OnTriggerEnter2D, ces variables sont global donc ils sont utilisés directement par la fonction circularOrbit. – DeltaWeb
Les moteurs de physique ne sont pas entièrement déterministes et ont une précision limitée. Comment une variation de ~ 0,0003 unités peut-elle casser votre jeu? Vous pouvez prendre le contrôle de l'objet directement, vous pouvez ajuster les paramètres physiques, ou vous pouvez retravailler un peu votre conception pour accommoder cette variation. – rutter