我正在尝试实现函数,可以在本地或全局方向上旋转/平移对象,就像在三维建模软件中一样,使用glm库。类似这样:
void Rotate(float x, float y, float z, bool localOrientation);
但我不知道如何让它工作。本地旋转应该只是像这样:(?)
m_Orientation *= glm::rotate(x, glm::vec3(1,0,0);
m_Orientation *= glm::rotate(y, glm::vec3(0,1,0);
m_Orientation *= glm::rotate(z, glm::vec3(0,0,1);
// (m_Orientation is glm::mat4)
但是如何将其与本地方向结合起来呢?实际上,我需要在世界方向中旋转旋转矩阵,对吗? 我希望你知道我所说的本地和全局方向旋转/平移的含义,就像在三维建模程序中一样。在大多数程序中,您可以切换本地和全局。
那么我该如何计算前方/右侧/向上矢量呢? 通常应该是这样的,对吗?
forward = m_Orientation * glm::vec4(0,0,-1,0);
我用下面的方法尝试了全局旋转:
m_GlobalOrientation = glm::rotate(m_GlobalRotation.x, glm::vec(1,0,0);
m_GlobalOrientation *= glm::rotate(m_GlobalRotation.y, glm::vec(0,1,0);
m_GlobalOrientation *= glm::rotate(m_GlobalRotation.z, glm::vec(0,0,1);
但是只有x轴旋转是在全局方向上的,y和z轴旋转是在本地方向上的,因为它已经围绕x轴旋转了。所以我需要同时旋转所有3个角度(?)
将本地翻译应该只是将翻译值添加到当前翻译中,并且本地翻译应该是glm::inverse(m_Orientation) * translationVector,对吗?