軌道や重力などの宇宙物理学を実装する必要があるゲームに取り組んでいます....
私の主な問題は、ゲームオブジェクトを惑星 (または別のオブジェクト) の周りに正しく周回させることができないことです。物理学の教科書の古い有名な式を使用してそれを実行しようとしています:
v = sqrt( G * ((m1 + m2)/r ))
ここで、v は周回物体の速度、G は定数、m1 と m2 は周回物体と惑星の質量、r は m1 と m2 の中心からの距離です。
ここに私の実装があります:
void circularOrbit(){
// Get the distance between the two object centers .
dist = new Vector2 (Planet.renderer.bounds.center.x - renderer.bounds.center.x, Planet.renderer.bounds.center.y - renderer.bounds.center.y);
r = dist.magnitude;
tdist = new Vector2 (dist.x, -dist.y).normalized; // 2D vector prependicular to the dist vector .
float force = Mathf.Sqrt (G * ((mBody + mPlanet) / r)); // Calculate the velocity .
rigidbody2D.velocity = tdist * force;
}
circularOrbit
Function はFixedUpdate
、物理スクリプティングを提供する unity内の各フレームと呼ばれます。
ここに私の問題を説明するのに十分な小さなgifがあります: http://makeagif.com/i/-JxBG8
私の設定に関する情報もいくつかあります:
- モンスターの質量は 1 単位、惑星の質量は 5 単位です。
- モンスターの重力はオフです。
- G の値は 1 です (問題を修正せずに多くの値をテストしました)。
最後に、これを行うのは私が初めてではないことを知っていますが、今週はこれを行う方法について多くのことを検索しました。主に私のコードは、いくつかの調整と変更を加えた Box2D ポートです。質問を投稿しましたここにGameDev.netがありますが、どんな提案もうまくいきました。
なぜそれが物理学の初心者の方法で機能しないのかを説明して助けてください.