如何从视图矩阵中删除旋转
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中计算reflectnormal
和reflectposition
比查看[=]更便宜 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。逆视图矩阵是定义相机在世界中的位置和方向的矩阵,因此逆视图矩阵的平移就是相机在世界中的位置。
我的问题是关于从视图矩阵中删除旋转。删除翻译很容易,但我找不到任何方法来删除矩阵的旋转。有什么方法可以去除视图矩阵的旋转。
相机围绕 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中计算reflectnormal
和reflectposition
比查看[=]更便宜 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。逆视图矩阵是定义相机在世界中的位置和方向的矩阵,因此逆视图矩阵的平移就是相机在世界中的位置。