【发布时间】:2019-01-13 10:33:08
【问题描述】:
我有一个旋转平面和一个盒子。当飞机旋转并倾斜一个角度时,我希望盒子保持在飞机上的相同位置。
Here平面没有倾斜,
当 here 飞机倾斜时,
但盒子不跟随平面向下。
在每次更新时,我都会渲染该框,并通过glm::translate 中的给定vec3 对其进行翻译:
{
glm::mat4 modelMatrix = glm::mat4(1);
modelMatrix = glm::translate(modelMatrix, glm::vec3(boxOX, boxOY, boxOZ));
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.2f));
RenderSimpleMesh(meshes["box"], shaders["ShaderLab8"], modelMatrix, glm::vec3(1, 0, 0));
}
飞机通过按WASD键移动:
if (window->KeyHold(GLFW_KEY_W) && (anglePlaneOX > -90.0f)) {
anglePlaneOX -= deltaTime * DELTA_SLOPE;
}
if (window->KeyHold(GLFW_KEY_S) && (anglePlaneOX < 90.0f)) {
anglePlaneOX += deltaTime * DELTA_SLOPE;
}
if (window->KeyHold(GLFW_KEY_D) && (anglePlaneOZ > -90.0f)) {
anglePlaneOZ -= deltaTime * DELTA_SLOPE;
}
if (window->KeyHold(GLFW_KEY_A) && (anglePlaneOZ < 90.0f)) {
anglePlaneOZ += deltaTime * DELTA_SLOPE;
}
我尝试了以下
按A键时:
boxOY += deltaTime * (1 - (float)cos((double)anglePlaneOZ * PI / 180));
当按下 W 键时:
boxOX -= deltaTime * sinf(anglePlaneOX * PI / 180);
但这些似乎都不起作用。
为了使盒子相应地移动到平面,数学关系是什么?
【问题讨论】:
标签: c++ opengl glm-math coordinate-transformation