如何从视图矩阵中删除旋转

How to remove rotations from view matrix

我的问题是关于从视图矩阵中删除旋转。删除翻译很容易,但我找不到任何方法来删除矩阵的旋转。有什么方法可以去除视图矩阵的旋转。

相机围绕 y-axis 旋转,因此视图矩阵也会影响反射。

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

#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

skybox 包含一个关于世界 space 的立方体贴图。因此,您必须计算世界 space.

中的反射向量 (Rtest)

一种可能性是将 Rtest 从视图 space 转换为世界 space。这可以通过片段着色器中的 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;
}

无论如何,您应该避免在片段着色器中变换方向向量。在世界space中进行计算并在世界space中计算reflectnormalreflectposition比查看[=]更便宜 35=].
您必须获取相机在世界 space 中的位置,才能计算视图向量。位置可以通过逆平移得到ViewMatrix:

vec3 camera_world = inverse(ViewMatrix)[3].xyz;

reflectnormal   =  (ModelMatrix * vec4(ModelSpaceVertexNormal,0)).xyz;
reflectposition =  camera_world - (ModelMatrix * vec4(ModelSpaceVertexPosition,1)).xyz;

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