计算机图形学-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)!