GLM后旋转对象不再居中

时间:2018-04-07 19:50:55

标签: c++ rotation glm-math

我正在尝试旋转像

这样的对象
Model = glm::rotate(Model, glm::radians(15.f), glm::vec3(1.0f, 0.0f, 0.0f));

它在旋转,但物体似乎也被翻译(它更高)。但是:分解的翻译显示对象在他的起源(0.0f,0.0f,0.0f)。

我该如何避免这种情况?

编辑:我修改了我的代码。我在它应该的位置创建了对象,而不是原点。现在我在origin创建对象,然后尝试翻译它。这是相同的结果,但现在我可以看到结果。

这是我的轮换代码:

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值也会发生变化。有人有想法吗?

2 个答案:

答案 0 :(得分:1)

如果我正确解释您的坐标,您的飞机位于z=-10。当您围绕x轴(通过原点)应用旋转到此平面时,它也将移动。您需要做的是围绕穿过飞机的轴旋转它。您可以通过将旋转与将坐标系移动到平面的两个平移相结合来实现此目的。参见例如this question供参考。

关于问题的第二部分:如果组合多个旋转和翻译,它们会相互影响。让我们考虑二维情况。如果旋转45°然后沿(局部旋转的)x轴移动,则对象沿对角线移动。如果用glm分解得到的矩阵,则分解假定矩阵的某个顺序。在您计算Rotation * Translation时,glm将输出Translation * Rotation的相应值。这就是为什么你得到的价值不同于你的预期。参见例如this answer供参考。

答案 1 :(得分:0)

没有。现在我知道我的问题。当我使用

this->Translate(glm::vec3(0.0f, 0.0f, -10.0f));

旋转后,我沿着物体上的Z轴移动它。不是全球Z轴。我现在必须弄清楚如何在全局轴上移动一个对象。