点的平移变换
我们知道对一个坐标点进行平移,只需要对其各个分量(x,y,z)做加法即可
x,y,z表示偏移值,Px表示原有坐标
如果用矩阵的方式,对一个按列排布的三维坐标进行左乘,那么这个变换逆矩阵应该是
不对,如果用这个3x3矩阵的话,无论如何我们都得不到与上面P'相同的结果,所以我们引入一个新的分量1,填充到矩阵和坐标点的第四个分量当中去,得到一个4x4的矩阵
也称作齐次坐标,通过n+1维来计算平移变换,同时我们用x/w,y/w,z/w来表示前三个坐标,这样做好处多多,不但可以方便计算,还可以解决透视空间中平行线相交的问题,而且投影矩阵会利用w值来实现透视
另外,为了不影响X,Y,Z分量的值,请将w设为1,w不为1时,我们也尽量将其归一化,这一步图形学中称为透视除法,即每个分量除以w,但w不为1也有特殊意义,几何意义上可以理解为w控制着坐标系的缩放,即当 W 增大,坐标被拉伸;W 缩小,坐标被压缩, W 对3D坐标做缩放变换
二维坐标系更好理解,可参考:“透视除法” —— 齐次坐标和投影_【黑键】-CSDN博客
这样,得到的结果除了多出了一个分量1,其余的结果都正确了
我们在shader中实现它
Varyings vert(Attributes v)
{
Varyings o = (Varyings)0;
// 平移矩阵
float4x4 T = float4x4
(
1,0,0,_Translate.x,
0,1,0,_Translate.y,
0,0,1,_Translate.z,
0,0,0,1
);
v.positionOS = mul (T,v.positionOS);
o.positionCS = TransformObjectToHClip(v.positionOS);
o.uv = TRANSFORM_TEX(v.uv,_MainTex);
return o;
}
通过创建的float4x4矩阵,与模型本地空间坐标相乘(positionOS为float4类型),同时用我们暴露出来的参数Translate控制
大功告成