[CG] 世界坐标系->相机坐标系详细推导

基变换

理论部分#

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

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

{u=a11x+a21y+a31zv=a12x+a22y+a32zw=a13x+a23y+a33z

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

[u,v,w]=[x,y,z][a11a21a31a12a22a32a13a23a33]

A=[a11a21a31a12a22a32a13a23a33]

一般教科书里把A称作过渡矩阵。设一个向量V,在基(x,y,z)下的坐标为(x1,y1,z1)T,在基(u,v,w)下的坐标为(u1,v1,w1)T,则有

(x,y,z)(x1,y1,z1)T=(u,v,w)(u1,v1,w1)T=(x,y,z)A(u1,v1,w1)T

(x1,y1,z1)T=A(u1,v1,w1)T......(1)

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

矩阵A的构成#

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

在理论部分,如果[x,y,z]代表的是笛卡尔坐标,那么(a11,a21,a31)恰好就是u在笛卡尔坐标系的坐标表示,v,w同理,所以A矩阵相当于是由基(u,v,w)在笛卡尔坐标系中的坐标组成的。记(xu,yu,zu)u的坐标,v,w同理,那么矩阵A可以写作

A=[xuxvxwyuyvywzuzvzw]

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

A1(x1,y1,z1)T=(u1,v1,w1)T......(2)

A1=[xuyuzuxvyvzvxwywzw]

如果令u0=(xu,yu,zu)T,v0=(xv,yv,zv)T,w0=(xw,yw,zw)T,那么(1)公式可以写作

(x1,y1,z1)T=[u0v0w0](u1,v1,w1)T=u1u0+v1v0+w1w0

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

Vx=(x1,y1,z1)T,(2)公式可以写作

(u1,v1,w1)T=[u0Tv0Tw0T]Vx=[u0TVxv0TVxw0TVX]

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

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

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

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

定义相机坐标系#

首先我们需要定义三个量

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

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

w=g||g||u=t×w||t×w||v=w×u

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

构建变换矩阵#

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

(u1,v1,w1)T=[u0Tv0Tw0T]Vx=[u0TVxv0TVxw0TVX]

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

因此还得有一个位移矩阵

B=[100xe010ye001ze0001]

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

那么A1矩阵为

A1=[xuyuzu0xvyvzv0xwywzw00001]

归纳总结#

归纳总结一下

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

u=[xuyuzu0xvyvzv0xwywzw00001][100xe010ye001ze0001]x

作者:芒果和小猫

出处:https://www.cnblogs.com/WAoyu/p/13083800.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   芒果和小猫  阅读(1870)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu