OpenGL-在倾斜的桌面上移动球

时间:2019-01-13 13:23:38

标签: c++ opengl glm-math

我有一个可以绕OX和OZ轴旋转的桌面,并且这个桌面上有一个球。我需要使球根据其倾斜度绕飞机移动。球不需要加速(速度在一定倾斜度下恒定)。

Here是我希望球移动的方式。

像这样创建球体网格:

{
    glm::mat4 modelMatrix = glm::mat4(1);
    modelMatrix = glm::translate(modelMatrix, glm::vec3(speedOX, speedOY + 0.5f, speedOZ));
    RenderSimpleMesh(meshes["sphere"], shaders["ShaderLab8"], modelMatrix, glm::vec3(0, 1, 1));
}

speedOX speedOY speedOZ是该球体的翻译vec3。

这样创建平面网格

    {
    glm::mat4 modelMatrix = glm::mat4(1);
    modelMatrix = glm::translate(modelMatrix, glm::vec3(0, 0.01f, 0));

    modelMatrix = glm::rotate(modelMatrix, RADIANS(anglePlaneOX), glm::vec3(1, 0, 0));
    modelMatrix = glm::rotate(modelMatrix, RADIANS(anglePlaneOY), glm::vec3(0, 1, 0));
    modelMatrix = glm::rotate(modelMatrix, RADIANS(anglePlaneOZ), glm::vec3(0, 0, 1));
    modelMatrix = glm::scale(modelMatrix, glm::vec3(0.125f));

    RenderSimpleMesh(meshes["plane"], shaders["ShaderLab8"], modelMatrix, glm::vec3(0.5, 0.5, 0.5));
}

按下WASD键即可使飞机移动。

    if (window->KeyHold(GLFW_KEY_W) && (anglePlaneOX > -90.0f)) {
        anglePlaneOX -= deltaTime * DELTA_SLOPE;

        /*update speedOX speedOY speedOZ */
    }
    if (window->KeyHold(GLFW_KEY_S) && (anglePlaneOX < 90.0f)) {
        anglePlaneOX += deltaTime * DELTA_SLOPE;

        /*update speedOX speedOY speedOZ */

    }
    if (window->KeyHold(GLFW_KEY_D) && (anglePlaneOZ > -90.0f)) {
        anglePlaneOZ -= deltaTime * DELTA_SLOPE;

        /*update speedOX speedOY speedOZ */
    }

      if (window->KeyHold(GLFW_KEY_A) && (anglePlaneOZ < 90.0f)) {
        anglePlaneOZ += deltaTime * DELTA_SLOPE;

        /*update speedOX speedOY speedOZ */
    }

我无法真正找到相应于平面倾斜来移动球背后的数学原理。

注意:球本身不会旋转,因为我没有对球进行任何疯狂的遮挡。我只希望它在移动平面上移动(平移)。同样,如图所示,球似乎在平面上“下沉”了。

1 个答案:

答案 0 :(得分:1)

像您想要做的那样,声音是根据物体在斜坡上运动后的物理行为来模拟球的行为。

您有一个平面,但是您可以想象这个过程很容易使物体顺着斜坡向下倾斜,因为您的平面使三角形成为了斜边。

这里有一些非常好的教程,例如: https://www.dummies.com/education/science/physics/calculating-how-far-an-object-will-slide-down-an-inclined-surface/

这一篇描述了如何计算您需要的各种值,以便计算出飞机倾斜时球在哪里,并且可以轻松地用于模拟中。

但是,如果您只希望球沿飞机运动,以免它“沉没”通过飞机(不是对球进行物理模拟的运动,只不过是像在飞机上行走的角色一样控制球的人移动)您可能在谈论碰撞。在这种情况下,要使球正确放置在飞机上,您将需要实现一个检查球和飞机之间碰撞的系统。检查碰撞的一种常见方法是给世界上的每个对象一个边界框,然后对对象边界框执行碰撞检查,最简单的情况是在轴对齐边界框(AABB)上进行轴对齐边界框。但是在您的情况下,在AABB碰撞检查中您将需要比AABB更聪明的东西,因为您的飞机将需要一个定向的边界框(OBB / AABB上的OBB)。边界球也是用于碰撞体积的常见选择。

或者,如果您的飞机有旋转矩阵,则可以简单地为球创建一个水平方向向量,然后将其乘以旋转矩阵,然后再将其应用于球。然后,您可以将该矢量添加到球的位置,这将为您提供一个沿平面x轴指向的平移矢量。