假如你是个画家,

你又画了一幅画,

长这样:

打开网易新闻 查看精彩图片

看到这里有个房子。

那么,

换个视角,

成这样了,

从不同角度看样子不一样。

打开网易新闻 查看精彩图片

那么,

是什么导致横看成岭侧成峰,

远近高低各不同的?

今天来说说,

物体旋转是什么原理。

首先,

在之前,

我们说过一个点都有坐标,

那么空间坐标系下

就用3个数代表坐标。

只不过,

这个坐标我们就看作点向量,

就是原点为0坐标点,

方向为坐标点,

长度是坐标点到原点的距离的向量。

打开网易新闻 查看精彩图片

然后,

假如说物体要移动,

上次说过加个向量就行。

因为向量可加。

打开网易新闻 查看精彩图片

那么,

如果要旋转,

怎么办?

这时候我们学点新的。

首先说2维的,

我们看到这里有个向量,

打开网易新闻 查看精彩图片

我要对它旋转θ角度,

那么它的坐标就变到这里了。

打开网易新闻 查看精彩图片

那么新坐标可以这样算,

假设这个点的坐标写成(rcosα,rsinα),

打开网易新闻 查看精彩图片

那么变换到了(rcos(α+θ),rsin(α+θ)),

关于cos(a+b)和sin(a+b)是多少,

看图,

打开网易新闻 查看精彩图片

这里画了三条线切割了一个长方形,

有两个角分别是a和b,

根据之前说的直角三角函数规定,

设中间这条边为1,

那么每条边就是如图所标的值。

打开网易新闻 查看精彩图片

那么,

简简单单,

上面的这个三角形右边的角是a+b,

那么,

打开网易新闻 查看精彩图片

直接读,

sin(a+b)=(sinacosb+cosasinb)/1,

同理cos(a+b)=(cosacosb-sinasinb)/1,

所以刚刚的坐标就可以写成

X=rcosθcosα-rsinθsinα,

Y=rsinθcosα+rcosθsinα,

rcosα和rsinα是之前的x和y,

那么X=xcosθ-ysinθ,

Y=xsinθ+ycosθ。

你是不是发现,

都是什么x加或者减什么y,

那么,

能不能化简?

没错,

今天就来学如何化简。

首先,

我们就整出一个东西,

名字叫做矩阵。

看到这里有个数表,

很规则,

且知道长多少个数字,宽多少个数字。

那么让它不乱,

每个数按规则计算,

就给它用中括号或者括弧阔起来,

这个玩意就叫做矩阵。

其中上面的就是3×2矩阵。

如果m=n,

则这个矩阵就是特殊矩阵=>方阵,

例如下矩阵:

那么,

刚刚的坐标,

因为左边的X和Y是竖着写的,

那么我们就把向量竖着写,

这个时候就是列向量了。

(线性代数里的向量一般是列向量)

打开网易新闻 查看精彩图片

那么,

这时候规定运算法则,

A+B就是逐位相加,

A×B就是如图所示方式,

(A和B必须满足,

A是m1xn1矩阵,

B是m2xn2矩阵,

其中n1=m2才可以,)

打开网易新闻 查看精彩图片

就是结果第a行第b列=矩阵1的第a行和矩阵2的第b列

每一项依次相乘,

再累加在一起。

然后,

这个运算过程就可以写成这样了:

打开网易新闻 查看精彩图片

其中中间带三角函数的这个矩阵

我们给它起一个特殊的名字,

就叫做旋转矩阵。

打开网易新闻 查看精彩图片

那么,

既然如此,

向量旋转和缩放

我们就用一个矩阵表示了,

缩放就是乘缩放矩阵,

X和Y乘一定系数。

打开网易新闻 查看精彩图片

(注意:如果AB不相等,

这个向量的方向可能就会改变)

(补充,

如果一个向量经过矩阵操作后,

大小改变了,

但是方向没有没变,

那么这个向量就是这个矩阵的特征向量,

而缩放比例就是这个矩阵的特征值)

既然前面的旋转缩放都用矩阵算了,

那么位置应该也有,

只不过,

那么坐标就要写成三位数了,

设刚刚的坐标为(x,y,1),

乘这样的移动矩阵。

(可以简单认为增广矩阵,

就是矩阵往右扩了一列)

打开网易新闻 查看精彩图片

为了计算方便,

让算出来也是三位数,

缩放矩阵和选转矩阵也能扩展到三位数。

那么,

计算一个点的变换,

就是P’=M(移动矩阵)M(旋转矩阵)M(缩放矩阵)P

那么我们先进行缩放,

再进行旋转,

最后移动,

连续乘三个矩阵,

那么得到了新的矩阵,

打开网易新闻 查看精彩图片

这个矩阵就是平面变换矩阵。

那么,

如果在三维空间??!!

你以为旋转一个物体,

按照固定的坐标系旋转,

朝X方向旋转90°再朝Y方向旋转90°

和朝Y方向旋转90°再朝X方向旋转90°

是一样的?

不信你试试,

拿一支笔,

转一下,

发现,

不兑了。

假设是按照笔的坐标系,

坐标系跟着笔一起转,

按照刚刚的方式,

也一样。

所以3维空间里直接沿用2D的旋转法则

失效了。

那么,

咋办?

重推。

这时候我们规定,

先按照绕Z轴旋转,

再按照绕Y轴旋转,

最后按照绕X轴旋转。

这时候,

我们就先对Z轴旋转,

那么就不能对Z轴的值操作,

只对X和Y操作,

乘一个对X和Y操作的矩阵,

而第三列和第三行除右下角是1,

