【问题标题】:How to remove rotation from model-view matrix so that object always faces camera?如何从模型视图矩阵中删除旋转以使对象始终面向相机?
【发布时间】:2020-08-16 22:51:31
【问题描述】:

我正在尝试使精灵始终面向相机,并且我知道可以从模型视图矩阵中移除旋转,如下所示:

(https://stackoverflow.com/a/5487981/12817501)

原文:

| 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 度,它们就会处于正确的位置。

【问题讨论】:

    标签: opengl matrix rotation glsl shader


    【解决方案1】:

    您的建议不正确。视图矩阵定义了场景的外观。如果取消视图矩阵的旋转分量,就会改变视线。
    您必须沿视图的相反方向旋转模型,以使其面向视图空间的 xy 平面。
    通过计算视图矩阵的inverse 矩阵并取消平移分量可以得到相反的旋转。这意味着您必须计算视图矩阵左上角 3x3 的逆矩阵:

    mat3 invViewRot = inverse(mat3(view));
    vec3 pos        = worldPos + invViewRot * mesh;
    
    gl_Position = proj * view * model * vec4(pos, 1.0); 
    

    【讨论】:

    • 非常感谢您的精彩解释!它现在正在工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2013-03-14
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 2017-10-14
    • 2012-05-05
    相关资源
    最近更新 更多