坐标系变换

坐标系变换

  • 坐标系变换
    • 不考虑平移
    • 加入平移
      • 齐次坐标系与平移
    • 追溯过程
    • 矩阵变换坐标系变换 or 位置变换
    • 总结

Think an invertible matrix as a coordinate.

坐标系变换,例如,现在有一个点P,在A坐标系中的坐标为 (x,y) ,如何求出点P在其他坐标系下的坐标呢?比如,我们想知道P点在B坐标系中的坐标?


坐标系变换_第1张图片

做个类比,如果两个讲不同母语的人想要交流,怎么办?这时,如果有一种世界通用语言就好了,例如汉语。这样,当说英语的人向说法语的人问候“你好”的时候,他知道要查字典先把英文 “hello”转换成中文“你好”,然后,说法语的人就可以将“你好”转换成法文“Bonjour”。

这里有两个过程:

  • hello 你好
  • 你好 Bonjour

这两个过程中有一个关键点:

你好 —汉语

是的,世界通用语言,我们的汉语,就是key point, 她在不同语系中充当了桥梁的角色。

回到坐标系的话题,使用不同的坐标系就像使用不同的语言,各说各话,相互之间是无法被理解的。如果想要被理解,那就的使用大家都认同的方式交流。这时候,如果引入一个参考坐标系,世界就和平了:

我们可以将P点的坐标先转化为一个参考坐标,然后再从参考坐标转换到B坐标系中的坐标。

  • A Global
  • Global B

现在,我们的问题变成了求某个坐标系X与参考坐标系Global之间的转换方法:

X Global

不考虑平移

如果考虑不同的坐标系共原点,就像下面这样:


坐标系变换_第2张图片

选择坐标系A作为参考坐标系,如何表述:

B A

答案是:矩阵变换

矩阵变换就像词典翻译一样,将一个坐标系下的点转换成另一个坐标系中的点。

矩阵与线性变换中提到了在同一个坐标系中矩阵变换的作用,例如,将一个向量进行旋转。现在,矩阵变换被不可思议的用作了坐标系变换的工具。变换还是同样的变换,只是站在了不用的角度看待问题

  • 矩阵变换之于同一个坐标系,可以理解为坐标系不变,点的位置改变。
  • 矩阵变换之于不同坐标系,可以理解为点的绝对位置不变,坐标系改变。

其实在矩阵与线性变换拓展一节中,我提到了一种转换关系,这里,我给出上图的对应表述:

(1) [xy] = B[xy] [xy] = B1[xy] B = [b1b2] , 且 b1b2 是坐标系B的基向量

其中,矩阵 B 的各个列向量分别对应B坐标系的各个基向量 [xy] 是向量 OP 或者说点P在B坐标系的表示, [xy] 则是向量 OP 或者点P在A坐标系中的表示。求出矩阵 B ,我们就有了翻译用的字典。

这一切,在于矩阵 B 的各个列向量,在于B坐标系的基向量。

(1) 的转换关系之所以成立,是因为矩阵 B 的各个列向量是B坐标系的基向量,他们都是坐标系A中的向量。更明确的说,矩阵 B 的列向量由坐标系A的基向量通过一个线性变换得到,这个线性变换完全可以用矩阵 B 表示,详见矩阵与线性变换。

上图对应的矩阵B的两个列向量分别为 b1 = [25/55/5] b2 = [5/525/5]

其实A、B可以是任何坐标系,式(1)仍然成立,只要满足:

  • 坐标系A和坐标系B原点均为(0,0)
  • 矩阵 B 的各个列向量分别对应B坐标系的各个基向量
  • 矩阵 B 的各个列向量都是坐标系A中的向量

坐标系B的基向量是坐标系A的基向量的一个线性变换 ,这个线性变换可以用矩阵 B 表示( T(x⃗ )=Bx⃗  ),确定坐标系B的基向量在A坐标系中的表示的过程叫做B坐标系的定位(landed)。将B坐标系的基向量定位在A坐标系中确定了一种关系,我们暂且把这种关系称为追溯关系,把A坐标系称为B坐标系的上游坐标系。反过来,如果把坐标系A的基向量定位在B坐标系中,那么B坐标系就成了A坐标系的上游坐标系。

下面,用图说话:


坐标系变换_第3张图片

以图中的两个向量 b1,b2 为基确定一个坐标系B,显然,在B坐标系中 b1B=[10],b2B=[01] , 接下来, b1,b2 定位到A坐标中,得到 b1A=[21],b2A=[11]

OP = 2 b1 +2 b2

OP 在B坐标系中的表示为 [22] ,现在,将 OP 用A坐标系描叙:

OP = 2 b1 +2 b2 = 2b1A+2b2A = [b1Ab2A] [22] = [24]

现在,令矩阵 B = [b1Ab2A] ,P点是用B坐标系表示的任意一点 (x,y)

于是 OP 在A坐标系中的表示 [xy] = B [xy] ,显然, B 是可逆的,于是就有了(1)式的结论。