其它都是0。

打开网易新闻 查看精彩图片

那么,

同理左乘对Y的矩阵,

再左乘对X的矩阵。

那么结果就是这样:

(X轴用φ,Y轴用ψ,Z轴用θ)

打开网易新闻 查看精彩图片

其中刚刚这样规定就是欧拉角,

其中是绕世界的轴转,

所以这个就是外旋XYZ。

如果自身的坐标跟着转,

一样,

先绕物体的Z轴,

再绕物体的Y,最后绕物体的X,

这个就是内旋ZYX。

但是,

用欧拉角也有个问题,

存在万向锁,

你把Y轴设置为±90°,

X和Z会达到同平面状态,

设置X为30°,

Z是-30°,

然后就会

打回绕Y旋转±90°情况。

所以给大家介绍一个新的表示方法,

假设物体绕某个轴转过来,

也能达到这个效果。

那么这个轴就是旋转轴,

角度就是绕这根轴旋转的角度。

打开网易新闻 查看精彩图片

那么这个表示方式就是轴角。

但是,

你很难想象绕哪根轴多少角度

转到这个方向的,

也有问题,

太难想象。

所以,

旋转矩阵太烦,欧拉角有死锁,

轴角难以想象。

同时,

还有人借鉴了轴角,复数和向量,

发明了四元数。

其中它可以表示成:单位轴向量×sin(角度/2)+cos(角度/2),

其中轴向量的x乘了i,

y乘j,z乘k,

而且i²=j²=k²=-1,

只不过方向不同。

所以,

以绕Y轴转了90度为例子,

单位轴向量为(0,1,0),

角度是90度,

那么四元数q=0.707j+0.707。

同时遵循着奇怪的运算法则,

ij=-ji=k,jk=-kj=i,ki=-ik=j。

同时,

假如你要让物体绕局部世界旋转,

就是右乘物体原四元数,

如果是绕世界旋转,

就是左乘。

但是,

四元数真的很抽象,

虽然能避免欧拉角的死锁问题。

所以,

总结一下3D旋转的4种方式的优缺点:

打开网易新闻 查看精彩图片

同理,

移动和缩放也一样,

如果用一个矩阵表示,

则向量就用四维向量就行,

那么就是(x,y,z,1),

同理矩阵也用4×4矩阵,

刚好能放这么大的。

既然能用物体局部坐标上的一个点

通过矩阵的空间变换

算出相对于世界坐标的绝对坐标,

有一天我带着相机拍照,

然后相机对准某个场景,

这时候就需要反算到相机这里的坐标。

我们先举简单的例子,

假设我们这个要算的已知世界坐标是P,

而这个物体相对于相机的坐标是p,

设A是相机的变换矩阵,

那么知道Ap=P,

那么p=P/A?

不是,

矩阵乘法交换律不成立,

那么除法还成立?

想多了!

不可能!

p=A⁻¹P这样才合理,

而矩阵的逆是多少?

首先我们知道,

A×A逆=E

(有的教科书上写I,指单位矩阵),

我们现在要求A逆,

因为推导过程过于复杂,

这里直接给出结论。

我们规定,

首先要求伴随矩阵A*。

首先,

矩阵得是方阵,

就是2×2,3×3,4×4这种,

行数和列数要一样。

根据规定A*·A=|A|,

其中|A|的算法就是这样,

首先,

大家应该在初中书上做到过,

有种算法叫做

打开网易新闻 查看精彩图片

这个确实是线性代数里的,

叫做二阶行列式。

但是,

假如有个三阶行列式,

打开网易新闻 查看精彩图片

这个计算就有点烦人了,

但是,

可以这么搞,

首先,

我们给一个新的东西,

叫做余子式。

假如有个行列式,

打开网易新闻 查看精彩图片

那么,

余子式的表达方式就是Mₐᵦ,

(真行,电脑上找不到下标b,用β代替了)

我们设求M₁₂,

把第一行和第二列直接划掉,

打开网易新闻 查看精彩图片

这下子会算了吧?

然后,

算行列式就是这样,

随便一个几阶行列式,

随便选一行/列,

这里以行为准,

|A|=(-1)ⁱ⁺¹aᵢ₁Mᵢ₁+(-1)ⁱ⁺²aᵢ₂Mᵢ₂+…+(-1)ⁱ⁺ʲaᵢⱼMᵢⱼ。

例如如果是4阶的,

给它砍成3阶,

3阶再砍成二阶。

其中,

Aᵢⱼ=Mᵢⱼ(-1)ⁱ⁺ʲ,叫做代数余子式。

相当于|A|=(-1)ⁱ⁺¹aᵢ₁Mᵢ₁+(-1)ⁱ⁺²aᵢ₂Mᵢ₂+…+(-1)ⁱ⁺ʲaᵢⱼMᵢⱼ

可以改成|A|=aᵢ₁Aᵢ₁+aᵢ₂Aᵢ₂+…+aᵢⱼAᵢⱼ。

那么,

伴随矩阵就是

打开网易新闻 查看精彩图片

(i=j)

那么,

矩阵的逆就是A⁻¹就是A*/|A|,

乘在矩阵前面就得到结果了。

所以,

求出来了物体相对于相机的坐标。

那么,

距离用相机拍出来还差一步,

这个下次再说。

(其实是就是投影到屏幕上)

所以,

不同的物体,

从不同的角度拍,

相机的变换矩阵跟着改变,

所以就会出现

横看成岭侧成峰,

远近高低各不同的情况。

接下来看一下今天的内容线图:

打开网易新闻 查看精彩图片