【问题标题】:How to remove rotations from view matrix如何从视图矩阵中删除旋转
【发布时间】:2020-06-14 13:11:11
【问题描述】:

我的问题是关于从视图矩阵中移除旋转。删除翻译很容易,但我找不到从矩阵中删除旋转的任何方法。有没有办法从视图矩阵中移除旋转。

相机围绕 y 轴旋转,因此也可以查看矩阵并影响反射。

在顶点着色器中我的代码是

#version 330 core
layout(location = 0) in vec3 ModelSpaceVertexPosition;
layout(location = 2) in vec3 ModelSpaceVertexNormal;

out vec3 reflectnormal;
out vec3 reflectposition;

uniform mat4 ModelMatrix;
uniform mat4 ViewMatrix;
uniform mat4 ProjectionMatrix;

void main(){

reflectnormal =  ( ViewMatrix * ModelMatrix * vec4(ModelSpaceVertexNormal,0)).xyz;//mat3(transpose(inverse(ModelMatrix))) * ModelSpaceVertexNormal;
reflectposition =  vec3(0,0,0) - ( ViewMatrix * ModelMatrix * vec4(ModelSpaceVertexPosition,1)).xyz;//vec3(ModelMatrix * vec4(ModelSpaceVertexPosition, 1.0));
gl_Position =  ProjectionMatrix * ViewMatrix * ModelMatrix * vec4(ModelSpaceVertexPosition,1);

}

在片段着色器中我的代码是

#version 330 core

in vec3 reflectnormal;
in vec3 reflectposition;

uniform samplerCube skybox;

out vec3 color;

void main(){   
    vec3 Rtest = reflect(-reflectposition, reflectnormal);
    vec3 EnvironmentReflection = vec3(texture(skybox , Rtest));
    color = EnvironmentReflection;
}

这让我可以看到

但问题是轮换。当我旋转相机时,反射也会随着相机旋转。

如何从反射中移除旋转?

Gif视频:https://imgur.com/a/rQh7A7H

【问题讨论】:

    标签: opengl matrix glsl fragment-shader vertex-shader


    【解决方案1】:

    skybox 包含一个相对于世界空间的立方体贴图。因此,您必须计算世界空间中的反射向量 (Rtest)。


    一种可能性是将Rtest 从视图空间转换为世界空间。这可以通过片段着色器中的inverse 视图矩阵来完成:

    uniform mat4 ViewMatrix;
    
    void main()
    {
        vec3 Rtest = reflect(-reflectposition, reflectnormal);
        vec3 Rtest_world = inverse(mat3(ViewMatrix)) * Rtest;
        vec3 EnvironmentReflection = texture(skybox, Rtest_world).xyz;
        color = EnvironmentReflection;
    }
    

    无论如何,您应该避免在片段着色器中转换方向向量。在世界空间中进行计算并在世界空间而不是视图空间中计算 reflectnormalreflectposition更便宜
    您必须获取相机在世界空间中的位置,才能计算视图矢量。位置可以通过逆ViewMatrix的翻译得到:

    vec3 camera_world = inverse(ViewMatrix)[3].xyz;
    
    reflectnormal   =  (ModelMatrix * vec4(ModelSpaceVertexNormal,0)).xyz;
    reflectposition =  camera_world - (ModelMatrix * vec4(ModelSpaceVertexPosition,1)).xyz;
    

    注意,视图矩阵从世界空间转换到视图空间。因此Inverse 视图矩阵从视图空间转换到世界空间。逆视图矩阵是定义相机在世界中的位置和方向的矩阵,因此逆视图矩阵的平移是相机在世界中的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      相关资源
      最近更新 更多