glm::translate 与本地空间

Posted

技术标签:

【中文标题】glm::translate 与本地空间【英文标题】:glm::translate with local space 【发布时间】:2014-02-18 22:29:58 【问题描述】:

我想根据自己的空间(方向)而不是世界空间来移动矩阵。

具体来说,我想移动视图矩阵/“相机”。

glm::mat4x4 view = glm::lookAt(glm::vec3(1.1f, 1.3f, 1.2f),
                                   glm::vec3(0.0f, 0.0f, 0.0f),
                                   glm::vec3(0.0f, 1.0f, 0.0f));

view=glm::rotate(view, r, glm::vec3(0,1,0));
view=glm::translate(view, glm::vec3(x,y,z));

无论旋转如何,平移都是相等的,但我想根据相机面对的位置进行平移,例如当相机面向 x 轴并且我平​​移 z 时,它应该沿世界轴 x 平移。如何做到这一点?

【问题讨论】:

【参考方案1】:

如果你想操纵相机位置,你应该存储相机位置,只在需要时才将其放入视图空间。

glm::mat4 camera =  glm::inverse(glm::lookAt(
                               glm::vec3(1.1f, 1.3f, 1.2f),
                               glm::vec3(0.0f, 0.0f, 0.0f),
                               glm::vec3(0.0f, 1.0f, 0.0f)));
camera = glm::rotate(camera, r, glm::vec3(0,1,0));
camera = glm::translate(camera, glm::vec3(x,y,z));
glm::mat4 view = glm::inverse(camera);

也有可能对视图矩阵进行预乘法是您想要的,但我不确定,因为我尽量避免处理前后乘法,就好像我的生活依赖于它一样。

glm::mat4 view =  glm::lookAt(
                               glm::vec3(1.1f, 1.3f, 1.2f),
                               glm::vec3(0.0f, 0.0f, 0.0f),
                               glm::vec3(0.0f, 1.0f, 0.0f)));
view = glm::rotate(glm::mat4(), r, glm::vec3(0,1,0)) * view;
view = glm::translate(glm::mat4(), glm::vec3(x,y,z)) * view;

【讨论】:

以上是关于glm::translate 与本地空间的主要内容,如果未能解决你的问题,请参考以下文章

利用键盘左右键使图像左右移动,上下键使图像的两个纹理可见度比例上下调整

glm::translate - 它是不是从向量构建矩阵?

一些opengl和glm解释

包含/使用 GLM 库的问题

GLM 中的矩阵除法

GL Math : GLM 旋转函数旋转整个坐标系