坐标系之间的变换

本文来自 《Fundamentals of Computer Graphic》 7.5 Coordinate Transform
在图 7.19 中,右上图是保持坐标系不变,移动点的位置;右下图是保持点的位置不变,移动坐标系。在这两种移动方法之后,点在坐标系上的坐标都是 ( 1 , 1 ) (1,1) (1,1)
在这里插入图片描述
改变坐标系的想法与编程中的类型转换类似。在我们把一个浮点数和一个整型数相加之前。我们需要把浮点型转换为整型或者把整型转换成浮点型。再举一个例子,假设有一辆行驶在城市中的轿车。在我们能把城市和车画在一起之前,我们需要把城市转换到轿车坐标系或者把轿车转换到城市坐标系。
 
几何地,一个坐标系由一个原点和一组基底(3个向量的集合)构成。一般默认是正交基底。
在一个拥有原点 p \mathbf{p} p 和基底 u , v , w \mathbf{u},\mathbf{v},\mathbf{w} u,v,w,坐标 ( u , v , w ) (u,v,w) (u,v,w) 描述了下面这个点
p + u u + v v + w w . \mathbf{p}+u\mathbf{u}+v\mathbf{v}+w\mathbf{w}. p+uu+vv+ww.
在 2 维的情况下,默认使用 o \mathbf{o} o 表示原点, x \mathbf{x} x y \mathbf{y} y 分别表示右手系正交基底向量。

在 2 维的情况下,右手系表示从 x \mathbf{x} x 轴开始逆时针选择。
在下图 7.20 中,左图有两个坐标系与一个点,右图表示了该点在两个不同坐标系下是如何构成的。
在这里插入图片描述

p = ( x p , y p ) ≡ o + x p x + y p y \mathbf{p}=(x_p,y_p) \equiv \mathbf{o} +x_p \mathbf{x}+y_p\mathbf{y} p=(xp,yp)o+xpx+ypy
在图 7.20 中, ( x p , y p ) = ( 2.5 , 0.9 ) (x_p, y_p) = (2.5,0.9) (xp,yp)=(2.5,0.9)
类似地,
p = ( u p , v p ) ≡ o + u p x + v p y \mathbf{p}=(u_p,v_p) \equiv \mathbf{o} +u_p \mathbf{x}+v_p\mathbf{y} p=(up,vp)o+upx+vpy
在图 7.20 中, ( x p , y p ) = ( 0.5 , − 0.7 ) (x_p, y_p) = (0.5,-0.7) (xp,yp)=(0.5,0.7)
我们可以用下面的矩阵来表示上面两种不同坐标系下坐标的关系:
在这里插入图片描述
注意,上面的 x e , y e x_e,y_e xe,ye 分别表示 e \mathbf{e} e 点在以 o \mathbf{o} o 为原点的坐标系下的坐标。
上面的 x u , y u x_u,y_u xu,yu 分别表示向量 u \mathbf{u} u 在以 o \mathbf{o} o 为原点的坐标系下的坐标。
上面的 x v , y v x_v,y_v xv,yv 分别表示向量 v \mathbf{v} v 在以 o \mathbf{o} o 为原点的坐标系下的坐标。
实际上,这是先对关于 u , v \mathbf{u,v} u,v做了旋转, 再对 e \mathbf{e} e 做了平移操作。用下述更加简洁的矩阵表示:
p x y = [ u v e 0 0 1 ] p u v \mathbf{p}_{xy}=\begin{bmatrix} \mathbf{u} & \mathbf{v} & \mathbf{e} \\ 0 & 0 &1 \end{bmatrix} \mathbf{p}_{uv} pxy=[u0v0e1]puv
我们称上面的矩阵为针对(u,v)帧的 frame-to-canonical 矩阵。它将以用 ( u , v ) (u,v) (u,v) 帧表示的点作为输入,转换到以 canonical frame 表示的形式。
 
相反的转换顺序,我们有
[ u p v p 1 ] = [ x u y u 0 x v y v 0 0 0 1 ] [ 1 0 − x e 0 1 − y e 0 0 1 ] [ x p y p 1 ] \begin{bmatrix} u_p \\ v_p \\1 \end{bmatrix} = \begin{bmatrix} x_u&y_u &0 \\ x_v & y_v&0 \\ 0&0&1 \end{bmatrix} \begin{bmatrix} 1&0 &-x_e \\ 0& 1&-y_e \\ 0&0&1 \end{bmatrix} \begin{bmatrix} x_p \\ y_p \\1 \end{bmatrix} upvp1 = xuxv0yuyv0001 100010xeye1 xpyp1