虽然这里的讨论是基于二维的,但是,不难想象,这里得出的结论可以扩展到任意维度。

用一句话来阐述这个结论

将B坐标系的基向量定位到A坐标系,然后将定位之后的基向量作为矩阵 B 的列向量,用矩阵 B 对B坐标系中的点P的坐标进行矩阵变换,将得到点P在A坐标系中的坐标。这个过程,就是从坐标系B到坐标系A的一个追溯过程。

加入平移

平移好像没什么好说的,不过就是在前面讨论的基础上引入一个偏移

下面用图示说明:


坐标系变换_第4张图片

上图引入了一个新的坐标系,取名为A’。将这个坐标系取名为A’是有原因的,因为他基本就是坐标系A的一个替身,他们之间除了坐标原点发生偏移之外,其他特征完全一致。

有了前面的基础,我们知道,将坐标系B中的坐标转换为坐标系A’中的坐标其实就是一个从B到A’的追溯过程。只要将坐标系B的基定位到A’坐标系中,以定位之后的基向量为列组成矩阵 B ,然后对坐标系中的坐标进行 B 矩阵转换就能得到其在A’坐标系中的坐标。反过来,求出矩阵 B 的逆,我们就能将A’坐标系中的坐标转化为B坐标系中的坐标。

也就是说,利用前面讨论的结论,我们能完成:

BA

[xy] = B[xy] [xy] = B1[xy]

剩下的问题就是:

AA

这个问题就是一个加减偏移量的问题,所以看图就一目了然了。

齐次坐标系与平移

引入齐次坐标的好处之一是可以使用矩阵表达平移:


坐标系变换_第5张图片

所以 AA 之间的变换可以用这么一个矩阵变换来完成。

追溯过程


坐标系变换_第6张图片

将坐标系B的基向量定位到坐标系A’中,得到向量 b1A,b2A ,所以从坐标系B追溯到坐标系A’的矩阵 B = [b1Ab2A] AA 的平移矩阵 T 100010TxTy1

故,将坐标系B中的点 p(xB,yB) 追溯到坐标系A中可以用下面的矩阵变换表示:

1). 将坐标变换到坐标系A’:

[xAyA] = B [xByB]

2). 将坐标变换到坐标系A中:

[xAyA] = T [xAyA]

综合起来就是:

[xAyA] = T B [xByB]

反过来, AA 的平移矩阵 T 100010TxTy1 ,从坐标系A’追溯到坐标系B的矩阵 A = B1

故,将坐标系A中的点 p(xA,yA) 追溯到坐标系中B中可以用下面的矩阵变换表示:

[xByB] = A T [xAyA] = (TB)1 [xAyA]

矩阵变换:坐标系变换 or 位置变换


坐标系变换_第7张图片

站在不同的角度看同一个矩阵变换 Bx⃗ 

1). 位置变换:

A坐标系中:

向量 OP=[22] , 向量 b1=[21] b2=[11] , 令矩阵 B = [b1b2] ,则矩阵变换 Bx⃗  会将 OP 变到 OP

2). 坐标系变换:

B坐标系中:

向量 OP=[22]

A坐标系中:

向量 b1=[21] b2=[11] , 令矩阵 B = [b1b2] ,则矩阵变换 Bx⃗  会将 OP 从坐标系B变到坐标系A。

总结

于是,对任意坐标向量 x⃗  ,矩阵变换的组合 M1M22M3...Mn 作用于 x⃗  存在两种解释。

x = M1M22M3...Mn x⃗  的两种解释:

1). 坐标系不变,位置变换:

M1M22M3...Mn 看作从右到左依次作用的矩阵变换。首先 Mn 变换, 将坐标向量 x⃗  变换到了 xn1 = Mn x⃗  ,接着是 Mn1 变换,将坐标向量 xn1 变换到了 xn2 = Mn1 xn1 …。所有的中间结果都是同一个坐标系中的坐标向量,所有的变换都是针对同一个坐标系的变换。

2). 位置不变,坐标系变换:

M1M22M3...Mn 看作从左到右依次作用的矩阵变换。首先 M1 变换,将M1坐标系中的坐标向量 x1 转换为起始坐标系中的向量 x x = M1 x1 ,然后是 M2 变换,将M2坐标系中的坐标向量 x2 转换成M1坐标系中的坐标向量 x1 x1 = M2 x2 …最后是 Mn 变换,将Mn坐标系中的坐标向量 x⃗  转换成Mn-1坐标系中的坐标向量 xn1 xn1 = Mn x⃗  。所有的中间结果都是不同坐标系中的坐标向量,且坐标向量的绝对位置没有改变(想象该点被一个钉子钉住)。从Mn坐标系的坐标向量 x⃗  依次与 MnMn1...M3M2M1 矩阵相乘最终转换到起始坐标系对应的坐标向量 x 的过程就是一系列前面提到过的追溯过程

你可能感兴趣的:(数学,OpenGL)