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

OpenGL - Move ball on tilted tabletop

本文关键字:移动 桌面 倾斜 OpenGL-      更新时间:2023-10-16

我有一个可以围绕OX和OZ轴旋转的桌面,这个桌面上有一个球。我需要让球根据它的倾斜在平面上移动。球不需要有加速度(在一定倾斜时速度是恒定的)。

以下是我希望球移动的方式。

球体网格的创建方式如下:

{
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是球体的平移向量3。

平面网格是这样创建的

{
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 */
}

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

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

听起来你想做的是根据物体在斜坡上移动的物理原理对球的行为进行建模。

你有一个平面,但你可以想象,当你的平面形成三角形的斜边时,这个过程很容易适用于物体向下倾斜的物理过程。

有一些非常棒的教程,例如这一个;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轴的平移向量。