上面是先平移,再旋转,注意与之前的区分开来。
它们是之前我们用来构造 frame-to-canonical 矩阵的旋转与平移的逆,被称作 canonical-to-frame 矩阵。
p u v = [ u v e 0 0 1 ] − 1 p x y \mathbf{p}_{uv}=\begin{bmatrix} \mathbf{u} & \mathbf{v} & \mathbf{e} \\ 0 & 0 &1 \end{bmatrix}^{-1} \mathbf{p}_{xy} puv=[u0v0e1]1pxy
canonical-to-frame 矩阵将以 canonical 帧表示的点为输入,将它们转化成在 ( u , v ) (u,v) (u,v) 帧下表示的点。我们将这个矩阵表示成 frame-to-canonical 矩阵的逆,因为它不能立刻被写成使用 e , u , w \mathbf{e} ,\mathbf{u},\mathbf{w} e,u,w 的 canonical 坐标。但是请记住,所有坐标系都是等价的;将向量以 x − , y − x-,y- x,y坐标存储的习惯创造了这种看上去的不对称。canonical-to-frame矩阵可以被简单表示为 o , x , y \mathbf{o} ,\mathbf{x},\mathbf{y} o,x,y 的坐标 ( u , v ) (u,v) (u,v)
p u v = [ x u v y u v o u v 0 0 1 ] p x y \mathbf{p}_{uv}=\begin{bmatrix} \mathbf{x}_{uv} & \mathbf{y}_{uv} & \mathbf{o}_{uv} \\ 0 & 0 &1 \end{bmatrix} \mathbf{p}_{xy} puv=[xuv0yuv0ouv1]pxy
 
 
关于上述两个矩阵,做个验证:
p u v = [ x u y u 0 x v y v 0 0 0 1 ] [ 1 0 − x e 0 1 − y e 0 0 1 ] p x y = [ x u y u 0 x v y v 0 0 0 1 ] [ 1 0 − x e 0 1 − y e 0 0 1 ] [ 1 0 x e 0 1 y e 0 0 1 ] [ x u x v 0 y u y v 0 0 0 1 ] p u v \mathbf{p}_{uv}=\begin{bmatrix} x_u&y_u &0 \\ x_v & y_v&0 \\ 0&0&1 \end{bmatrix} \begin{bmatrix} 1&0 &-x_e \\ 0& 1&-y_e \\ 0&0&1 \end{bmatrix}\mathbf{p}_{xy}= \begin{bmatrix} x_u&y_u &0 \\ x_v & y_v&0 \\ 0&0&1 \end{bmatrix} \begin{bmatrix} 1&0 &-x_e \\ 0& 1&-y_e \\ 0&0&1\end{bmatrix} \begin{bmatrix} 1&0 &x_e \\ 0& 1&y_e \\ 0&0&1 \end{bmatrix} \begin{bmatrix} x_u&x_v &0 \\ y_u & y_v&0 \\ 0&0&1 \end{bmatrix} \mathbf{p}_{uv} puv= xuxv0yuyv0001 100010xeye1 pxy= xuxv0yuyv0001 100010xeye1 100010xeye1 xuyu0xvyv0001 puv
= [ x u y u 0 x v y v 0 0 0 1 ] [ 1 0 0 0 1 0 0 0 1 ] [ x u x v 0 y u y v 0 0 0 1 ] p u v =\begin{bmatrix} x_u&y_u &0 \\ x_v & y_v&0 \\ 0&0&1 \end{bmatrix} \begin{bmatrix} 1&0&0 \\ 0 & 1&0 \\ 0&0&1 \end{bmatrix} \begin{bmatrix} x_u&x_v &0 \\ y_u & y_v&0 \\ 0&0&1 \end{bmatrix}\mathbf{p}_{uv} = xuxv0yuyv0001 100010001 xuyu0xvyv0001 puv

= [ x u 2 + y u 2 x u x v + y u y v 0 x v x u + y v y u x v 2 + y v 2 0 0 0 1 ] p u v =\begin{bmatrix} x_u^2+y_u^2&x_ux_v+y_uy_v &0 \\ x_vx_u+y_vy_u & x_v^2+y_v^2&0 \\ 0&0&1 \end{bmatrix}\mathbf{p}_{uv} = xu2+yu2xvxu+yvyu0xuxv+yuyvxv2+yv20001 puv
= [ 1 0 0 0 1 0 0 0 1 ] p u v =\begin{bmatrix} 1&0&0 \\ 0 & 1&0 \\ 0&0&1 \end{bmatrix}\mathbf{p}_{uv} = 100010001 puv
注意到, x u 2 + y u 2 x_u^2+y_u^2 xu2+yu2 表示单位向量的模长的平方, x u x v + y u y v x_ux_v+y_uy_v xuxv+yuyv 表示两个正交向量的内积。
在 3 维中,上面的关于 2 维的结论可以推广:
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

培之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值