我一直在阅读其他关于如何通过将枢轴平移到原点、旋转以及向后平移来围绕 OpenGL 中的点旋转对象的文章。但是,我似乎无法让它发挥作用。我有一个立方体,并使用 glm::perspective 和 glm::lookAt 来生成投影和 View 矩阵。
glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
// Camera matrix
glm::mat4 View = glm::lookAt(
glm::vec3(0,3.5,-5),
glm::vec3(0,0,0),
glm::vec3(0,1,0)
);
// Model matrix : an identity matrix (model will be at the origin)
glm::mat4 Model = glm::mat4(1.0f);
然后我在 while 循环内对模型矩阵应用转换,如下所示:
if (glfwGetKeyOnce(window, GLFW_KEY_UP))
{
Model = translate(Model, vec3(1.0f, 0.0f, 0.0f));
Model = rotate(Model, 90.0f, vec3(1.0f, 0.0f, 0.0f));
Model = translate(Model, vec3(-1.0f, 0.0f, 0.0f));
}
mat4 MVP = Projection * View * Model;
在我的顶点着色器中,我有这个:
gl_Position = MVP * vec4(vertexPosition_modelspace,1);
但是,这仍然只是使立方体绕其中心旋转。如果我摆脱对 glm::translate 的调用,而是通过调整顶点的 x 位置进行平移,则它可以正常工作。但我认为这不是正确的做法。我在这里缺少什么?
最佳答案
if (glfwGetKeyOnce(window, GLFW_KEY_UP))
{
Model = translate(Model, vec3(1.0f, 0.0f, 0.0f));
Model = rotate(Model, 90.0f, vec3(1.0f, 0.0f, 0.0f));
Model = translate(Model, vec3(-1.0f, 0.0f, 0.0f));
}
mat4 MVP = Projection * View * Model;
尝试用“竖起大拇指的手”来可视化这段代码。拇指是 x 轴。首先举起手,然后绕圈走,最后放下手。
您很可能想绕另一个轴旋转。
请记住,还有更现代的方法可以进行旋转,例如四元数。这将为您节省大量操作。
关于c++ - 使用 GLM 围绕点进行 OpenGL 旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26961471/