GL Math : GLM 旋转函数旋转整个坐标系
Posted
技术标签:
【中文标题】GL Math : GLM 旋转函数旋转整个坐标系【英文标题】:GL Math : GLM rotate function rotates the entire coordinate system 【发布时间】:2014-10-04 10:47:29 【问题描述】:我做了以下转换:
// Translate my cube to origin
myCubeModelMatrix = glm::translate( myCubeModelMatrix, vec3(-pos.x, -pos.y , -pos.z) ) ;
// Rotate cube about Y axis
myCubeModelMatrix = glm::rotate( myCubeModelMatrix , vec3(0,1,0) ) ;
// Translate back to original position
myCubeModelMatrix = glm::translate( myCubeModelMatrix, vec3(pos.x, pos.y , pos.z) ) ;
问题: 第二步,我旋转立方体,它实际上是在旋转整个坐标系。因此,第三步无法将我的立方体恢复到原始位置。
观察到的输出:立方体的初始位置: X,Y,Z平移到原点后的位置: 0 ,0,0绕 Y 轴旋转后的位置: 0,0,0“尝试”平移回原始位置后的位置: SomeOtherX, Y,SomeOtherZ
请注意,在最终反向平移后,X 和 Z 坐标现在与原始坐标不同,而 Y 坐标与原始坐标相同。所以我的推断是绕Y轴的旋转实际上已经旋转了整个坐标系,因此X和Z发生了变化,但Y没有。
我在这里做错了什么?如果旋转这样做,我所有的任意轴旋转都会失败。
【问题讨论】:
这个问题是题外话,因为它与数学有关,而不是编程。 这个问题是关于一个流行的数学库的行为方式。这里的数学很清楚。 @sanjeevmk:如果你对数学很清楚,你就不会以错误的顺序乘以矩阵:) @derhass 是的,我知道我做错了什么,但这并不意味着这是一个“非编程”问题。编程问题可以是关于数学、逻辑或程序中的任何其他内容。无论如何,我应该按相反的顺序做吗? @sanjeevmk:嗯。我想避免关于编程问题的哲学讨论。我可以在这里看到双方的论点。然而,关键是你实际上弄错了数学。是的,颠倒这 3 个转换的顺序可能会解决问题。 【参考方案1】:您没有指定 Y 轴的旋转量, 如果你已经缓存了位置和旋转,你可以使用这样的东西。
glm::mat4 translation = glm::translate(glm::mat4(), glm::vec3(pos.x, pos.y, pos.z));
glm::mat4 rotation = glm::rotate(glm::mat4(), rotationAmount, glm::vec3(0, 1, 0));
myCubeModelMatrix = translation * rotation;
当然你可以优化它,但我从来没有使用过 glm,所以这取决于你。
【讨论】:
以上是关于GL Math : GLM 旋转函数旋转整个坐标系的主要内容,如果未能解决你的问题,请参考以下文章