自学内容网 自学内容网

计算机图形学-tangent space(切线空间)

常见的法线贴图是在世界坐标系下的,这会导致,如果要做模型动画,法线贴图就需要随之改变,

而Darboux框架(切线空间)下的法线贴图就会随着物体的运动,而不必更新法线贴图。

要利用Darboux框架下的法线贴图,就需要计算出像素所在的切线空间的基向量。

如何定义切线空间:

z轴:该点的法线

x轴:该点的切线,且与z轴垂直,与该点uv坐标的u对应

y轴:该点的副切线,与z轴,x轴垂直,可以利用叉乘得出,与该点uv坐标的v对应

如何将世界坐标转换为切线空间下的坐标

 mat<3,3> AI = mat<3,3>{ {view_tri.col(1) - view_tri.col(0), view_tri.col(2) - view_tri.col(0), bn} }.invert();
 //mat:矩阵,view_tri.col(x)取该点所在三角形面片第x个顶点,经过mvp变换后的世界坐标,bn:该点的法向量
 //.invet():取逆矩阵
 vec3 i = AI * vec3{varying_uv[0][1] - varying_uv[0][0], varying_uv[0][2] - varying_uv[0][0], 0};
 //varying_uv[][x]取该点所在三角形面片第x个顶点的u,v坐标
 vec3 j = AI * vec3{varying_uv[1][1] - varying_uv[1][0], varying_uv[1][2] - varying_uv[1][0], 0};
 mat<3,3> B = mat<3,3>{ {i.normalized(), j.normalized(), bn} }.transpose();
 //.transpose():求矩阵的转置

 vec3 n = (B * model.normal(uv)).normalized(); // transform the normal from the texture to the tangent space
 //n:切线空间下的法线,uv该点的uv值,model.normal(uv))取这个点的法线贴图中对应世界坐标下的法线值

假设我们最后要求的是(A,B,C)

假设f(x,y,z)= Ax+By+Cz+D;

我们已知该点所在的三角形的三个顶点的初始位置和uv位置

那么初始位置的对应轴的坐标位置相减,应该等于经过f变化后的对应坐标轴的位置相减

即view_tri.col(1) - view_tri.col(0)的x轴方向上,应该与varying_uv[0][1] - varying_uv[0][0]对应相等

A *x =b

A为构造出的view_tri.col(x) - view_tri.col(y)矩阵,经过x变换应该与b(varying_uv[u][x] - varying_uv[u][x],varying_uv[v][y] - varying_uv[v][y])相等

x为未知变量与A的逆矩阵*b相等

即可求出变换矩阵x


原文地址:https://blog.csdn.net/2303_76262050/article/details/142363026

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!