我有一个可以绕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 */
}
我无法真正找到相应于平面倾斜来移动球背后的数学原理。
注意:球本身不会旋转,因为我没有对球进行任何疯狂的遮挡。我只希望它在移动平面上移动(平移)。同样,如图所示,球似乎在平面上“下沉”了。
答案 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轴指向的平移矢量。