【问题标题】:OpenGL - Move ball on tilted tabletopOpenGL - 在倾斜的桌面上移动球
【发布时间】:2019-01-15 11:42:28
【问题描述】:

我有一个可以围绕 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 */
    }

我真的找不到根据飞机倾斜度移动球背后的数学原理。

注意:球本身不会旋转,因为我没有在球上做任何疯狂的阴影。我只希望它在移动平面上移动(平移)。此外,如图所示,球似乎在平面上“下沉”了一点。

【问题讨论】:

    标签: c++ opengl glm-math


    【解决方案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 轴的平移向量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2023-03-29
      • 2015-09-22
      相关资源
      最近更新 更多