Unity Shader 矩阵的几何意义

        矩阵的变换:指我们把一些数据,如点、方向向量甚至是颜色,通过某种方式进行转换的过程。

        线性变换:可以保留向量和标量乘的变换(缩放、旋转、错切、镜像、正交投影)

         仿射变换:合并线性变换和平移变换的变换类型。它可以用一个4x4的矩阵来表示,为此我们需要把矢量扩展到四维空间下,这就是齐次坐标空间。 

         由于3x3的矩阵不能表示平移操作,因此我们扩展到4x4的矩阵,将原来的三维向量转换成四维向量。


        分解基础变换矩阵:纯平移、纯旋转和纯缩放的变换矩阵叫做基础变换矩阵。M3x3用于表示旋转和缩放,t3x1用于表示平移,01x3是零矩阵,1就是标量1。

        平移矩阵:我们用矩阵乘法来表示对一个点的平移变换,如下图可以看出x,y,z分别增加了一个位置的偏移。(对方向向量不会产生任何影响,因为向量没有位置属性)

        缩放矩阵:对x,y,z轴进行缩放。如果缩放系数kx=ky=kz,我们把这样的缩放称为统一缩放,否则是非统一缩放,非统一缩放会拉伸或者挤压模型,改变模型相关的角度和比例,比如在对法线进行变换是,如果存在非统一缩放,直接使用用于变换顶点的变换矩阵的话,会得到错误的结果。 

        旋转矩阵:绕着空间中的x轴、y轴或z轴进行旋转。在Unity中,如果进行多次不同轴的旋转,我们定义了一个旋转顺序zxy。

        x轴:

        y轴: 

        z轴: 

        复合变换 :即将上述平移、旋转和缩放组合起来,形成一个复杂的变换过程。由于矩阵乘法不满足交换律,因此矩阵乘法顺序很重要,在大多数情况下,我们约定的变换顺序就是先缩放、在旋转、最后平移。


        学完了矩阵的变换,我们就可以利用它来实现一个点或者方向向量从一个坐标空间转换到另一个坐标空间了。我们假设Ap是Ac经过变换矩阵之后得到的父坐标系坐标,而Bc则是Bp经过变换矩阵之后得到的子坐标系坐标。

         经过我们之前学的矩阵公式,我们可以最后推导出Mc>p实际上可以通过坐标空间C在坐标空间P中的原点和坐标轴的向量表示来构建出来,把三个坐标轴依次放入矩阵的前三列,把原点向量放到最后一列,再用0和1填充最后一行即可。

         且对方向向量的坐标空间变换,因为向量是没有位置的,因此坐标空间的原点变换是可以忽略的,因此我们仅仅平移坐标系的原点是不会对向量造成任何影响的,因此我们可以直接用3x3的矩阵来表示:

        在Unity中,有以下常用坐标空间:

         因此Unity中有这些常用的矩阵,特别是MVP矩阵,因为他就是矩阵满足结合律,将M、V、P矩阵结合的矩阵:


         Unity Shader中,使用的CG语言,而CG使用的是行优先的方法,即一行一行的填充矩阵,即float 3x3 M = float 3x3 (1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0)

         如果需要列优先的方式填充矩阵,可以使用Matrix4x4。

猜你喜欢

转载自blog.csdn.net/weixin_45081191/article/details/129180199