c++ - 在 GLM 旋转对象不再居中之后

标签 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)。

我怎样才能避免这种情况?

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

这是我的旋转代码:

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/

相关文章:

c++ - 如何在 Eclipse Indigo CDT C++ 中设置 libxml

c++ - 将 N x N 矩阵逆时针旋转 90 度。为什么填写值的顺序很重要?

math - 使用三角函数旋转对象后,是否可以重新计算轴对齐的边界框?

math - 如何将球体平滑地转换为半球体

c++ - 了解 glm::ortho() 的参数如何影响投影后的顶点位置

c++ - 相机跟随播放器opengl

c++ - 交叉编译: check if it is possible to build 32 bit on a 64 bit machine

c++ - 将地址分配给指向指针的指针会产生段错误

c++ - 在UB中执行多个后缀表达式(下标)评估结果

c++ - 自定义 C++ 四元数旋转无法正常工作