#6854 Score: 1
Panneiria
Participant
1 pt

这里说是计算切线,其实更准确一点是在找一条切线然后跟n和它俩的叉乘构成一个Orthonormal basis。
其实n定义了一个三维空间中的平面P,而P上的任意一条向量都与模型上的与法线n相对应的这一点相切。
代码里这个t,我感觉其实是找了一个挺巧妙的向量。
你可以这么想,n是由它在x-z平面上的投影和它的y-component构成的。你把这个投影旋转到与y轴重合,n的y-component就到了一个平行于x-z平面的平面上,那么它的x,z坐标,就是t的x,z坐标。然后很显然,t的y坐标就是n在x-z平面上的投影的模长。
不过,代码框架里的这段应该是有点问题的,n跟t并不垂直。解出来的t的x,z坐标应该是-x*y/sqrt(x*x+z*z),-z*y/sqrt(x*x+z*z)。或者x,z是对的,那y就要变成负的。总之是有点问题。
然后代码里选定了n为z轴,t为x轴,b为y轴(轴的选定满足了右手坐标系三轴的叉乘法则),所以才能看到TBN = [t b n]这段代码。这个TBN矩阵是用来把下面计算出来的perturbed normal从本地坐标系转化到世界坐标系的。

然后我也有个问题想请教一下,rasterizer的代码里这段:
Eigen::Matrix4f inv_trans = (view * model).inverse().transpose();
应该是用来把模型的法线从模型空间转化到世界空间的,但是难道不是只要inverse就够了吗,为什么还要transpose一下?

This post has received 1 vote up.