zoukankan      html  css  js  c++  java
  • [computer graphics]世界坐标系->相机坐标系详细推导

    基变换

    理论部分

    在n维的线性空间中,任意n个线性无关的向量都可以作为线性空间的基,即空间基不唯一。对于不同的基,同一个向量的坐标一般是不同的。因为在计算机图形学中,主要研究三维的空间,所以可以简化问题倒三维空间中的基变换,也就是坐标变换。

    假设有两组单位正交基(图形学中选取的坐标系一般是正交的,为了方便)(x,y,z)(u,v,w),他们的关系是

    [egin{cases} u = a_{11}x+a_{21}y+a_{31}z\ v = a_{12}x+a_{22}y+a_{32}z\ w = a_{13}x+a_{23}y+a_{33}z\ end{cases} ]

    因为都是基,所以可以用另一组基来表示。我们可以将其写作矩阵的形式

    [[u,v,w] = [x,y,z] egin{bmatrix} a_{11} & a_{21} & a_{31}\ a_{12} & a_{22} & a_{32}\ a_{13} & a_{23} & a_{33}\ end{bmatrix} ]

    [A = egin{bmatrix} a_{11} & a_{21} & a_{31}\ a_{12} & a_{22} & a_{32}\ a_{13} & a_{23} & a_{33}\ end{bmatrix} ]

    一般教科书里把A称作过渡矩阵。设一个向量(V),在基((x,y,z))下的坐标为((x_1,y_1,z_1)^{T}),在基((u,v,w))下的坐标为((u_1,v_1,w_1)^{T}),则有

    [egin{aligned} (x,y,z)(x_1,y_1,z_1)^{T} & =(u,v,w)(u_1,v_1,w_1)^{T} \ &=(x,y,z)A(u_1,v_1,w_1)^{T}\ end{aligned} ]

    [(x_1,y_1,z_1)^{T} = A(u_1,v_1,w_1)^{T} ......(1) ]

    因为((x,y,z))为正交矩阵,有逆矩阵,所以可以消除。所以得到变换公式。

    矩阵A的构成

    上面说了一些理论,那么A矩阵是什么,怎么用呢?坐标值如果脱离基的话,没有任何意义。我们平时说的坐标,一般都有一个默认的条件的,就是位于原点的直角坐标系,笛卡尔坐标系。当我们在描述某个坐标系的时候,我们一般用笛卡尔坐标系作为参考来描述。也就是用笛卡尔坐标系里的坐标值来描述另一个坐标系的基。

    在理论部分,如果([x,y,z])代表的是笛卡尔坐标,那么((a_{11},a_{21},a_{31}))恰好就是(u)在笛卡尔坐标系的坐标表示,(v,w)同理,所以A矩阵相当于是由基((u,v,w))在笛卡尔坐标系中的坐标组成的。记((x_u,y_u,z_u))(u)的坐标,(v,w)同理,那么矩阵A可以写作

    [A = egin{bmatrix} x_u & x_v & x_w\ y_u & y_v & y_w\ z_u & z_v & z_w\ end{bmatrix} ]

    由于A是正交矩阵,那么A的逆矩阵等于其转置矩阵,则由

    [A^{-1}(x_1,y_1,z_1)^{T} = (u_1,v_1,w_1)^{T} ......(2) ]

    [A^{-1} = egin{bmatrix} x_u & y_u & z_u\ x_v & y_v & z_v\ x_w & y_w & z_w\ end{bmatrix} ]

    如果令(u_0 = (x_u,y_u,z_u)^{T},v_0 = (x_v,y_v,z_v)^{T},w_0 = (x_w,y_w,z_w)^{T}),那么(1)公式可以写作

    [(x_1,y_1,z_1)^{T}= egin{bmatrix} u_0 &v_0&w_0 end{bmatrix} (u_1,v_1,w_1)^{T} =u_1u_0+v_1v_0+w_1w_0 ]

    就相当于是用((u,v,w))基来表示了向量(V),而((u,v,w))基使用笛卡尔坐标系来表示,所以(V)向量自然就可以转换到笛卡尔坐标系了。

    (V_x = (x_1,y_1,z_1)^{T}),(2)公式可以写作

    [(u_1,v_1,w_1)^{T}= egin{bmatrix} u_0^{T} \v_0^{T}\w_0^{T} end{bmatrix} V_x = egin{bmatrix} u_0^{T}V_x \v_0^{T}V_x\w_0^{T}V_X end{bmatrix} ]

    相当于是向基((u,v,w))做投影,得到各个轴上的投影值,而投影值本质上就是这个坐标系内的坐标值。

    综上所述,利用三维空间的坐标,阐述了坐标系的变换过程,可能有些不严谨,但是对于计算机图形学中的坐标系转换应该够了。

    实际应用,世界坐标系->相机坐标系

    图中(O,x,y,z)坐标系一般是世界坐标系,而((e,u,v,w))是相机坐标系,模拟人眼看到的东西,物体的描述现在是在世界坐标系下,所以我们现在要将其描述转换到相机坐标系下,所有的物体都没有动,只是表示形式的变换。

    定义相机坐标系

    首先我们需要定义三个量

    • 眼睛的位置 (e),就是相机放在什么地方。
    • 视线朝向的向量 (g),相机看向什么地方,类似于眼睛往哪里看。
    • 朝向上方的向量 (t),相机顶部的朝向,类似于人头顶的朝向,一般都朝向天空。

    以上的信息足够让我们定义出一个相机坐标系来

    [egin{aligned} w &= -frac{g}{||g||}\ u &= frac{t imes w}{||t imes w||}\ v &= w imes u end{aligned} ]

    • 首先(g)是相机看过去的方向,而一般相机坐标系都是朝着(w)轴的负方向看去,因此对(g)取反并归一化,得到单位向量(w)
    • 接着(t)类似于(v)的朝向,然后(t)(w)做叉乘得到(u),因为叉乘得到的是(t)(w)构成平面的法向量,然后归一化。
    • 同理(w)(u)叉乘得到(v)

    构建变换矩阵

    现在(e,u,v,w)都有了,言外之意就是他们在世界坐标系中可以用坐标值来表示了。
    现在要把物体在世界坐标系内的坐标转到相机坐标系中。首先假设,我们的相机坐标系位于原点,那么利用之前推导的公式,可以利用公式(2)进行转换

    [(u_1,v_1,w_1)^{T}= egin{bmatrix} u_0^{T} \v_0^{T}\w_0^{T} end{bmatrix} V_x = egin{bmatrix} u_0^{T}V_x \v_0^{T}V_x\w_0^{T}V_X end{bmatrix} ]

    如果相机坐标系位于原点,那么问题就结束了。但是相机坐标系位于(e)点,所以还存在一个位移量。那么是加还是减呢?是减,为什么?因为是相对于新坐标系。例如5相对于0的坐标是5,而距离3是2个单位,而5和3都是相对0来说的。因此用5-3得到5相对于3的坐标是2。因此我们应该用物体在世界坐标系下的坐标减去相机坐标系的原点坐标吗,得到物体相对于相机坐标系原点的坐标。

    因此还得有一个位移矩阵

    [B= egin{bmatrix} 1&0&0&-x_e\ 0&1&0&-y_e\ 0&0&1&-z_e\ 0&0&0&1\ end{bmatrix} ]

    这里开始使用齐次坐标了,通常使用的都是齐次坐标,可以将位移可其他变换统一起来。

    那么(A^{-1})矩阵为

    [A^{-1} = egin{bmatrix} x_u & y_u & z_u & 0\ x_v & y_v & z_v & 0\ x_w & y_w & z_w & 0\ 0 & 0 & 0 & 1 end{bmatrix} ]

    归纳总结

    归纳总结一下

    1. 定义 (e,g,t),通过计算得到(e,u,v,w),用世界坐标系的坐标值表示
    2. 利用矩阵B进行位移
    3. 利用矩阵(A^{-1})投影到相机坐标系的坐标轴上

    [u_{相机坐标系坐标值}=egin{bmatrix} x_u & y_u & z_u & 0\ x_v & y_v & z_v & 0\ x_w & y_w & z_w & 0\ 0 & 0 & 0 & 1 end{bmatrix} egin{bmatrix} 1&0&0&-x_e\ 0&1&0&-y_e\ 0&0&1&-z_e\ 0&0&0&1\ end{bmatrix} x_{世界坐标系坐标值} ]

  • 相关阅读:
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (四) 自动化部署
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (三) 服务观测
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (二) 部署微服务程序
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (一) 部署 Nacos
    C++知识点
    libmkl 学习笔记
    基于tesseract-OCR进行中文识别
    poco编译与运行
    Linux下的I/O复用与epoll详解(转载)
    高并发网络编程之epoll详解(转载)
  • 原文地址:https://www.cnblogs.com/WAoyu/p/13083800.html
Copyright © 2011-2022 走看看