首页 > 其他分享 >Normal Matrix(法向量变换矩阵)

Normal Matrix(法向量变换矩阵)

时间:2022-10-21 16:35:20浏览次数:76  
标签:Matrix Normal ModelView 矩阵 transpose 向量 gl NormalMatrix

我们都知道gl的坐标系统。它的工作是将坐标从一个坐标系转到另一个坐标系。其中我们用到了几个转换矩阵。其中最为重要的是模型(Model)、视图(View)、投影(Projection)三个矩阵。因为涉及光线光照部分的计算通常都在eye space中进行计算,所以我们需要把坐标转换到eye space中,否则基于眼睛位置的效果(比如镜面反射)就很难实现。一般通过以下代码将vertex到 eye space:

vertexEyeSpace = gl_ModelViewMatrix * gl_Vertex;

为什么我们不能对法向量(normal vector)进行同样的运算来转换到 eye space 呢?首先,法向量(normal vector)是一个三维向量,而 ModelView 是一个 44 的矩阵。其次,因为法向量代表方向,我们想要做的就是将该方向变换到 eye space 中。那么我们是否可以直接用modelView左上角的 33 矩阵来做这个变换呢?如果可以,我们只需要用下面的代码就可以完成变换:
normalEyeSpace = vec3(gl_ModelViewMatrix * vec4(gl_Normal, 0.0));
很遗憾,上面的变换只适用于某些情况。这也是因此我们引入了 gl_NormalMatrix 的原因。
我们先来推导下gl_NormalMatrix:
首先我们来看下下面这张图:

 

 

其中N是我们的法向量,T是三角形的切向量。那么我们想要求的gl_NormalMatrix应该满足变换前后方向不变。假设变换后的切向量为T',变换后的法向量为N'。所以应该满足:
T' * N' = T * N = 0。
下面是推导过程:
c代表因为,s代表所以:
c:
T = (P2 - P1)
s:
ModelView * T = ModelView * (P2 - P1) = ModelView * P2 - ModelView * P1 = P2' - P1'
 => ModelView * T = T'
c:
N' =  NormalMatrix * N
T' = ModelView * T
T' * N' = T * N = 0
s:
(NormalMatrix * N) · (ModelView * T) = 0
=>
transpose(NormalMatrix * N) * (ModelView * T)  //向量点积,相当于把一个向量转置再乘以另外一个向量
transpose(N) * transpose(NormalMatrix) * ModelView * T = 0
c:
N * T = 0  //因为N与T点积为0,也就是transpose(N)*T为0(点积相当于转置一个向量后乘以另外一个向量),所以上面式子中间部分为单位矩阵,因为向量乘以单位矩阵等于自身,即transpose(NormalMatrix)*ModelView=单位矩阵I
s:
 transpose(NormalMatrix) * ModelView = I
=> NormalMatrix = transpose((ModelView)^(-1))


即NormalMatrix是ModelView矩阵逆的转置。

我们也可以看到,当M(ModelView)矩阵为正交矩阵时(即M的转置等于M的逆)时,法向量变换阵(NormalMatrix)等于M阵。这就是上文所说的特例。

重要结论:
NormalMatrix是ModelView矩阵逆的转置

参考:
http://www.lighthouse3d.com/tutorials/glsl-12-tutorial/the-normal-matrix/



作者:雨幻逐光
链接:https://www.jianshu.com/p/e001aec29976
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:Matrix,Normal,ModelView,矩阵,transpose,向量,gl,NormalMatrix
From: https://www.cnblogs.com/DvsJ/p/16813888.html

相关文章

  • 广义矩阵乘法中二元运算符的条件
    一般地,如果矩阵中的加法和乘法满足一个半环,那么矩阵乘法满足交换律。一个半群由集合\(A\)和两个定义在\(A\)上的二元运算\(\oplus\)和\(\otimes\)构成,其中:\((A......
  • 矩阵连乘最小相乘次数的思想
    矩阵的乘法矩阵的概念来自线性代数矩阵乘法:只有当左边矩阵的列数等于右边矩阵的行数时,它们才可以相乘。结果为前一个矩阵的行元素×后一个矩阵的列元素  矩阵相......
  • 【数据结构-矩阵】矩阵的相关公式推导
    目录1数组1.1一维数组1.2二维数组2对称矩阵2.1上三角部分(i≤j)2.2下三角部分(i≥j)3三角矩阵3.1上三角矩阵(i≤j的元素不全为0)3.2下三角矩阵(i≥j的元素不......
  • 填空题:矩阵
    下列给定程序中,函数fun的功能是:有N×N矩阵,以主对角线为对称线,对称元素相加并将结果存放在左下三角元素中,右上三角元素置为0。例如,若N=3,有下列矩阵:1234567......
  • 矩阵与线性方程组
    高斯消元当我们用线性方程组来理解矩阵时,我们有矩阵的高斯消元。高斯消元本质上是一系列的对矩阵的“变换”或者说“操作”,这种操作总共有三种:1)给某一整行乘上非零常数\(......
  • Sam's Numbers 矩阵快速幂优化dp
    ​​https://www.hackerrank.com/contests/hourrank-21/challenges/sams-numbers​​设dp[s][i]表示产生的总和是s的时候,结尾符是i的所有合法方案数。那么dp[s][i]可以由dp[......
  • 796. 子矩阵的和
    输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。对于每个询问输出子矩阵中所有数的和。输入格式......
  • 矩阵还原——————数据结构作业
    /*给定一个一维数组,将其转化为对称矩阵(关于主对角线对称)*/#include<stdio.h>#include<string.h>constintMAXN=1e3;intmat[MAXN][MAXN];inta[MAXN];in......
  • FZU 1061 矩阵连乘
     Problem1061矩阵连乘Accept:445    Submit:1699TimeLimit:1000mSec    MemoryLimit:32768KB ProblemDescription给定n个矩阵{A1,A2,...,An},考察这n......
  • 矩阵快速幂小结
       矩阵快速幂大概是用来解决这样一类问题,当你知道了一个递推式比如a[n]=a[n-1]+a[n-2]题目要求你求出a[n]。如果n大于1亿怎么办?不可能用for。解决办法就是根据递推......