我有一个可以绕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 */
}我真的找不到根据飞机的倾斜来移动球背后的数学原理。
注意:球本身不会旋转,因为我没有在球上做任何疯狂的阴影。我只想让它在移动的平面上移动(平移)。另外,正如图中所示,球似乎在平面上“下沉”了一点。
发布于 2019-01-15 11:13:00
听起来你想要做的是根据物体在坡道上移动的物理原理来模拟球的行为。
你有一个平面,但你可以很容易地想象这个过程,当你的平面成为三角形的斜边时,这个过程可以很容易地用于物体向下移动的物理学。
有一些非常棒的教程,例如这个;https://www.dummies.com/education/science/physics/calculating-how-far-an-object-will-slide-down-an-inclined-surface/
这篇文章描述了如何计算各种值,以便计算出当平面倾斜时球将位于何处,并且可以轻松地调整为在模拟中工作。
但是,如果只想让球沿着平面移动,这样它就不会通过平面下沉(而不是球移动的物理模拟,只是有人控制球,就像在平面上行走的角色一样),那么您可能会谈论碰撞。在这种情况下,为了让球正确地坐在平面上,你需要实现一个系统来检查球和平面之间的碰撞。检查碰撞的常用方法是为世界上的每个对象提供一个边界框,然后对对象边界框执行碰撞检查,最简单的情况是轴对齐边界框上的轴对齐边界框(AABB)。但是在你的情况下,你需要比AABB更聪明的AABB碰撞检查,因为你的飞机将需要一个定向的边界框(OBB上的OBB/AABB)。边界球体也是用于碰撞体积的常用选择。
或者,如果您的平面有旋转矩阵,则可以简单地为球创建一个水平方向向量,并在将其应用于球之前将其乘以旋转矩阵。然后你可以把这个向量加到球的位置上,这会给出一个平移向量,指向平面的x轴。
https://stackoverflow.com/questions/54169291
复制相似问题