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 与本地空间的主要内容,如果未能解决你的问题,请参考以下文章