第四季 变换(二)

0对于上篇旋转矩阵的扩充

如果我们有个旋转矩阵,旋转θ度,那矩阵如下


旋转矩阵

而如果我们旋转了 -θ度的话,由于三角函数 sin-θ = -sinθ, cos-θ = cosθ
所欲我们可以得出


旋转-θ

搜们观察这两个矩阵可以发现,R-θ是 Rθ的转置矩阵

而从定义上来看,R-θ和Rθ是互逆的 这里我们发现了一个有趣的地方

在旋转矩阵中,Rθ的逆矩阵 = Rθ的转置矩阵。
扩充:数学上对于有这种性质的矩阵称为正交矩阵

1.三维空间中的变换
三维空间中的缩放矩阵和平移矩阵

和二维中的基本相同,略过

旋转矩阵:


三维空间中绕某轴旋转

这里我们发现y轴和其他稍微有所区别,x 和 z都是旋转矩阵中右上为负,而y轴正好相反。其实这里比较好理解: x轴的方向我们可以用火 Y轴叉乘Z轴来得出,Z轴的方向我们可以用X轴叉乘y轴得出。而Y轴的方向,我们需要用Z轴叉乘X轴得出,和其他的顺序是相反的。

对于任何一个复杂的旋转,我们都可以将其拆分分解为3个绕XYZ轴的简单旋转,如下



我们叫做欧拉角

对于一个任意旋转,都有如下公式

罗格里德斯旋转公式

这里我们发现对于任意轴他只给了一个向量N,也就是说公式是默认所有旋转的轴都是过原点的。那如果对于一个不过原点的轴旋转,可以其平移到过原点,然后计算旋转,之后再平移回去即可。这也是旋转处理的基本思路:先平移到过原点再计算旋转再平移回去。

扩充 这里的欧拉角和四元数的优劣

例如我们由一个二维选旋转矩阵, 一个是旋转15°,一个是旋转25°,如果我们两个加起来求平均 我们可以知道他得出的结果其实并不是旋转20°的结果。也就是欧拉角是无法去做到线性插值的(因为三角函数是非线性的),而四元数可以解决这个问题,并且使用欧拉角会无法避免的带来万向节锁锁死,四元数也同样可以避免。

2.视图变换

首先设想一下我们如何拍下一张照片:
1找到一个地方放置模型 (模型变换)
2 找到一个好的角度放置相机 (视图变换)
3 最后拍照 (投影变换,3d空间转2d照片)
简称 MVP 变换



其中比较重要的就是视图变换
我们如何能表示一个视图变换呢?首先我们需要定义一个相机,需要一下数据
1 位置
2 朝向
3 他的竖直方向 (是不是歪的)
也就是说,有了这三个数据 我们定义一个相机他的位置数据


然后我们思考下这样一个问题。例如桌放着一台手机和显示器,然后我们把手机显示器粘在桌子上,让桌子移动或旋转任意角度,那么对于手机和桌子来说 他们在屋子里的坐标虽然变化了 但是他们之间的相对坐标并没有发生该表。而同理,我们是否可以把观察相机的位置信息当做原点和坐标轴,然后让所有相机观察的物体变换到对应位置,这样相机看到的东西 其实也是一样的。
通常来说,在相机空间我们把相机坐标定位原点,看向的方向为-z x,y轴不变


相机空间的约定俗称

接下来就是如何将观测点数据变为以相机空间数据的坐标了,其实相当于以下步骤
先平移相机坐标e->原点的数据,然后将旋转的相机当前旋转矩阵的逆矩阵 ,然后将z轴选咋混到-z,y->y x->x


那么我们怎么写出对应的矩阵呢,首先我们先处理平移矩阵,然后将其旋转到对应旋转方向。
在处理旋转矩阵的时候,我们可能会发现 如果我们是从坐标轴旋转到对应轴,其实是相对好计算出值得,但反之就比较麻烦了。这里我们用到我们开篇总结的知识:



也就是我们先计算旋转的逆矩阵,也就是从当前坐标轴旋转到相机坐标轴,然后再将其转职,就得到了我们想要的结果


image.png

