【发布时间】: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 */
}
我真的找不到根据飞机倾斜度移动球背后的数学原理。
注意:球本身不会旋转,因为我没有在球上做任何疯狂的阴影。我只希望它在移动平面上移动(平移)。此外,如图所示,球似乎在平面上“下沉”了一点。
【问题讨论】: