作成中のアプリケーションに重力を実装する方法を見つけようとしています。Opengl に球体があり、惑星のような重力を与えたいと思っています。そのため、近くにある小さなオブジェクトは、その表面に「落ちます」。
誰かがC ++の例の方向に私を向けることができるかどうか疑問に思っています.
これには遅すぎるかもしれませんが、少なくとも他の人はこれから何かを得るかもしれません.
これは、重力シミュレーションの C++ と OpenGL で作成したばかりのプログラムです。それが役立つことを願っています。ソース コードはビデオの説明にあり、ここにもあります。
http://www.youtube.com/watch?v=TXY6NJm5se0&list=UU0OHvV8fkDcKlWAm1vFqc1w&index=1&feature=plcp
重力式を実装する関数を作成する必要があります。次に例を示します。
const float g = 9.81f; // Gravity of Earth in m/s²
float gravity(Vec3 p1_pos, Vec3 p2_pos, float p1_mass, float p2_mass)
{
float distance = (p2_pos - p1_pos).length();
return g * p1_mass * p1_mass / (distance*distance);
}
力の大きさに単位ベクトルparalleltop2_pos--p1_posを掛けて、力に方向を与えます。次に、F=maを使用してオブジェクトの加速度を計算するだけです。
struct object
{
Vec3 pos;
Vec3 vel;
float mass;
void add_force(Vec3 force);
};
void object::add_force(Vec3 force, float dt)
{
vel += (force / mass) * dt;
}
加速度にフレームあたりの秒数であるdtを掛けてください。これにより、コンピューターの速度に関係なく、シミュレーションを通常の速度で進めることができます。上記と非常によく似た手法を使用して、任意の数の惑星をシミュレートし、それらが互いに引き合う力を計算するNBodyシミュレーションを作成しました。シミュレートするすべてのオブジェクトについて、重力関数を使用して力の大きさを取得し、オブジェクトに対してadd_force()を呼び出してプッシュします。独自のベクトルクラスの代わりにVec3を使用し、演算子のオーバーロードがあることを確認する必要があります。OpenGLはおそらく1つを提供します。
間違いがあると思います。距離 r にある質量 mA の物体 A と質量 mB の物体 B の間の力を計算する式は、[g * (mA * mB)] / (r^2) です。
今までと同じ。間違いは、距離にメートルを使用し、質量に kg を使用する場合、力を現実世界の測定値に比例させる定数があることです。その定数は、「g」として示されている私の式にあります。この「g」は 9.81 ではありません。この「g」、重力定数。6.67300 × 10^-11 m^3 / (kg * s^2) と等しい。
したがって、オブジェクト A と B の質量がどちらも 1 kg で、距離 'r' が 1 メートルの場合、それらの間の力は 6.67300 × 10^-11 (kg * m) / (s^2) または 6.67300 になります。 × 10^-11 ニュートン . これは非常に小さな力です:)私たちの惑星は非常に大きな力を持っています:D。この質量は、質量 1 kg の物体に表面で 9.81 ニュートンの力を与えるものです。