GLM 视图矩阵导致模型矩阵无效

Posted

技术标签:

【中文标题】GLM 视图矩阵导致模型矩阵无效【英文标题】:GLM view matrix causing model matrix to have no effect 【发布时间】:2016-04-16 05:37:06 【问题描述】:

我正在尝试让一个对象始终面向相机。我寻找了一种方法来做到这一点,但问题是当我将这部分放入视图矩阵时,模型矩阵不会影响任何东西。我怎样才能让它使用模型矩阵来翻译它?代码:

GLuint transformLocation=glGetUniformLocation(textureShaders,"transform");
glm::mat4 transform;
glm::mat4 model;
glm::vec3 playerPosition=user.getPosition();

model=glm::translate(model,glm::vec3(xpos,0.0f,zpos));

glm::mat4 view;
     view=glm::lookAt(cam.getPositionVector(),cam.getPositionVector()+cam.getFrontVector(),cam.getUpVector());
glm::mat4 rotationMatrix=glm::transpose(glm::lookAt(glm::vec3(xpos,0.0f,zpos),playerPosition,glm::vec3(0.0f,1.0f,0.0f)));
view*=rotationMatrix;
glm::mat4 projection;
projection=glm::perspective(45.0f,(float)900/(float)600,0.1f,100.0f);

transform=projection*view*model;

【问题讨论】:

“模型矩阵不会影响任何东西”是什么意思? 我放在那里的翻译似乎不起作用。 (它停留在(0,0,0)) 嗯,你检查过你的变换矩阵现在是什么样子了吗? 代码在我看来没问题。问题可能源于它之外。您是否将“变换”矩阵设置为着色器统一(或只是投影*视图)? 我将制服正确设置到着色器中,因为旋转有效,这只是我遇到问题的翻译。 【参考方案1】:

您的“旋转”矩阵没有任何意义:

rotationMatrix=glm::transpose(glm::lookAt(glm::vec3(xpos,0.0f,zpos),playerPosition,glm::vec3(0.0f,1.0f,0.0f)));

不会导致旋转矩阵(除非xposzpos 恰好为零)。 lookAt 将创建一个可以分解为r * t(-pos) 的变换矩阵(无论您使用什么pos 调用它)。构建此矩阵的 转置 将导致平移列被转置到第四行,这完全会破坏最终的w 坐标。

【讨论】:

那么我该如何设置旋转矩阵呢? 最简单的方法似乎是直接从你的相机右、上和前向量构建一个正交矩阵。当您希望平面对象始终面向相机时,这仅意味着您要将其所在的平面旋转到平行于图像平面的平面。您的相机的右和上向量定义了该平面。

以上是关于GLM 视图矩阵导致模型矩阵无效的主要内容,如果未能解决你的问题,请参考以下文章

GLSL 和 GLM 之间的矩阵数学不一致,或者是不是存在“坏”视图矩阵之类的东西

有没有办法从glm中的视图矩阵中提取变换矩阵?

如何缩放使用 glm::lookat() 获得的矩阵?

GLSL 中的正常旋转

从视图矩阵中清除比例组件。独立于相机的缩放

使用 GLM 正交投影矩阵将三角形顶点放在错误的位置