【Unity学习笔记】空间变换推导(一)——基本变换之平移变换

点的平移变换

我们知道对一个坐标点进行平移,只需要对其各个分量(x,y,z)做加法即可

x,y,z表示偏移值,Px表示原有坐标

如果用矩阵的方式,对一个按列排布的三维坐标进行左乘,那么这个变换逆矩阵应该是

 不对,如果用这个3x3矩阵的话,无论如何我们都得不到与上面P'相同的结果,所以我们引入一个新的分量1,填充到矩阵和坐标点的第四个分量当中去,得到一个4x4的矩阵

也称作齐次坐标,通过n+1维来计算平移变换,同时我们用x/w,y/w,z/w来表示前三个坐标,这样做好处多多,不但可以方便计算,还可以解决透视空间中平行线相交的问题,而且投影矩阵会利用w值来实现透视

可参考 为什么要引入齐次坐标,齐次坐标的意义(一)_追求卓越583的博客-CSDN博客_齐次坐标

另外,为了不影响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控制

大功告成 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值