文章目录
变换
作用:
描述摄像机的运动和位置移动;
表示复杂的旋转,以及他们联系在一起后错综复杂的变换;
用于缩放等;
用于光栅化成像,从三维世界到二维平面
正运动学:已知关节的角度,求末端的位姿
逆运动学:已知末端的位姿,求各关节的转角
类型:
- 模型变换Modeling
- 视图变换Viewing
二维变换
缩放scale
缩放矩阵:
反射(or对称)Reflection Matrix
对于y轴反转:
x
′
=
−
x
,
y
′
=
y
x^{'} = -x,y^{'}=y
x′=−x,y′=y,用矩阵表示如下:
切变 Shear Matrix
基于原点,且
y
m
a
x
=
1
y_{max}=1
ymax=1的切变矩阵表示:
旋转Rotate
默认绕原点
(
0
,
0
)
(0,0)
(0,0)逆时针旋转。
旋转矩阵推导过程:用特殊点
(
1
,
0
)
a
n
d
(
0
,
1
)
(1,0)and(0,1)
(1,0)and(0,1)进行推导
线性变换 :变换后的坐标可以用原坐标与矩阵 (维度要相同) 相乘得到的变换。
齐次坐标
二维齐次坐标
特殊的变换:平移
平移矩阵表示(仿射变换Affine map):
上述公式先应用线性变换,再平移
如何让平移变换也加入到一般表示矩阵中?
答:引入齐次坐标。
二维点:
(
x
,
y
,
1
)
T
(x,y,1)^{T}
(x,y,1)T
二维向量:
(
x
,
y
,
0
)
T
(x,y,0)^{T}
(x,y,0)T
为什么要区分点和向量?
答:向量具有平移不变性。向量
(
x
,
y
,
0
)
T
(x,y,0)^{T}
(x,y,0)T经过平移(下面那个平移矩阵)依旧是
(
x
,
y
,
0
)
T
(x,y,0)^{T}
(x,y,0)T
向量+向量=向量
点-点=向量
点+向量=点(一个点沿着向量移动变成另一个点)
点+点=这两个点的中点(理由如下)
如果使用 [ x y w ] \left[\begin{matrix}x\\y\\w\end{matrix}\right] ⎣⎡xyw⎦⎤表示二维点,则其表示的是点 [ x / w y / w 1 ] , w ≠ 0 \left[\begin{matrix}x/w\\y/w\\1\end{matrix}\right],w\neq0 ⎣⎡x/wy/w1⎦⎤,w=0
齐次坐标表示平移:
齐次坐标表示仿射变换:
上述公式依旧是先应用线性变换,再平移,只是用齐次坐标来表示仿射变换而已
各种变换矩阵:
逆变换 M − 1 M^{-1} M−1
逆变换:变换后的坐标
(
x
′
,
y
′
)
(x^{'},y^{'})
(x′,y′)乘变换矩阵
M
M
M 的逆矩阵
M
−
1
M^{-1}
M−1,结果为原坐标
(
x
,
y
)
(x,y)
(x,y)。
组合变换
先平移再旋转:
先旋转后平移
结果受到变换的顺序的影响是因为矩阵乘法不满足交换律,如果要进行某一种变换,就要在已得到的矩阵的左边乘该变换矩阵。
先旋转后平移的矩阵表示(从右到左来应用):
上面两个变换矩阵可以写成一个变换矩阵如下:
[
cos
4
5
o
−
sin
4
5
o
1
sin
4
5
o
−
cos
4
5
o
0
0
0
1
]
\left[\begin{matrix}\cos45^{o}&-\sin45^{o}&1\\\sin45^{o}&-\cos45^{o}&0\\0&0&1\end{matrix}\right]
⎣⎡cos45osin45o0−sin45o−cos45o0101⎦⎤
推广
对点
[
x
y
1
]
\left[\begin{matrix}x\\y\\1\end{matrix}\right]
⎣⎡xy1⎦⎤依次应用变换
A
1
,
A
2
,
A
3
,
.
.
.
A
n
A_{1},A_{2},A_{3},...A_{n}
A1,A2,A3,...An
矩阵形式如下:
因为矩阵满足结合律,所以可以先将
A
n
×
.
.
.
×
A
3
×
A
2
×
A
1
A_{n}\times...\times A_{3}\times A_{2}\times A_{1}
An×...×A3×A2×A1计算得到一个
3
×
3
3\times3
3×3矩阵,再与齐次坐标相乘。所以其实是可以直接用一个
3
×
3
3\times3
3×3矩阵表示一个复杂的变换,而不需要按变换的顺序乘N个
3
×
3
3\times3
3×3矩阵。
变换分解
如何做到以任意一点为中心进行旋转?
答:需要变换分解。
绕点c
(
x
c
,
y
c
)
(x_{c},y_{c})
(xc,yc)进行旋转所需操作
- 移动到原点。把所有的点沿着-c ( − x c , − y c ) (-x_{c},-y_{c}) (−xc,−yc)方向移动
- 绕原点旋转规定角度
- 移动到点c。把所有的点沿着c ( x c , y c ) (x_{c},y_{c}) (xc,yc)方向移动
三维变换
三维齐次坐标
三维点:
(
x
,
y
,
z
,
1
)
T
(x,y,z,1)^{T}
(x,y,z,1)T
三维向量:
(
x
,
y
,
z
,
0
)
T
(x,y,z,0)^{T}
(x,y,z,0)T
如果使用 [ x y z w ] \left[\begin{matrix}x\\y\\z\\w\end{matrix}\right] ⎣⎢⎢⎡xyzw⎦⎥⎥⎤表示三维点,则其表示的是点 [ x / w y / w z / w 1 ] , w ≠ 0 \left[\begin{matrix}x/w\\y/w\\z/w\\1\end{matrix}\right],w\neq0 ⎣⎢⎢⎡x/wy/wz/w1⎦⎥⎥⎤,w=0
三维仿射变换
上述公式先应用线性变换、再平移
各种变换矩阵:
三维旋转
绕着x、y、z轴进行旋转:绕哪个轴该轴的坐标不变
xyz坐标系遵循循环对称的性质(xyzxyzxyz…),xy得z,yz得x,zx得y。
z
⃗
×
x
⃗
=
y
⃗
\vec{z}\times\vec{x}=\vec{y}
z×x=y而不是
x
⃗
×
z
⃗
\vec{x}\times\vec{z}
x×z,所以绕y轴得旋转矩阵中角度是负的。
绕三轴旋转矩阵可分解为:
罗德里德斯旋转公式:
R
⃗
(
n
⃗
,
α
)
−
−
旋
转
轴
n
⃗
,
旋
转
角
度
α
\vec{R}(\vec{n},\alpha)--旋转轴\vec{n},旋转角度\alpha
R(n,α)−−旋转轴n,旋转角度α,默认旋转轴过原点(起点在原点上)。
矩阵N为叉积
a
⃗
×
b
⃗
=
A
∗
b
\vec{a}\times\vec{b}=A^*b
a×b=A∗b的叉积矩阵
A
∗
A^*
A∗
如果要沿着任意轴旋转,且该轴起点不是原点,则需要先将所有坐标平移直到旋转轴起点为原点,然后旋转,最后再平移回去。
四元数可参考博客https://zhuanlan.zhihu.com/p/78987582