本文来自 《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⎦
⎤⎣
⎡100010−xe−ye1⎦
⎤⎣
⎡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⎦
⎤⎣
⎡100010−xe−ye1⎦
⎤pxy=⎣
⎡xuxv0yuyv0001⎦
⎤⎣
⎡100010−xe−ye1⎦
⎤⎣
⎡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文章来源:https://www.toymoban.com/news/detail-482143.html
=
[
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 维的结论可以推广:
文章来源地址https://www.toymoban.com/news/detail-482143.html
到了这里,关于坐标系之间的变换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!