Unity3D - Shader - 坐标空间变换

概念解释

顶点着色器的最基本功能就是把模型的顶点坐标从模型空间转换到齐次裁剪坐标空间

想要将一个点从一个坐标空间转换到另一个坐标空间就需要利用坐标空间的变换

想要定义一个坐标空间,必须指明坐标原点和三个坐标轴的方向。

每一个坐标空间都有一个坐标空间,对坐标空间的变换实际上就是在父空间与子空间对点和矢量进行变换。而变换则是利用矩阵将一些点、颜色等进行转换的过程。

空间坐标的变换就是利用矩阵将一个坐标空间的点变换到另一个坐标空间。

变换矩阵的表示

如何表示空间坐标变换矩阵呢?

首先,定义父坐标空间P以及一个子坐标空间C。其次,还知道父坐标空间中子坐标空间的原点以及三个单位坐标轴。

一般的需求:

  • 把子坐标空间下表示的点或矢量 Ac 转换到父坐标空间下的表示 Ap
  • 把父坐标空间下表示的点或矢量 Bp 转换到子坐标空间下的表示 Bc

其公式表达为:

Ap=McpAcBc=MpcBp

其中, Mcp 表示的是从子坐标空间变换到父坐标空间的变换矩阵,而 Mpc 是其逆矩阵。

确定坐标在空间中的位置

若我们知道子坐标空间C的三个坐标轴在父坐标空间P下的表示 xc,yc,zc 以及原点位置 Oc

当给定一个子坐标空间中的一点 Ac=(a,b,c) ,那么可以通过四个步骤来确定其在父坐标空间下的位置 Ap

  1. 从坐标空间的原点开始, Oc
  2. 向x轴方向移动a个单位, Oc+axc
  3. 向y轴方向移动b个单位, Oc+axc+byc
  4. 向z轴方向移动c个单位, Oc+axc+byc+czc

其结果就是:

Ap=Oc+axc+byc+czc

将其矩阵化就是:

Ap=(xoc,yoc,zoc)+xxcyxczxcxycyyczycxzcyzczzcabc

将结果进一步扩展到齐次坐标空间中就是:

Ap=xxcyxczxc0xycyyczyc0xzcyzczzc0xocyoczoc1abc1

由此可以进一步得到 Mcp 变换矩阵:

Mcp=xxcyxczxc0xycyyczyc0xzcyzczzc0xocyoczoc1

可以很明显的看出来,变换矩阵 Mcp 实际上可以通过坐标空间C在坐标空间P中的原点和坐标轴矢量表示构建出来,将三个坐标轴依次放入矩阵的前三列,把原点矢量放到最后一列,再用0和1填充最后一行。

另一个角度,若已知从模型空间到世界空间的4X4变换矩阵 Mcp ,可以提取出它的第一列再进行归一化(消除缩放的影响)来得到模型空间的x轴在世界空间下的单位矢量表示。同样的方法可以提取y轴与z轴。

可以知道矩阵 Mcp 的逆矩阵为 Mpc ,当矩阵 Mcp 是个正交矩阵 - 一个方阵M和它的转置矩阵的乘积是单位矩阵,那么 Mcp 的逆矩阵就是等于它的转置矩阵。

Mpc=M1cp=MTcp

再进一步理解一下这个公式。

已知矩阵 Mcp

Mcp=xxcyxczxcxycyyczycxzcyzczzc

那么其转置矩阵就是 MTcp

MTcp=xxcxycxzcyxcyycyzczxczyczzc

此外,还知道矩阵 Mpc 是:

Mpc=xxpyxpzxpxypyypzypxzpyzpzzp

那么就有:

Mpc=xxpyxpzxpxypyypzypxzpyzpzzp=M1cp=MTcp=xxcxycxzcyxcyycyzczxczyczzc

根据以上这些公式,就可以推论出:

如果我们知道坐标空间变换矩阵 MAB 是一个正交矩阵, 那么我们就可以提出他的第一列来得到坐标空间A的x轴在坐标空间B下的表示, 还可以提取它的第一行来得到坐标空间B的x轴在坐标空间A下的表示。

若我们知道坐标空间B的x轴、y轴、z轴在坐标空间A下的表示,将其依次放入矩阵的每一行就可以得到A到B的变换矩阵了。

以上虽然看上去很复杂,但是只要多看几遍,多写几遍都能理解其含义了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值