我想像这样旋转一个对象
Model = glm::rotate(Model, glm::radians(15.f), glm::vec3(1.0f, 0.0f, 0.0f));
它在旋转,但物体似乎也在平移(更高)。但是:分解后的翻译显示物体在他的原点(0.0f,0.0f,0.0f)。
我怎样才能避免这种情况?
编辑:我修改了我的代码。我在它应该在的位置创建了对象,而不是原点。现在我在原点创建对象,然后尝试翻译它。是一样的结果,但现在我可以看到结果了。
这是我的旋转代码:
glm::vec3 scale;
glm::quat rotation;
glm::vec3 translation;
glm::vec3 skew;
glm::vec4 perspective;
this->Translate(glm::vec3(0.0f, 0.0f, 0.0f));
Model = glm::rotate(Model, angle,vector);
glm::decompose(Model, scale, rotation, translation, skew, perspective);
fprintf(stderr, "Translation: %f, %f, %f\n", translation.x, translation.y, translation.z);
fprintf(stderr, "Rotation: %f, %f, %f\n", rotation.x, rotation.y, rotation.z);
this->Translate(glm::vec3(0.0f, 0.0f, -10.0f));
glm::decompose(Model, scale, rotation, translation, skew, perspective);
fprintf(stderr, "Translation: %f, %f, %f\n", translation.x, translation.y, translation.z);
fprintf(stderr, "Rotation: %f, %f, %f\n", rotation.x, rotation.y, rotation.z);
起初我想在原点旋转对象后查看位置和旋转的值。这看起来不错,寿 值是:
Translation: 0.000000, 0.000000, 0.000000
Rotation: 0.000000, -0.130526, 0.000000
之后我使用:
this->Translate(glm::vec3(0.0f, 0.0f, -10.0f)); //move backwards
之后的值为:
Translation: -2.588191, 0.000000, -9.659258
Rotation: 0.000000, -0.130526, 0.000000
我不知道,为什么 X 值也改变了。有人有想法吗?
最佳答案
如果我正确解释了您的坐标,则您在 z=-10
处有一架飞机。当您对该平面应用绕 x 轴(通过原点)的旋转时,它也会移动。您需要做的是围绕穿过您的平面的轴旋转它。您可以通过将旋转与将坐标系移动到您的平面的两个平移相结合来完成此操作。参见例如this question供引用。
关于你问题的第二部分:如果你组合多个旋转和平移,它们会相互影响。让我们考虑二维情况。如果旋转 45°,然后沿(局部、旋转的)x 轴移动,对象将沿对角线移动。如果您使用 glm 分解结果矩阵,则分解假定矩阵的特定顺序。当您计算Rotation * Translation
时,glm 将输出Translation * Rotation
的相应值。这就是为什么您会得到与预期不同的值。参见例如this answer供引用。
关于c++ - 在 GLM 旋转对象不再居中之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49711369/