如何从模型视图矩阵中移除旋转,以便物体始终面向相机?

6

我想让精灵图始终面向摄像机,我已经理解从模型视图矩阵中删除旋转是可能的,方法如下:

(https://dev59.com/U1XTa4cB1Zd3GeqP3qv6#5487981)

原文:

| 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);
}

实际上,旋转确实被移除了,但是所有的精灵仍然受到相机方向的不准确影响。如果我不移动相机,精灵处于它们正确的位置,但如果我移动相机它们就会“飞走”。 我做错了什么? 编辑:如果我将相机向左旋转90度,它们就处于正确的位置。

现在面临同样的问题。想知道如何通过转动相机来影响位置,以及代码中的网格向量是什么? - Omid
1个回答

7
您的建议不正确。视图矩阵定义了场景的观察方向。如果取消视图矩阵的旋转组件,则会改变视线。
您需要将模型向相反方向旋转,以使其面向视图空间的xy平面。
相反的旋转可以通过计算视图矩阵的矩阵并抵消平移分量来获得。这意味着您需要计算视图矩阵左上角3x3的逆矩阵:
mat3 invViewRot = inverse(mat3(view));
vec3 pos        = worldPos + invViewRot * mesh;

gl_Position = proj * view * model * vec4(pos, 1.0); 

1
非常感谢您的好解释!现在它可以工作了。 - SM64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接