UTF8gbsn
关于齐次坐标 {#ux5173ux4e8eux9f50ux6b21ux5750ux6807}
首先,空间变换一般使用仿射空间,也就是变换同时包含平移,旋转等。通常使用其次坐标,使用齐次坐标的好处,和优点。
-
仿射空间可以区分点和向量。
-
向量 ( P x , P y , P z , 0 ) (P_x,P_y,P_z, 0) (Px,Py,Pz,0)
-
点 ( P x , P y , P z , 1 ) (P_x,P_y,P_z, 1) (Px,Py,Pz,1) ,其中点的坐标为 ( P x , P y , P z ) (P_x,P_y,P_z) (Px,Py,Pz)
-
两个点的差是一个向量。
-
-
可以表示无穷远处
-
如果 ( 1 , 2 , 1 , 0 ) (1,2,1,0) (1,2,1,0) 表示一个点,那么这个点就是无穷远点
( 1 / 0 , 2 / 0 , 1 / 0 ) (1/0,2/0,1/0) (1/0,2/0,1/0) -
因为两条平行线相较于无穷远点
{ A x w + B y w + C = 0 A x w + B y w + D = 0 ⇒ { A x + B y + C w = 0 A x + B y + D w = 0 \left\{\begin{array}{c}{A \frac{x}{w}+B \frac{y}{w}+C=0} \\ {A \frac{x}{w}+B \frac{y}{w}+D=0}\end{array} \Rightarrow\left\{\begin{array}{l}{A x+B y+C w=0} \\ {A x+B y+D w=0}\end{array}\right.\right. {Awx+Bwy+C=0Awx+Bwy+D=0⇒{Ax+By+Cw=0Ax+By+Dw=0
-
移动 {#ux79fbux52a8}
把一个物体平移 ( t x , t y , t z ) (t_{x}, t_{y}, t_{z}) (tx,ty,tz) 。它的矩阵形式如下。
T ( t ) = T ( t x , t y , t z ) = ( 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ) \mathbf{T}(\mathbf{t})=\mathbf{T}\left(t_{x}, t_{y}, t_{z}\right)=\left(\begin{array}{cccc}{1} & {0} & {0} & {t_{x}} \\ {0} & {1} & {0} & {t_{y}} \\ {0} & {0} & {1} & {t_{z}} \\ {0} & {0} & {0} & {1}\end{array}\right) T(t)=T(tx,ty,tz)=⎝⎜⎜⎛100001000010txtytz1⎠⎟⎟⎞
旋转 {#ux65cbux8f6c}
对于绕坐标轴的旋转矩阵。有三个,分别为
R x ( ϕ ) = ( 1 0 0 0 0 cos ϕ − sin ϕ 0 0 sin ϕ cos ϕ 0 0 0 0 1 ) \mathbf{R}_{x}(\phi)=\left(\begin{array}{cccc}{1} & {0} & {0} & {0} \\ {0} & {\cos \phi} & {-\sin \phi} & {0} \\ {0} & {\sin \phi} & {\cos \phi} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right) Rx(ϕ)=⎝⎜⎜⎛10000cosϕsinϕ00−sinϕcosϕ00001⎠⎟⎟⎞
R y ( ϕ ) = ( cos ϕ 0 sin ϕ 0 0 1 0 0 − sin ϕ 0 cos ϕ 0 0 0 0 1 ) \mathbf{R}_{y}(\phi)=\left(\begin{array}{cccc}{\cos \phi} & {0} & {\sin \phi} & {0} \\ {0} & {1} & {0} & {0} \\ {-\sin \phi} & {0} & {\cos \phi} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right) Ry(ϕ)=⎝⎜⎜⎛cosϕ0−sinϕ00100sinϕ0cosϕ00001⎠⎟⎟⎞
R z ( ϕ ) = ( cos ϕ − sin ϕ 0 0 sin ϕ cos ϕ 0 0 0 0 1 0 0 0 0 1 ) \mathbf{R}_{z}(\phi)=\left(\begin{array}{cccc}{\cos \phi} & {-\sin \phi} & {0} & {0} \\ {\sin \phi} & {\cos \phi} & {0} & {0} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right) Rz(ϕ)=⎝⎜⎜⎛cosϕsinϕ00−sinϕcosϕ0000100001⎠⎟⎟⎞
另外绕任意一点的旋转矩阵可以这么来写。
X = T ( p ) R z ( ϕ ) T ( − p ) \mathbf{X}=\mathbf{T}(\mathbf{p}) \mathbf{R}_{z}(\phi) \mathbf{T}(-\mathbf{p}) X=T(p)Rz(ϕ)T(−p)
旋转矩阵的逆矩阵很好写
R i − 1 ( ϕ ) = R i ( − ϕ ) \mathbf{R}_{i}^{-1}(\phi)=\mathbf{R}_{i}(-\phi) Ri−1(ϕ)=Ri(−ϕ)
::: {#ux6709ux8da3ux7684ux5c5eux6027}
有趣的属性 {#ux6709ux8da3ux7684ux5c5eux6027}
:::
然后我们来提一个属性,这个对于绕任何一个轴的旋转矩阵都成立。
T r ( R ) = 1 + 2 c o s ( ϕ ) Tr(R)=1+2cos(\phi) Tr(R)=1+2cos(ϕ)
其中 Φ \varPhi Φ为旋转角度。Tr是对角线元素之和。如何来证明这个东西?
首先来证明Tr(AB)=Tr(BA)
tr ( A B ) = ∑ i = 1 m ( A B ) i i = ∑ i = 1 m ∑ j = 1 n a i j b j i = ∑ i = 1 m ∑ j = 1 n b j i a i j = ∑ i = 1 n ( B A ) i i = T r ( B A ) \operatorname{tr}(A B)=\sum_{i=1}^{m}(A B)_{i i}=\sum_{i=1}^{m} \sum_{j=1}^{n} a_{i j} b_{j i}=\sum_{i=1}^{m} \sum_{j=1}^{n} b_{j i} a_{i j}=\sum_{i=1}^{n}(B A)_{i i}=Tr(BA) tr(AB)=i=1∑m(AB)ii=i=1∑mj=1∑naijbji=i=1∑mj=1∑nbjiaij=i=1∑n(BA)ii=Tr(BA)
下一步我们可以把任意的旋转矩阵改写为绕x轴旋转的矩阵
R
=
Q
R
x
Q
−
1
R=QR_{x}Q^{-1}
R=QRxQ−1其中
R
x
R_{x}
Rx的迹为
1
+
2
c
o
s
(
ϕ
)
1+2cos(\phi)
1+2cos(ϕ).运用上面的公式可得
T
r
(
R
)
=
T
r
(
Q
R
x
Q
−
1
)
=
T
r
(
R
x
Q
−
1
Q
)
=
T
r
(
R
x
)
=
1
+
2
c
o
s
(
ϕ
)
Tr(R)=Tr(QR_{x}Q^{-1})=Tr(R_{x}Q^{-1}Q)=Tr(R_{x})=1+2cos(\phi)
Tr(R)=Tr(QRxQ−1)=Tr(RxQ−1Q)=Tr(Rx)=1+2cos(ϕ)
其中Q是一个单位正交阵 Q Q − 1 = I QQ^{-1}=I QQ−1=I,用于进行空间变换,把点变换到旋转轴为x轴的所在空间中。
放缩 {#ux653eux7f29}
-
放缩矩阵
S ( s ) = ( s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 ) \mathbf{S}(\mathbf{s})=\left(\begin{array}{cccc}{s_{x}} & {0} & {0} & {0} \\ {0} & {s_{y}} & {0} & {0} \\ {0} & {0} & {s_{z}} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right) S(s)=⎝⎜⎜⎛sx0000sy0000sz00001⎠⎟⎟⎞ -
如果 s x = x y = x z s_x=x_y=x_z sx=xy=xz,那么我们叫做等比放缩矩阵。它的逆变换为
S − 1 ( s ) = S ( 1 / s x , 1 / s y , 1 / s z ) \mathbf{S}^{-1}(\mathbf{s})=\mathbf{S}\left(1 / s_{x}, 1 / s_{y}, 1 / s_{z}\right) S−1(s)=S(1/sx,1/sy,1/sz) -
等价表示形式为
S = ( 5 0 0 0 0 5 0 0 0 0 5 0 0 0 0 1 ) , S ′ = ( 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 / 5 ) \mathbf{S}=\left(\begin{array}{cccc}{5} & {0} & {0} & {0} \\ {0} & {5} & {0} & {0} \\ {0} & {0} & {5} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right), \quad \mathbf{S}^{\prime}=\left(\begin{array}{cccc}{1} & {0} & {0} & {0} \\ {0} & {1} & {0} & {0} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {1 / 5}\end{array}\right) S=⎝⎜⎜⎛5000050000500001⎠⎟⎟⎞,S′=⎝⎜⎜⎛1000010000100001/5⎠⎟⎟⎞
但是我们一般不适用第二种形式,因为需要除以第四元素得到最终目标点。会增加计算量。
-
反射矩阵,在放缩矩阵中,如果某个量或者三个量都取反。那么矩阵编程一个反射矩阵。如果其中两个元素取反。实际上变成一个旋转矩阵。
-
反射矩阵会影响三角形的点阵顺序,顺时针可能变成逆时针。所以需要特殊处理。
-
如何判断反射矩阵?计算变换矩阵的上面 3 × 3 3\times 3 3×3矩阵的行列式。如果为负数,则是旋转矩阵。
-
-
假设有三个轴 f x , f y , f z f_x,f_y,f_z fx,fy,fz他们互相垂直。并且是单位向量。那么如何构建这三个轴的放缩矩阵 X X X?
F = ( f x f y f z 0 0 0 0 1 ) \mathbf{F}=\left(\begin{array}{cccc}{\mathbf{f}^{x}} & {\mathbf{f}^{y}} & {\mathbf{f}^{z}} & {\mathbf{0}} \\ {0} & {0} & {0} & {1}\end{array}\right) F=(fx0fy0fz001)
构建如下 X = F S ( s ) F T X=FS(s)F^{T} X=FS(s)FT
斜切 {#ux659cux5207}
H x y ( s ) , H x z ( s ) , H y x ( s ) , H y z ( s ) , H z x ( s ) , and H z y ( s ) \mathbf{H}_{x y}(s), \mathbf{H}_{x z}(s), \mathbf{H}_{y x}(s), \mathbf{H}_{y z}(s), \mathbf{H}_{z x}(s), \text { and } \mathbf{H}_{z y}(s) Hxy(s),Hxz(s),Hyx(s),Hyz(s),Hzx(s), and Hzy(s)
H x z ( s ) = ( 1 0 s 0 0 1 0 0 0 0 1 0 0 0 0 1 ) \mathbf{H}_{x z}(s)=\left(\begin{array}{cccc}{1} & {0} & {s} & {0} \\ {0} & {1} & {0} & {0} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right) Hxz(s)=⎝⎜⎜⎛10000100s0100001⎠⎟⎟⎞
错切矩阵的逆 H i j − 1 ( s ) = H i j ( − s ) \mathbf{H}_{i j}^{-1}(s)=\mathbf{H}_{i j}(-s) Hij−1(s)=Hij(−s)
沿两个轴的错切矩阵
H x y ′ ( s , t ) = ( 1 0 s 0 0 1 t 0 0 0 1 0 0 0 0 1 ) \mathbf{H}_{x y}^{\prime}(s, t)=\left(\begin{array}{cccc}{1} & {0} & {s} & {0} \\ {0} & {1} & {t} & {0} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right) Hxy′(s,t)=⎝⎜⎜⎛10000100st100001⎠⎟⎟⎞
H i j ′ ( s , t ) = H i k ( s ) H j k ( t ) \mathbf{H}_{i j}^{\prime}(s, t)=\mathbf{H}_{i k}(s) \mathbf{H}_{j k}(t) Hij′(s,t)=Hik(s)Hjk(t)
Shear matrix preserve the volume.
∣ H ∣ = 1 |H|=1 ∣H∣=1
连续变换 {#ux8fdeux7eedux53d8ux6362}
一般的图形变换顺序是,错切,旋转,移动。 Q = T R S ( p ) Q=TRS(p) Q=TRS(p)
p is a point
刚体变换 {#ux521aux4f53ux53d8ux6362}
刚体转动的性质:长度,角度,坐标系的手性不会改变。任何一个刚体变换都可以写作移动和旋转矩阵的链接。
X = T ( t ) R = ( r 00 r 01 r 02 t x r 10 r 11 r 12 t y r 20 r 21 r 22 t z 0 0 0 1 ) \mathbf{X}=\mathbf{T}(\mathbf{t}) \mathbf{R}=\left(\begin{array}{cccc}{r_{00}} & {r_{01}} & {r_{02}} & {t_{x}} \\ {r_{10}} & {r_{11}} & {r_{12}} & {t_{y}} \\ {r_{20}} & {r_{21}} & {r_{22}} & {t_{z}} \\ {0} & {0} & {0} & {1}\end{array}\right) X=T(t)R=⎝⎜⎜⎛r00r10r200r01r11r210r02r12r220txtytz1⎠⎟⎟⎞
X = T ( t ) R = ( r 00 r 01 r 02 t x r 10 r 11 r 12 t y r 20 r 21 r 22 t z 0 0 0 1 ) \mathbf{X}=\mathbf{T}(\mathbf{t}) \mathbf{R}=\left(\begin{array}{cccc}{r_{00}} & {r_{01}} & {r_{02}} & {t_{x}} \\ {r_{10}} & {r_{11}} & {r_{12}} & {t_{y}} \\ {r_{20}} & {r_{21}} & {r_{22}} & {t_{z}} \\ {0} & {0} & {0} & {1}\end{array}\right) X=T(t)R=⎝⎜⎜⎛r00r10r200r01r11r210r02r12r220txtytz1⎠⎟⎟⎞
我们可以定义简单的形式。
R ‾ = ( r , 0 r , 1 r , 2 ) = ( r 0 T r 1 T r 2 T ) \overline{\mathbf{R}}=\left(\begin{array}{lll}{\mathbf{r}_{, 0}} & {\mathbf{r}_{, 1}} & {\mathbf{r}_{, 2}}\end{array}\right)=\left(\begin{array}{c}{\mathbf{r}_{0}^{T}} \\ {\mathbf{r}_{1}^{T}} \\ {\mathbf{r}_{2}^{T}}\end{array}\right) R=(r,0r,1r,2)=⎝⎛r0Tr1Tr2T⎠⎞
X = ( R ‾ t 0 T 1 ) \mathbf{X}=\left(\begin{array}{ll}{\overline{\mathbf{R}}} & {\mathbf{t}} \\ {\mathbf{0}^{T}} & {1}\end{array}\right) X=(R0Tt1)
X − 1 = ( r 0 , r 1 , r 2 , − R ‾ T t 0 0 0 1 ) \mathbf{X}^{-1}=\left(\begin{array}{cccc}{\mathbf{r}_{0},} & {\mathbf{r}_{1},} & {\mathbf{r}_{2},} & {-\overline{\mathbf{R}}^{T} \mathbf{t}} \\ {0} & {0} & {0} & {1}\end{array}\right) X−1=(r0,0r1,0r2,0−RTt1)
如何把点变换到摄像机空间, v , u v,u v,u其中v,为摄像机所指向的方向,u为摄像机定部的方向。可以利用 r = v ⊗ u r=v\otimes u r=v⊗u.这样就可以构造一个摄像机空间。
M = ( r x r y r z 0 u x u y u z 0 v x v y v z 0 0 0 0 1 ) ( 1 0 0 − t x 0 1 0 − t y 0 0 1 − t z 0 0 0 1 ) = ( r x r y r z − t ⋅ r u x u y u z − t ⋅ u v x v y v z − t ⋅ v 0 0 0 1 ) \mathbf{M}=\left(\begin{array}{cccc}{r_{x}} & {r_{y}} & {r_{z}} & {0} \\ {u_{x}} & {u_{y}} & {u_{z}} & {0} \\ {v_{x}} & {v_{y}} & {v_{z}} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right)\left(\begin{array}{cccc}{1} & {0} & {0} & {-t_{x}} \\ {0} & {1} & {0} & {-t_{y}} \\ {0} & {0} & {1} & {-t_{z}} \\ {0} & {0} & {0} & {1}\end{array}\right)=\left(\begin{array}{cccc}{r_{x}} & {r_{y}} & {r_{z}} & {-\mathbf{t} \cdot \mathbf{r}} \\ {u_{x}} & {u_{y}} & {u_{z}} & {-\mathbf{t} \cdot \mathbf{u}} \\ {v_{x}} & {v_{y}} & {v_{z}} & {-\mathbf{t} \cdot \mathbf{v}} \\ {0} & {0} & {0} & {1}\end{array}\right) M=⎝⎜⎜⎛rxuxvx0ryuyvy0rzuzvz00001⎠⎟⎟⎞⎝⎜⎜⎛100001000010−tx−ty−tz1⎠⎟⎟⎞=⎝⎜⎜⎛rxuxvx0ryuyvy0rzuzvz0−t⋅r−t⋅u−t⋅v1⎠⎟⎟⎞
其中,t是摄像机所在的位置。
法向量变换
H 为点的变换矩阵。
H ( p 1 − p 2 ) = H ( v ) ⇒ H ( v ) ⋅ M ( n ) = 0 H(p_1-p_2)=H(v)\Rightarrow H(v)\cdot M(n)=0 H(p1−p2)=H(v)⇒H(v)⋅M(n)=0
v T H T M n = 0 ⇒ H T M = ∣ H ∣ I ⇒ M = ( H ∗ ) T v^TH^TM n = 0 \Rightarrow H^TM=|H|I \Rightarrow M=(H^{*})^T vTHTMn=0⇒HTM=∣H∣I⇒M=(H∗)T
所以法向量的转换为 M = ( H ∗ ) T M=(H^{*})^T M=(H∗)T,而常规的点的变换为 H H H.之所以不能直接使用 H H H的原因是,H会放缩图形。
逆矩阵
优化计算逆矩阵速度
-
M = T ( t ) R ( Φ ) ⇒ M − 1 = R ( Φ ) T ( − t ) M=T(t)R(\varPhi)\Rightarrow M^{-1}=R(\varPhi)T(-t) M=T(t)R(Φ)⇒M−1=R(Φ)T(−t)
-
如果M是正交阵 M − 1 = M T M^{-1}=M^T M−1=MT
-
if the inverse is to be used for transforming vectors,then only the
3 × 3 upper left part of the matrix normally needs to be inverted.