我有一个可以绕 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 */
}
我真的找不到根据飞机倾斜度移动球的数学原理。
注意:球本身不会旋转,因为我没有在球上做任何疯狂的阴影。我只是想让它在移动的平面上移动(翻译)。此外,如图所示,球似乎在平面上“下沉”了一点。
最佳答案
听起来您想要做的是根据物体在斜坡上移动的物理特性来模拟球的行为。
你有一架飞机,但你可以想象这个过程很容易适用于物体沿着斜坡移动的物理现象,因为你的飞机使三角形的斜边。
有一些非常棒的教程,例如这个; https://www.dummies.com/education/science/physics/calculating-how-far-an-object-will-slide-down-an-inclined-surface/
本文介绍了如何计算您需要的各种值,以便计算出飞机倾斜时球的位置,并且可以很容易地适应您的模拟。
但是,如果您只是想让球沿着平面移动,这样它就不会“下沉”穿过平面(不是球移动的物理模拟,只是有人控制球,就像角色在平面上行走一样)你可能在谈论碰撞。在这种情况下,为了让球正确地位于平面上,您需要实现一个系统来检查球和平面之间的碰撞。检查碰撞的一种常见方法是给世界中的每个对象一个边界框,然后对对象边界框执行碰撞检查,最简单的情况是轴对齐边界框对轴对齐边界框 (AABB)。但在你的情况下,你需要比 AABB 更聪明的东西来进行 AABB 碰撞检查,因为你的飞机需要一个定向边界框(OBB/AABB 上的 OBB)。边界球体也是用于碰撞体积的常见选择。
或者,如果您的平面有一个旋转矩阵,您可以简单地为球创建一个水平方向 vector ,并在将它应用到球之前将其乘以旋转矩阵。然后您可以将该 vector 添加到球的位置,这将为您提供一个指向平面 x 轴的平移 vector 。
关于c++ - OpenGL - 在倾斜的桌面上移动球,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54169291/