c++ - 对物体施加重力

标签 c++ opengl glut

我在对物体实现重力时遇到问题。

我有一堆使用 OpenGL 绘制的圆形对象。我正在使用 delta-xdelta-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();
}

我遇到的一个大问题是我不知道如何计算重力,因为我使用的是 deltaXdeltaY 而不是单独的速度和距离变量来计算 92 m/s^2。然而,无论我将重力设置为什么,球都不会像它们应该的那样运行 - 无论重力强度如何,所以一定有其他错误,但我不知道是什么。

最佳答案

我认为这里的问题是物理学,而不是编程技术。 在你的情况下,我会将 Ball 类的“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 '-'
  }

gravity 的值应该是绝对的和正的,这样才能让事情尽可能简单。如果你尝试这个,你应该有一个理想的简单物理模拟器,有一个恒定速度 X 的球(只改变它的方向,而不是大小)。 请试试这个,让我知道进展如何,祝你好运,继续努力 =)

关于c++ - 对物体施加重力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41710304/

相关文章:

c++ - 实现格雷厄姆扫描以找到凸包

cocoa - NSOpenGLContext 用于非绘图目的

c++ - 如何制作一个开放的立方体(缺少一个表面)而不影响在 OpenGL 中镜像或切换边的位置?

c++ - 在现代OpenGL中,使用GL_TRIANGLE奇怪的z轴行为绘制实心圆

c++ - 为什么我的彩色立方体不适用于 GL_BLEND?

c++ - 在 GLUT 应用程序中隐藏控制台窗口的可移植方法?

c++ - 使用随机数生成器 : multiple instances or singleton approach?

iphone - 需要在 iOS 项目的 C++ 类中使用 fopen 写入文件

C++ 如何使用 reference_wrapper 的 vector

c++ - 内存复制导致偏移