z变换公式表_Shader学习(7)空间变换的数学原理

5a0b45fe906b61a8542fade97384f2a7.png

文中内容主要参考书籍《unity shader入门精要》,作者为冯乐乐。

坐标空间的变换是三维图形学中一个绕不过去的知识点,在编写shader的时候经常会用到。在渲染流水线中,我们无法只靠一个坐标空间就完成所有的事情,使用多个坐标空间来表示三维数据既符合了人类在编辑三维场景时对三维的直接感受,也提高了程序在计算各种数据时的运算效率。

一、世界空间

首先需要搞清楚的是,为什么一个空间的原点表示为:

f0b686111d10a37c12572a4ddb963cc8.png

前三个0,表示它的坐标为(0,0,0),而最后一个1,是因为三维图形学中规定把点记作的齐次空间坐标的最后一位记作1。

那么我们常用到的四维单位向量又为什么记作下面这样,它的每个部分代表了什么?

514be4d189ad789f27b38f6f5fac3fe3.png

我们知道定义一个三维空间首先需要确定它的原点,然后需要知道它三个轴向的朝向,简单来说,一个空间中首先包含了一个点,和三个向量。

608f1f78758f86937cd7be1b289b8b58.png

这其中,第一列到第三列确定的,其实就是空间的三个轴向,而第四列则代表了点的位置。

以上表述为了方便理解和学习,并不准确。

空间的几条重要属性

1.所有空间都是相对的。

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

3.每一个坐标空间都是另一个坐标空间的子空间,反过来说,每个空间都有一个父空间。对坐标空间的变换实际上就是在父空间和子空间之间对点和矢量进行变换。

梳理一下空间变换的数学概念

假设现在有父坐标空间P以及一个子坐标空间C。我们一般有两种需求,一种是把子坐标空间下表示的点或矢量转换到父坐标空间下,而另一种则是反过来。

对于一个点A,当它在父坐标空间下时我们把它记作Ap,当它在子坐标空间下时我们把它记作Ac。于是有下面的公式来表示对点A的空间转换。

9c598b993403f373fde695105de67faa.png

8160c771ea61b52f1e6f94cf2b25949d.png

这其中,Mc->p表示的是从子坐标空间变换到父坐标空间的变换矩阵。

那么这个变换之中到底发生了什么样的计算?

对于用子坐标空间的三个坐标轴,当它们需要在父坐标空间中进行表示的时候,我们把它们记作xc、 yc、 zc,对于子坐标空间的原点,我们记作Oc。

当给定一个子坐标空间中的一点Ac,它的坐标为(a,b,c),我们可以用下面的公式来确定其在父坐标空间下的位置Ap:

70b9fc115c2c350232972c49d05ac44d.png

将这个公式展开之后有如下结果:

1b9a4f41d68d41141fe4539327b0644f.png

由前些篇章的学习我们知道,原点是点,而轴向是矢量,所有的点和矢量都可以记作矩阵。所以接下来我们可以把原点Oc和轴x,y,z齐次变换到四维空间。

29d2f9791723e5b8efa6b14423ba6707.png

一个标量a和向量相乘,可以看作是把该向量延长了a倍,也可以看作是在向量上的一点沿着向量运动了a个长度。

一个点的坐标(a, b, c)可以看作是该点从坐标系原点出发,延x、y、z轴分别移动了a、b、c个单位,所以接下来就可以以平移矩阵的方法来计算上面的公式。

因为以上的原因,我们可以把子坐标的原点Oc看作是一个平移矩阵。而xc,yc,zc则是一个旋转加缩放的组合矩阵。

再结合之前学到的矩阵乘法的结合律,我们就得到了如下的演算:

ffa3752217628efff4bdff7a28e79ea7.png

最终,我们得到了把点Ac从子空间变换到父空间中的矩阵。我们观察这个矩阵可以发现,矩阵中的第一到第三列就是子空间的三个坐标轴对应在父空间中的向量,而第四列就是子空间的坐标原点。

d90834f6bd785b80f6699bb1fe8760bd.png

如果你用这个矩阵对父坐标空间的原点进行变换,就会发现变换后的原点正好等于这个矩阵的第四列。同样,如果用这个矩阵对父坐标空间的x轴进行变换,就会发现x轴等于这个矩阵的第一列。

需要注意的是,子空间的单位和父空间并不一定对应,可以出现父空间的一个单位等于子空间几个单位的情况。所以上面这三个坐标轴矢量并不一定是单位矢量。

对矢量的空间变换

因为向量是没有位置信息的,它只表示方向,所以原点在哪里对向量来说无关紧要。那么对向量的坐标空间变换可以使用3x3的矩阵来表示。所以对向量的变换矩阵就是:

50268d395eb439bb41490ad0c7fb8642.png

在shader中我们经常会看到截取变换矩阵的前三行三列来对法线方向和光照方向进行空间变换。

空间的反向变换

我们在上面已经求解了从子空间变换到父空间的变换矩阵Mc->p 。从父空间变换到子空间的变换矩阵 Mp->c 就是Mc->p的逆矩阵。逆矩阵的求解比较复杂,但是幸运的是有一条定律是正交矩阵的转置矩阵就是它的逆矩阵

正巧,空间变换的矩阵就是正交矩阵,这为我们节省了很多的运算量。(两个空间中的坐标轴都必须是单位矢量)

321e730e144c93ec43095151a954a909.png

以上公式中的横杠和竖杠的意思是横向展开该矢量坐标的意思。

子坐标空间C中的三个坐标轴Xc , Yc , Zc 在父坐标空间P中的表示就是变换矩阵Mc->p中的每一列。

父坐标空间P中的三个坐标轴Xp, Yp ,Zp在子坐标空间C中的表示就是变换矩阵Mc->p中的每一行。

简单来说就是子到父为列,父到子为行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值