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)));
这不会导致旋转矩阵(除非xpos
和zpos
恰好为零)。 lookAt
将创建一个可以分解为r * t(-pos)
的变换矩阵(无论您使用什么pos
调用它)。构建此矩阵的 转置 将导致平移列被转置到第四行,这完全会破坏最终的w
坐标。
【讨论】:
那么我该如何设置旋转矩阵呢? 最简单的方法似乎是直接从你的相机右、上和前向量构建一个正交矩阵。当您希望平面对象始终面向相机时,这仅意味着您要将其所在的平面旋转到平行于图像平面的平面。您的相机的右和上向量定义了该平面。以上是关于GLM 视图矩阵导致模型矩阵无效的主要内容,如果未能解决你的问题,请参考以下文章