OpenGL-法向量变换

这两天在看OpenGL光照的时候,教程上提到了法向量变换。这里就来推导一下。

法向量变换

为什么要法向量变换

很简单,因为如果你直接对法向量采用模型矩阵model或者其他比那还的话,会改变法向量的方向。你可以将法向量(x,y)看作一个位置向量,然后对其做M变换。可以知道,这个点的坐标必定变化。那么其方向向量就会变化,这样法向量也就变化了(除非它是沿着其方向向量移动)。

法向量变换矩阵的推导

推导很简单。首先给出空间中齐次坐标的平面方程:

nxX+nyY+nzZ+nwW=0 写成矩阵就是:

[nxnynznw][X Y Z W]=0

然后我们在中间乘上变换矩阵M和其逆M1来方便我们寻找法向量变换方程:

[nxnynznw]M1M[X Y Z W]=0

这个时候,M[X Y Z W]就是经过变化之后的顶点了,那么显然[nxnynznw]M1就是变换后的法向量了,也就是说存在:

$$ [nxnynznw] M^{-1}

[nxeye nyeye nzeye nweye] $$

那么对左边式子转置一下,得到:

$$ (M^{-1})^T [nx ny nz nw]

[nxeye nyeye nzeye nweye] $$

所以我们就可以知道,通过(M1)T变换之后,可以将原本的法向量变换到观察空间中了。所以法向量变换矩阵就是(M1)T其中M是将点变换的新空间的矩阵(如果你只将点变换到全局空间中就是model,变换到观察空间中就是model*view

updatedupdated2024-12-152024-12-15