对物体施加重力
Applying gravity to objects
我在对物体实施重力时遇到问题。
我有一堆使用 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
而不是单独的速度和距离变量计算 92 m/s^2。然而,无论我将重力设置为什么,球都不会表现得像它们应该的那样 - 无论重力强度如何,所以必须有其他错误,但我不知道是什么。
我认为这里的问题是物理学,而不是编程技术。
在你的情况下,我会将你的 Ball class 的 'delta' 成员更改为 'speed',因为它们是一个距离单位,每个周期(时间)改变你的对象的位置,但是这只是一个使可视化更容易的建议...
class Ball
{
public:
double x;
double y;
double radius;
double speedX;
double speedY;
};
其次,我在你的代码中,你正在改变 'y' 成员,而不是速度,并且由于重力改变速度,因此出现了问题。
尝试这样做,出于调试目的,我会尝试使用准时对象(没有半径,只是普通的 (x,y) 坐标)。
所以,总而言之,我只是将您的引力代码更改为以下内容:
// gravity - 'fixed'
if (thisBall.y + thisBall.radius < gScreenHeight - gGravity)
{
thisBall.speedY -= gGravity; //notice the '-'
}
重力的值应该是绝对的和正的,这样才能让事情尽可能简单。如果你尝试这个,你应该有一个理想的简单物理模拟器,有一个恒定速度 X 的球(只改变它的方向,而不是大小)。
请试试这个,让我知道进展如何,祝你好运,继续努力 =)
我在对物体实施重力时遇到问题。
我有一堆使用 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
而不是单独的速度和距离变量计算 92 m/s^2。然而,无论我将重力设置为什么,球都不会表现得像它们应该的那样 - 无论重力强度如何,所以必须有其他错误,但我不知道是什么。
我认为这里的问题是物理学,而不是编程技术。 在你的情况下,我会将你的 Ball class 的 'delta' 成员更改为 'speed',因为它们是一个距离单位,每个周期(时间)改变你的对象的位置,但是这只是一个使可视化更容易的建议...
class Ball
{
public:
double x;
double y;
double radius;
double speedX;
double speedY;
};
其次,我在你的代码中,你正在改变 'y' 成员,而不是速度,并且由于重力改变速度,因此出现了问题。 尝试这样做,出于调试目的,我会尝试使用准时对象(没有半径,只是普通的 (x,y) 坐标)。
所以,总而言之,我只是将您的引力代码更改为以下内容:
// gravity - 'fixed'
if (thisBall.y + thisBall.radius < gScreenHeight - gGravity)
{
thisBall.speedY -= gGravity; //notice the '-'
}
重力的值应该是绝对的和正的,这样才能让事情尽可能简单。如果你尝试这个,你应该有一个理想的简单物理模拟器,有一个恒定速度 X 的球(只改变它的方向,而不是大小)。 请试试这个,让我知道进展如何,祝你好运,继续努力 =)