オブジェクトに重力を実装する際に問題があります。オブジェクトに重力を適用する
私はOpenGLを使用して描画している円のオブジェクトの束を持っています。私はdelta-x
とdelta-y
を使って円(ボール)を動かしています。私はy
に重力定数を加えて各フレームを調整しようとしていますので、下に引っ張られるようにシミュレートしていますが、正確にどのように行うのかは分かりません。
ここに関連するコードです:
class Ball
{
public:
double x;
double y;
double radius;
double deltaX;
double deltaY;
};
std::vector<Ball> gAllBalls; // a vector of balls with random positions and delta-values
double gGravity = ?; // gravitational constant - I know it's 92 m/s^s, but I don't know how to apply that to deltaX and deltaY
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
for (auto &thisBall : gAllBalls)
{
// draw
glColor3d(thisBall.red, thisBall.green, thisBall.blue);
DrawCircle(thisBall.x, thisBall.y, thisBall.radius);
// gravity - not working
if (thisBall.y + thisBall.radius < gScreenHeight - gGravity)
{
thisBall.y += gGravity;
}
// wall bouncing
if (thisBall.y + thisBall.radius + thisBall.deltaY >= gScreenHeight) // up
{
thisBall.deltaY = -thisBall.deltaY;
}
if (thisBall.y + thisBall.deltaY - thisBall.radius < 0) // down
{
thisBall.deltaY = -thisBall.deltaY;
}
if (thisBall.x + thisBall.deltaX - thisBall.radius < 0) // left
{
thisBall.deltaX = -thisBall.deltaX;
}
if (thisBall.x + thisBall.radius + thisBall.deltaX >= gScreenWidth) // right
{
thisBall.deltaX = -thisBall.deltaX;
}
// move
thisBall.x += thisBall.deltaX;
thisBall.y += thisBall.deltaY;
}
glutSwapBuffers();
glutPostRedisplay();
}
私がいる大きな問題は、私が代わりに別の速度を持つのdeltaX
とdeltaY
を使用していますので、私は、重力を計算する方法がわからないということですがと92m/s^2を計算するための距離変数。しかし、私が重力をどのように設定しても、ボールは重力にかかわらず、何か間違っている必要がありますが、何が分からないのか分かりません。
'thisBall.y + = gGravity;'一定の速度で、一定の加速になりません。 YではなくdeltaYを調整すると、おそらくあなたが意図するものに近づくでしょう。最良の方法は、ピクセルや任意の時間ステップではなく、メートルや秒などの工学単位で作業し、必要に応じてそれらの間で変換することです。最後に、 'G'の値はオフになっています。実際には9.8 m/secです。^ 2 –
ああ、もちろん理にかなっています。私はYの代わりにdeltaYに変更しましたが、最初はうまくいくように見えますが、ボールは減速するのではなく、速くて速く加速し始めます。私は重力定数として1を使用しています。 私はより良いユニットを使用したいと思っていますが、それらの実装方法はわかりません。提案やリソースはありますか? – Grav
"** 92 ** m/s^2"、あなたは何かの超木星か小さな星をシミュレートしていますか? – genpfault