基本变换

UTF8gbsn

关于齐次坐标 {#ux5173ux4e8eux9f50ux6b21ux5750ux6807}

首先,空间变换一般使用仿射空间,也就是变换同时包含平移,旋转等。通常使用其次坐标,使用齐次坐标的好处,和优点。

  1. 仿射空间可以区分点和向量。

    • 向量 ( 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)

    • 两个点的差是一个向量。

  2. 可以表示无穷远处

    • 如果 ( 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ϕ00sinϕ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ϕ0sinϕ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ϕ00sinϕ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) Ri1(ϕ)=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=1m(AB)ii=i=1mj=1naijbji=i=1mj=1nbjiaij=i=1n(BA)ii=Tr(BA)

下一步我们可以把任意的旋转矩阵改写为绕x轴旋转的矩阵 R = Q R x Q − 1 R=QR_{x}Q^{-1} R=QRxQ1其中 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(QRxQ1)=Tr(RxQ1Q)=Tr(Rx)=1+2cos(ϕ)

其中Q是一个单位正交阵 Q Q − 1 = I QQ^{-1}=I QQ1=I,用于进行空间变换,把点变换到旋转轴为x轴的所在空间中。

放缩 {#ux653eux7f29}

  1. 放缩矩阵
    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

  2. 如果 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) S1(s)=S(1/sx,1/sy,1/sz)

  3. 等价表示形式为

    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

    但是我们一般不适用第二种形式,因为需要除以第四元素得到最终目标点。会增加计算量。

  4. 反射矩阵,在放缩矩阵中,如果某个量或者三个量都取反。那么矩阵编程一个反射矩阵。如果其中两个元素取反。实际上变成一个旋转矩阵。

    • 反射矩阵会影响三角形的点阵顺序,顺时针可能变成逆时针。所以需要特殊处理。

    • 如何判断反射矩阵?计算变换矩阵的上面 3 × 3 3\times 3 3×3矩阵的行列式。如果为负数,则是旋转矩阵。

  5. 假设有三个轴 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) Hij1(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) X1=(r0,0r1,0r2,0RTt1)

如何把点变换到摄像机空间, v , u v,u v,u其中v,为摄像机所指向的方向,u为摄像机定部的方向。可以利用 r = v ⊗ u r=v\otimes u r=vu.这样就可以构造一个摄像机空间。

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=rxuxvx0ryuyvy0rzuzvz00001100001000010txtytz1=rxuxvx0ryuyvy0rzuzvz0trtutv1

其中,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(p1p2)=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=0HTM=HIM=(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(Φ)M1=R(Φ)T(t)

  • 如果M是正交阵 M − 1 = M T M^{-1}=M^T M1=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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值