假如你是个画家,
你又画了一幅画,
长这样:
看到这里有个房子。
那么,
换个视角,
成这样了,
从不同角度看样子不一样。
那么,
是什么导致横看成岭侧成峰,
远近高低各不同的?
今天来说说,
物体旋转是什么原理。
首先,
在之前,
我们说过一个点都有坐标,
那么空间坐标系下
就用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|,
乘在矩阵前面就得到结果了。
所以,
求出来了物体相对于相机的坐标。
那么,
距离用相机拍出来还差一步,
这个下次再说。
(其实是就是投影到屏幕上)
所以,
不同的物体,
从不同的角度拍,
相机的变换矩阵跟着改变,
所以就会出现
横看成岭侧成峰,
远近高低各不同的情况。
接下来看一下今天的内容线图:
热门跟贴