基变换

理论部分

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

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

\[\begin{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]
\begin{bmatrix}
a_{11} & a_{21} & a_{31}\\
a_{12} & a_{22} & a_{32}\\
a_{13} & a_{23} & a_{33}\\
\end{bmatrix}
\]

\[A = \begin{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}\),则有

\[\begin{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 = \begin{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} = \begin{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}=
\begin{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}=
\begin{bmatrix}
u_0^{T} \\v_0^{T}\\w_0^{T}
\end{bmatrix}
V_x
=
\begin{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\),相机顶部的朝向,类似于人头顶的朝向,一般都朝向天空。

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

\[\begin{aligned}
w &= -\frac{g}{||g||}\\
u &= \frac{t\times w}{||t\times w||}\\
v &= w \times 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}=
\begin{bmatrix}
u_0^{T} \\v_0^{T}\\w_0^{T}
\end{bmatrix}
V_x
=
\begin{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=
\begin{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} = \begin{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_{相机坐标系坐标值}=\begin{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}
\begin{bmatrix}
1&0&0&-x_e\\
0&1&0&-y_e\\
0&0&1&-z_e\\
0&0&0&1\\
\end{bmatrix}
x_{世界坐标系坐标值}
\]

[computer graphics]世界坐标系->相机坐标系详细推导的更多相关文章

  1. Computer Graphics Research Software

    Computer Graphics Research Software Helping you avoid re-inventing the wheel since 2009! Last update ...

  2. 水题 HDOJ 4716 A Computer Graphics Problem

    题目传送门 /* 水题:看见x是十的倍数就简单了 */ #include <cstdio> #include <iostream> #include <algorithm ...

  3. Mathematics for Computer Graphics数学在计算机图形学中的应用 [转]

    最近严重感觉到数学知识的不足! http://bbs.gameres.com/showthread.asp?threadid=10509 [译]Mathematics for Computer Gra ...

  4. Computer Graphics Thinking–texture tiling

    Here is one question: how to tile texture? One thing worth to notice: The DirectX and OpenGL stipula ...

  5. HDU 4716 A Computer Graphics Problem

    A Computer Graphics Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  6. Mathematics for Computer Graphics

    Mathematics for Computer Graphics 最近严重感觉到数学知识的不足! http://bbs.gameres.com/showthread.asp?threadid=105 ...

  7. Vector Math for 3D Computer Graphics (Bradley Kjell 著)

    https://chortle.ccsu.edu/VectorLessons/index.html Chapter0 Points and Lines (已看) Chapter1 Vectors, P ...

  8. Fundamentals of Computer Graphics 中文版(第二版) (Peter Shirley 著)

    1 引言 2 数学知识 3 光栅算法 4 信号处理 5 线性代数 6 矩阵变换 7 观察 8 隐藏面消除 9 表面明暗处理 10 光线追踪 11 纹理映射 12 完整的图形流水线 13 图形学的数据结 ...

  9. HDU 4716 A Computer Graphics Problem (水题)

    A Computer Graphics Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

随机推荐

  1. 贝叶斯优化(Bayesian Optimization)只需要看这一篇就够了,算法到python实现

    贝叶斯优化 (BayesianOptimization) 1 问题提出 神经网咯是有许多超参数决定的,例如网络深度,学习率,正则等等.如何寻找最好的超参数组合,是一个老人靠经验,新人靠运气的任务. 穷 ...

  2. Vue路由的hash模式与history模式的区别?

    1.首先router有两种模式:hash模式(默认).history模式(需配置mode: 'history') hash和history的区别?   hash                    ...

  3. 在DAO的查询操作里,数据库查询到记录,sql语句也成功执行,但是返回的对象是null

     在这里  如果改成User user=null; 后面 对user对象的赋值是会失败的. 原因: 要赋值的话,一定要有对象,要new一下给对象分配空间然后再给对象赋值.

  4. JavaScript的基础语法及DOM元素和事件

    一,JavaScript是什么? 1,JavaScript简称:js,是一种浏览器解释型语言,嵌套在HTML文件中交给浏览器解释执行.主要用来实现网页的动态效果,用户交互及前后端的数据传输等. 2,J ...

  5. MyBatis——Mapped Statements collection does not contain value for XXX

    报错信息: Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql. ...

  6. ORCLE 列转行

    字符串转多列 实际上就是拆分字符串的问题,可以使用 substr.instr.regexp_substr函数方式 字符串转多行 使用union all函数等方式 wm_concat函数 wm_conc ...

  7. KVM的常用操作

    KVM安装 一.网卡桥接 1.在原网卡上注释掉IP配置,添加一下内容 BRIDGE=br0 2.配置桥接网卡地址 vim ifcfg-br0 DEVICE="br0" NM_CON ...

  8. [Android-NDK编译] ndk 编译 c++ 兼容性问题汇总整理

    1.__int64找不到符号 采用int64_t来代替: #if defined(__ANDROID__) typedef int64_t __int64; #endif 2.<sys/io.h ...

  9. [SD心灵鸡汤]003.每月一则 - 2015.07

    乔布斯去世了,但他留给世人的财富却很多,值得每个人学习.他是个精力充沛魅力无限的家伙,同时也是一个很会鼓动人心的激励大师,甚至在他的平常对话中,经典的语句也常常脱口而出. 这里摘取了一些他的经典语录, ...

  10. idea创建maven项目慢的原因以及解决方案

    问题分析;在idea中maven项目所依赖的jar包,默认是从中央仓库直接下载jar包,不管jar包是否在本地仓库存在,所以导致idea创建maven项目速度慢,那么要解决这个问题,那么将idea设置 ...