这里简单总结下,其实就是所有的物体随着相机一起转换到相机空间,并且同时需要模型空间中的位置信息,为了之后投影矩阵使用.
3.投影变换
image.png

这里其实就是两种投影 正交投影和 透视投影 这两者的区别就是 透视投影会有近大远小的现象,正交投影不会有。这两张图可能看起来效果更明显,左边是透视投影,右边是正交投影


正交投影:

这里我们来看个简单的处理 相机位于原点,看向-z方向 物体 X Y 坐标都为0,坐标也在-z 位置上 这时候我们会发现只要把物体的Z坐标抛弃只保留 X Y,就会得到想要的对应结果,但这里我们会发现这样一个问题:物体间的前和后无法去表示了



平行投影到底在做什么呢我们可以看做他定义了一个空间中的立方体,这个立方体就是他观察到的空间,他只需要 x~-x y~-y z~-z 的值,然后我们通过变换可以先平移到原点,再讲三个周的范围都取值到-1~1


然后我们需要把这个变换写出它对应的变换矩阵 这里就很简单了,我们先平移再缩放,这个矩阵也是比较简单

右手坐标系,使用左乘
透视投影

透视投影有这些特性:
计算机图形中最常用的投影方式
近大远小
平行线不再平行,他会在某个点相交


透视投影

这里我们要回一下之前的知识,就是关于其次坐标相关的。我们知道点的坐标是可以乘上一个值得,例如
(x,y,z,1) * k = (kx,ky,kz,k) (k≠0)
同样也可以(x,y,z,1) * z = (xz,yz,z^2)
但其实来说,这三个点表示的都是同一个点 :(x,y,z,1) 只是不同的写法


image.png

透视投影需要那些呢
首先我们需要一个近平面和一个远平面 , 远平面比近平面大,这个用我们之前推导的正交矩阵是无法处理的。但我们可以想办法把呀从现在的形状压成一个正方体,然后再做一遍正交投影即可,现在我们只需要做出这个挤压变换

image.png

我们先从侧面来看,我们可以找到一个相似三角形 所以其实对于每个点x y挤压后的位置,其实就等于他原始的位置* 图中的 n/z
image.png

所以对于其中的任何一个点与他转换后的点(x',y',z') 我们可以发现下面一个关系
image.png

给予你任何一个x y z的点,在他经过挤压变换之后一定会变成下面中间的点。但这里有个问题就是z是位置的。这里我们可以再转换一下,让他再乘以z 我们就可以得到右边的,虽然我们还是不知道z是什么值

image.png

有了上面之后,我们可以在这两个矩阵之间找一些已知的推导,例如 nx与ny、z

推导出的矩阵

现在我们只剩最后一行来tianchong

这里我们观察下还有什么信息我们是可用的?
有以下两点我们需要注意:
对于近平面上的任何点,运算完之后仍然是原来的点(近平面不会被压缩)
远平面上的点虽然x y 变化了,但z的值仍然不变



首先我们队近平面的性质来推导下
所以就有了一下的推导:对于任何近平面的点(z值为n的点),因为压缩后值不变,所以我们可以将原来的unknow与z推导出来,他就是n^2 与 n。n^2就是原来我们无法推导的哪一行的结果 那我们这里再反过来推导下变换矩阵第三行的值。首先x y 必然是0。因为一旦有不为0的值就会变成 aX+bY+xx,不是一个n^2,这里我们推导出了第三行前两个值都为0



然后我们再来看远平面的性质
远平面中其实有一个特殊点,就是他的中心点(0,0,f) 这个点乘变换矩阵后结果也不变,再加上我们已经推出了第三行中前两个值为0,那么我们就有
image.png

然后连理两个式子,我们就可以解除来A B 的值到底是多少(n,f实际中都是固定值,一个是近平面距离相机的距离一个是远平面距离相机的距离)。现在我们就有了整个压缩变换的矩阵了。我们最后需要做的就是让他再乘上之前的正交投影变换的矩阵,就是我们想要的透视投影了。


image.png

最后我们思考下,用之前的图来看下,对于变换之前的矩阵,例如数遍所在的点,nf的中心点 他在完成压缩之后,这个点的位置是更靠近近平面还是更靠近远平面呢?

image.png

你可能感兴趣的:(第四季 变换(二))