夏天/isummer

Sun of my life !Talk is cheap, Show me the code! 追风赶月莫停留,平芜尽处是春山~

博客园 首页 新随笔 联系 管理

“模型法线到视图法线”的变换矩阵(normal matrix)
作用:用于在 光照计算(lighting) 中,将 模型空间中的法线方向 正确地转换到 视图空间(或摄像机空间),以便与光照方向、视点方向等在同一坐标系下进行正确的光照计算

 实际使用:三角面片的法向量n,用NormalMatrix矩阵左乘n,则得到的是在:视图空间(摄像机坐标系)中的法向量表示。

1.  为什么要转换法线方向?

  在3D渲染中,每个顶点(或片元)都会进行光照计算,例如:

diffuse = max(dot(N, L), 0.0)
specular = pow(max(dot(R, V), 0.0), shininess)

其中:

  • N = 法线向量,(例如:三角面片的发现向量)

  • L = 光源方向

  • V = 视线方向

  • 这些向量必须在 同一个坐标系中计算(通常是视图空间)。

2 问题:模型空间中的法线不能直接用

模型经过各种变换(旋转、平移、缩放、剪切)后:

  • 模型的顶点位置会改变。

  • 法线方向也会被扭曲,尤其是当模型有 非均匀缩放

例如:如果模型在X方向缩放2倍,法线也会被“压扁”,导致光照变暗或错误。

  所以法线(模型三角面片的法线)需要用专门的矩阵变换来保持正确的方向。

  

3. 解决方法:使用 NormalMatrix(法向量矩阵:作用专门用于三角面片法向量的变换)

  法线矩阵的计算,需要看转化后的“操作空间”。

  (1)如果目标是世界坐标系:就是希望得到在世界坐标系下的三角面片的法向量。

  NormalMatrix=模型变换矩阵M的逆矩阵的转置。

  (2)如果目标是在视图坐标系(相机坐标系下):希望得到在视图坐标系下的三角面片的法向量。

  NormalMatrix=视图变换V * 模型变换矩阵M的逆矩阵的转置。

如下:

image

 Nword:表示的意思。如果模型到世界坐标系存在:模型矩阵,则模型坐标系中的法向量,转化为世界坐标系中的法向量表示,就是用: 

代码实现:

view_normal_matrix = view3x3 * model3x3.inverse().transpose();

4. 用途总结(重点)

image

 在着色器中使用:

// uniform matrices
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat3 normalMatrix; // (viewMatrix * modelMatrix⁻¹)ᵀ 的前3x3部分

in vec3 normal_model;//模型坐标系中的法向量
out vec3 normal_view;

void main() {
    normal_view = normalize(normalMatrix * normal_model);//计算后,得到视图空间(相机空间)的对应的法向量表示
}

 

 

 

 

 

 

 

 

endl;

 
posted on 2025-11-06 20:34  夏天/isummer  阅读(3)  评论(0)    收藏  举报