【发布时间】: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)