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

Posted

技术标签:

【中文标题】在 GLM 旋转对象不再居中之后【英文标题】:After GLM Rotation object is not centered anymore 【发布时间】:2018-04-07 19:50:55 【问题描述】:

我正在尝试像这样旋转一个对象

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

【问题讨论】:

你能澄清一下'分解的翻译节目'是什么意思吗?你的物体的原点是什么(质心、角落等)?我认为问题是您旋转对象(例如立方体),原点位于 X 轴的拐角处(因为您使用向量 1,0,0 作为第三个参数),所以它围绕边缘旋转,而不是轴。跨度> 我刚刚使用了 glm::decompose(Model, scale, rotation, translation, skew, perspective);打印出旋转后的翻译,它显示: Translation: 0.000000, 0.000000, 0.000000 。这是截图:imgur.com/KlAEjJS 你知道相机的方向是什么吗?从屏幕截图来看,它似乎是 Z 轴。所以尝试通过将 vec3 的最后一个参数设置为 1 来沿 Z 轴旋转对象:Model = glm::rotate(Model, glm::radians(15.f), glm::vec3(0.0f, 0.0f, 1.0f)); 你说得对,它是 Z 轴。必须做什么,任何轴上的旋转都不会“移动”对象? 实际上它并没有移动,它只是在拐角处旋转。围绕质心旋转立方体的最简单解决方案是指定立方体的角,而不是通过坐标 0.0, 1.0(我想你现在这样做),而是通过 -1.0, 1.0。 (使用 -1.0 而不是 0.0) 【参考方案1】:

如果我正确解释了您的坐标,那么您在z=-10 有一架飞机。当您对该平面应用绕 x 轴(通过原点)的旋转时,它也会移动。您需要做的是围绕通过您的平面的轴旋转它。您可以通过将旋转与将坐标系移动到您的平面的两个平移相结合来做到这一点。参见例如this question供参考。

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于在 GLM 旋转对象不再居中之后的主要内容,如果未能解决你的问题,请参考以下文章

如何在猫头鹰旋转木马内居中img?

如何在 python 中将二进制图像的内容/对象居中?

在 iOS 中旋转设备时将内容水平居中

居中问题--不再凌乱

在 Core Graphic 中绘制的线条之间创建一个居中旋转的 UILabel

ScrollView 和 ImageView - 多次设备旋转后图像未居中