【发布时间】:2017-12-18 21:04:43
【问题描述】:
我正在构建一个建模程序,我想对它们自己空间中的对象进行转换,然后将该单个对象分配给一个组以围绕该组旋转的另一个轴旋转。但是,我还希望能够在对象自身的空间中进行转换。
操纵单个对象,我选择对象的中心。
glm::mat4 transform;
transform = glm::translate(transform, - obj.meshCenter);
glm::mat4 transform1;
transform1 = glm::translate(transform1, obj.meshCenter);
obj.rotation = transform1*obj.thisRot*transform;
然后我将它发送到着色器,
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(obj.translation*obj.rotation*objscale);
我现在想围绕另一个轴旋转这个对象,比如 45 度的 (5,0,0) 轴。
我现在有:
glm::mat4 groupR;
groupR = glm::rotate(groupR,glm::degrees(45.0f),glm::vec3(5,0,0));
obj.groupRotation = groupR;
glUniformMatrix4fv(modelLoc, 1, GL_FALSE,
glm::value_ptr(obj.groupRotation*obj.translation*obj.rotation*objscale)
我现在已将对象从其本地空间移动到组空间。 当与 Group 的旋转相结合时,我现在在对象自己的空间中操作转换有点困难。 当我像这样将 groupR 轴设置为 (0,1,0) 时,我的成功有限:
///Translating object in its own space///
glm::mat4 R = obj.groupRotation;
obj.translation = glm::inverse(R) * obj.translate * R;
这里的问题是,如果 R 的旋转轴(组的旋转)等于 (0,1,0),这只会在其自己的空间中正确平移对象:
///Rotating object in its own space///
glm::mat4 R = obj.groupRotation;
obj.rotation = glm::inverse(R) * obj.rot * R;
再一次,旋转不正确。我在想也许我必须撤消 groupR 的轴平移?然后在某个地方重新应用它?
【问题讨论】:
-
我试图做的是撤消 groupRotation 以便我的本地变换计算正确。上面的逆操作会将旋转和平移(尚未尝试缩放)返回到本地空间。挂断是如果 groupRotation 的轴不在原点。我将尝试将轴位置的反向平移插入到上面的矩阵乘法中。我只是不确定它应该是什么顺序,或者它是否会起作用。不过我会在早上好好尝试一下。
-
不能直接修改
obj.thisRot,重新计算组合变换吗?这将不太容易出错。顺便说一句,我不会指望glm::value_ptr()为在调用glm::value_ptr()后立即删除的临时对象返回有效地址。
标签: c++ opengl rotation glm-math coordinate-transformation