如何从模型视图矩阵中删除旋转以使对象始终面向相机?
How to remove rotation from model-view matrix so that object always faces camera?
我试图让 sprite 始终面向相机,并且我了解到可以从模型视图矩阵中删除旋转,如下所示:
()
原文:
| xx xy xz xw |
| yx yy yz yw |
| zx zy zz zw |
| wx wy wz ww |
移除旋转:
| 1 0 0 xw |
| 0 1 0 yw |
| 0 0 1 zw |
| wx wy wz ww |
我的顶点着色器:
#version 450 core
layout (location = 0) in vec3 mesh;
layout (location = 1) in vec2 texCoord;
layout (location = 2) in vec3 worldPos;
layout (location = 3) in mat4 model;
uniform mat4 proj, view;
out Data
{
vec2 texCoord;
} outData;
void main()
{
outData.texCoord = texCoord;
// Remove rotation so that it always faces the camera
mat4 mv = view * model;
mv[0][0] = 1;
mv[0][1] = 0;
mv[0][2] = 0;
mv[1][0] = 0;
mv[1][1] = 1;
mv[1][2] = 0;
mv[2][0] = 0;
mv[2][1] = 0;
mv[2][2] = 1;
gl_Position = proj * mv * vec4(mesh + worldPos, 1);
}
旋转确实被移除了,但所有精灵仍然不准确地受到相机方向的影响。如果我不移动相机,精灵就会处于正确的位置,但如果我移动它,它们就会 "fly away".
我做错了什么?
编辑:如果我将相机向左旋转 90 度,它们就会处于正确的位置。
您的建议不正确。视图矩阵定义了场景的外观。如果你取消视图矩阵的旋转分量,你改变了视线。
您必须沿视图的相反方向旋转模型,以使其面向视图空间的 xy 平面。
相反的旋转可以通过计算视图矩阵的inverse
矩阵并使平移分量无效来得到。这意味着你必须计算视图矩阵左上角 3x3 的逆矩阵:
mat3 invViewRot = inverse(mat3(view));
vec3 pos = worldPos + invViewRot * mesh;
gl_Position = proj * view * model * vec4(pos, 1.0);
我试图让 sprite 始终面向相机,并且我了解到可以从模型视图矩阵中删除旋转,如下所示:
()
原文:
| xx xy xz xw |
| yx yy yz yw |
| zx zy zz zw |
| wx wy wz ww |
移除旋转:
| 1 0 0 xw |
| 0 1 0 yw |
| 0 0 1 zw |
| wx wy wz ww |
我的顶点着色器:
#version 450 core
layout (location = 0) in vec3 mesh;
layout (location = 1) in vec2 texCoord;
layout (location = 2) in vec3 worldPos;
layout (location = 3) in mat4 model;
uniform mat4 proj, view;
out Data
{
vec2 texCoord;
} outData;
void main()
{
outData.texCoord = texCoord;
// Remove rotation so that it always faces the camera
mat4 mv = view * model;
mv[0][0] = 1;
mv[0][1] = 0;
mv[0][2] = 0;
mv[1][0] = 0;
mv[1][1] = 1;
mv[1][2] = 0;
mv[2][0] = 0;
mv[2][1] = 0;
mv[2][2] = 1;
gl_Position = proj * mv * vec4(mesh + worldPos, 1);
}
旋转确实被移除了,但所有精灵仍然不准确地受到相机方向的影响。如果我不移动相机,精灵就会处于正确的位置,但如果我移动它,它们就会 "fly away".
我做错了什么?
编辑:如果我将相机向左旋转 90 度,它们就会处于正确的位置。
您的建议不正确。视图矩阵定义了场景的外观。如果你取消视图矩阵的旋转分量,你改变了视线。
您必须沿视图的相反方向旋转模型,以使其面向视图空间的 xy 平面。
相反的旋转可以通过计算视图矩阵的inverse
矩阵并使平移分量无效来得到。这意味着你必须计算视图矩阵左上角 3x3 的逆矩阵:
mat3 invViewRot = inverse(mat3(view));
vec3 pos = worldPos + invViewRot * mesh;
gl_Position = proj * view * model * vec4(pos, 1.0);