• 坐标系之间的变换


    本文来自 《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}=

    [uve001]" role="presentation" style="position: relative;">[uve001]
    \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 ]
    [upvp1]" role="presentation" style="position: relative;">[upvp1]
    =
    [xuyu0xvyv0001]" role="presentation" style="position: relative;">[xuyu0xvyv0001]
    [10xe01ye001]" role="presentation" style="position: relative;">[10xe01ye001]
    [xpyp1]" role="presentation" style="position: relative;">[xpyp1]
    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}=

    [uve001]" role="presentation" style="position: relative;">[uve001]
    ^{-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}=
    [xuvyuvouv001]" role="presentation" style="position: relative;">[xuvyuvouv001]
    \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}=
    [xuyu0xvyv0001]" role="presentation" style="position: relative;">[xuyu0xvyv0001]
    [10xe01ye001]" role="presentation" style="position: relative;">[10xe01ye001]
    \mathbf{p}_{xy}=
    [xuyu0xvyv0001]" role="presentation" style="position: relative;">[xuyu0xvyv0001]
    [10xe01ye001]" role="presentation" style="position: relative;">[10xe01ye001]
    [10xe01ye001]" role="presentation" style="position: relative;">[10xe01ye001]
    [xuxv0yuyv0001]" role="presentation" style="position: relative;">[xuxv0yuyv0001]
    \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 =
    [xuyu0xvyv0001]" role="presentation" style="position: relative;">[xuyu0xvyv0001]
    [100010001]" role="presentation" style="position: relative;">[100010001]
    [xuxv0yuyv0001]" role="presentation" style="position: relative;">[xuxv0yuyv0001]
    \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 =

    [xu2+yu2xuxv+yuyv0xvxu+yvyuxv2+yv20001]" role="presentation" style="position: relative;">[xu2+yu2xuxv+yuyv0xvxu+yvyuxv2+yv20001]
    \mathbf{p}_{uv} = xu2+yu2xvxu+yvyu0xuxv+yuyvxv2+yv20001 puv
    = [ 1 0 0 0 1 0 0 0 1 ] p u v =
    [100010001]" role="presentation" style="position: relative;">[100010001]
    \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 维的结论可以推广:
    在这里插入图片描述

  • 相关阅读:
    【c++】逆波兰表达式求值(详解)
    SpringBoot项目创建及运行
    nginx解决vue跨域图片问题
    kafka第三课-可视化工具、生产环境问题总结以及性能优化
    WebDAV之π-Disk派盘 + 恒星播放器
    策略模式在数据接收和发送场景的应用
    【Spring-MyBatis】数据库字段下划线映射到 java 对象的驼峰式命名属性
    计算机毕业设计springboot+vue基本微信小程序的医疗监督反馈小程序 uniapp
    文心一言 VS 讯飞星火 VS chatgpt (110)-- 算法导论10.2 1题
    exp 4
  • 原文地址:https://blog.csdn.net/OrdinaryMatthew/article/details/126104644