3D图形学中的矩阵变换(二)

3D图形学中的矩阵变换(二)

文章同时发布于王鹏飞的个人网站
在之前的一篇文章中,我介绍了平移、旋转和缩放矩阵的证明,简单的讲解了如何证明绕任意轴旋转的旋转矩阵的证明思路。没有看过的朋友可以在这里看到。

这篇文章主要讲解下我理解的矩阵和矩阵的基变换,并简单介绍下LookAt矩阵。

一. 摄像机

这里涉及到三维图形学中的摄像机的概念。大家肯定都玩过游戏,现在游戏发展速度都特别快,很多游戏世界都是3D的,例如国外的荒野大镖客、巫师以及国内最近比较火的原神。游戏世界中所有的物体,例如桌子、树木、动物以及交通工具等等,它们在游戏世界中都有一个特定的位置,这个位置就是它们在游戏世界中的坐标,我们把它们在游戏世界中的位置称为世界坐标。假如同时有两个玩家A和B在游戏世界中漫游,那么这两个玩家的屏幕肯定显示的是不一样的,因为玩家在世界坐标系中的位置(世界坐标)不一样,并且视线的方向也不同,所以他们看到的屏幕肯定是不一样的。这里的A和B玩家,其实就是摄像机。假设我们以摄像机(玩家)为原点创建一个新的坐标系,可以称它为摄像机坐标系(观察空间坐标系)。那么同样的物体在世界坐标系中坐标为(300,200),那么它用摄像机坐标系如何表示呢?我用二维图形描述下这个问题。

image-20210526223206977

假设平面中有一点A,此时点A的坐标为(1, 1),表示A点在如图所示的坐标系中在原点右侧1个单位,上方1个单位。如果将这个坐标系旋转45度,变成另一个坐标系X2Y2,那么在新的坐标系X2Y2中如何表示A点呢?

image-20210526224510669

旋转45度,很容易计算出来A点在X2Y2坐标系中的坐标为(√2, 0)。那么有没有一个矩阵A可以使得A·P1 = P2,也就是经过矩阵A的变换,P1坐标变成了P2。这里P1表示在原来的坐标系中的坐标,P2表示在新的坐标系中同一个点的坐标表示。其实这里的A就是本篇文章要讨论的lookAt矩阵。

LookAt矩阵的作用就是,将世界坐标系中的物体坐标转换为用摄像机坐标系统描述,说白了就是在不同坐标系中描述同一个位置。

下面是learnopengl_cn官网给出的解释:

当我们讨论摄像机/观察空间(Camera/View Space)的时候,是在讨论以摄像机的视角作为场景原点时场景中所有的顶点坐标:观察矩阵把所有的世界坐标变换为相对于摄像机位置与方向的观察坐标。

二. 深入线性变换矩阵

首先我给大家讲述一个很重要的事实,在我上篇文章中说的几个变换矩阵,线性变换矩阵的每一列表示的都是变换后的坐标系的x、y、z轴的单位向量的表示,即i帽、j帽和k帽。请牢牢记住这一重要特性,因为这一个特性真的很重要,它会直接影响你的线性代数的思维。你可能现在还没有认识到这一特征,没关系,请继续阅读。

image-20210529095906096

还是以之前的A点的例子为例,来说明这一思想。A点坐标是(1, 1), 向量OA也是(1, 1),用i帽j帽表示的话OA = 1 * i + 1 * j

image-20210529100455563

此时,我们将坐标系旋转45度,变成下图所示。这里我顺便小小的提一下,线性变换就是保证我画的网格线平行且等距分布,这也是为什么我会画一些网格在图中,上一篇文章讲解的几个变换矩阵都是线性变换。

image-20210529101044826

正是因为是线性变换,所以变换后的A点满足如下公式:OA = 1 * i2 + 1 * j2。因为旋转45度,所以我们计算出i2j2分别为(√2 / 2, √2 / 2)和(-√2 / 2, √2 / 2)。所以OA = (0, √2 )。

image-20210529102434851

请仔细阅读我上图中的计算步骤,请保证你能看懂整个计算过程。

上图中我写了一个变换矩 阵,这个变换矩阵其实就是我们旋转45度的旋转矩阵。细心的朋友已经发现了,矩阵的第一列就是变换后的i帽,第二列就是变换后的j帽。所以还记得我之前说的那个真理吗?

线性变换矩阵的每一列表示的都是变换后的坐标系的x、y、z轴的单位向量的表示

三.逆矩阵

还是用之前的例子,我们将变换前的坐标系称为xyo, 变换后的坐标系称为x2y2o。xyo-> x2y2o的变换矩阵如下(后面我将其称为MatA),每一列表示的是x2y2o坐标系的x和y方向的单位向量在xyo坐标系中的表示。所以将这个矩阵乘以一个坐标,其实得到的是一个在xyo坐标系中表示的坐标。

image-20210529105350442

例如,例如点A(1, 1),计算MatA · A = B,得到的点B是经过线性变换后A的坐标,但是这个坐标还是用xyo坐标系表示的, 点A的坐标却是在x2y2o坐标系中的表示。所以这里MatA的作用就是将x2y2o坐标系的表示转化为xyo坐标系表示。那么反过来呢,xyo -> x2y2o如何转换?

这里引入逆矩阵的思想,逆矩阵表示相反的线性变换, 由MatA · A = B得到 A =(MatA^-1) · BMatA^-1 表示的是MatA的逆矩阵。所以有MatA · A = BA =(MatA^-1) · B这两个公式,就可以得到同一点在xyo和x2y2o中的表示方法。

这不正是lookAt矩阵的作用吗?lookAt矩阵就是在不同坐标系下如何表示同一点。

四.lookAt矩阵

其实这部分类容已经不重要了,因为通过上面的学习,你已经知道如何去转换坐标系了。但是我还是简单的介绍下learnOpengl_cn官网的lookAt矩阵吧。

LookAt矩阵如下, (Rx, Ry, Rz)表示摄像机的X轴方向向量,(Ux, Uy, Uz)表示摄像机坐标系的Y轴方向,(Dx, Dy, Dz)表示摄像机的视线方向及Z轴。 (Px, Py, Pz)表示摄像机位置的世界坐标。

image-20210526213813353

通过上面的阅读,现在看这个矩阵,你能否自己给出证明呢?

矩阵的第二部分,是一个平移矩阵,目的是平移到(px, py, pz),矩阵中px,py,pz都加上了负号,是因为这里移动的不是摄像机而是整个场景,将场景向相反方向移动等价于移动摄像机。矩阵的第一部分就是一个线性变换的逆矩阵。计算逆矩阵通常需要计算非逆矩阵,那么非逆矩阵是什么呢?我在第二节内容说到,线性变换矩阵的每一列表示的都是变换后的坐标系的x、y、z轴的单位向量的表示。所以由 (Rx, Ry, Rz), (Ux, Uy, Uz), (Dx, Dy, Dz), 我们很容易写出线性变换矩阵。

image-20210529111854626

这个线性变换矩阵我用Mat1表示,平移矩阵用Mat2表示,所以lookAt矩阵如下:

LookAt = (Mat1^-1) · Mat2

逆矩阵的计算并不重要,写代码时,一般可以直接用函数去求解逆矩阵,重要的是你要理解我在本篇文章介绍的思想。本篇文章可能不是很好理解,我已经把我理解的尽可能详细的去描述讲解出来了,你可以多读几遍,带入思考去阅读。

(完)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本人资源全部免费,更多资源请查看我的上传资源 ====================================================== 书 名:3D数学基础:图形与游戏开发 作 者:[美] 邓恩(Dunn F.),[美] 帕贝利(Parberry I.) 著;史银雪,陈洪,王荣静 译 出 版 社: 清华大学出版社 出版时间:2005-07-01 ISBN:9787302109464 纸书页数:380页 定 价:¥ 42.00 内容简介:《3D数学基础:图形与游戏开发》专业培训机构指定教学参考书,多家游戏开发企业共同推荐,游戏业界,探索游戏开发背后的核心秘密。《3D数学基础:图形与游戏开发》主要介绍了基本的3D数学概念,这对电脑游戏开发人员和编程人员来说尤为重要。作者详尽地讨论了数学理论,并在必要时提供几何说明,帮助读者形成直观的3D感。书还提供了将理论应用于实践的C++类,并且在每章结尾处提供练习。《3D数学基础:图形与游戏开发》介绍了基础概念,如向量、坐标空间、矩阵变换、欧拉角、齐次坐标空间、几何图元、相交性检测和三角网格。 作者简介:Fletcher Dunn,是著名游戏开发公司Terminal Reality的主要开发人员,所参与开发的游戏包括《4×4DVO 2)、《夜曲》(Noturne),并且是《吸血莱恩》(BloodRayne)的主要负责人。他所开发的游戏遍及家用PC机的Windows、Machintosh、Dreamcast、PSⅡ、Xbox和GameCube几种主流平台。   Ian Parberry,是北德克萨斯大学计算机科学系的教授,在国际上被公认为是教授DirectX游戏开发的专家之一。 编辑推荐:《3D数学基础:图形与游戏开发》主要研究隐藏在3D几何世界背后的数学问题。涵盖了理论知识和C++实现代码。理论部分解释3D数学和几何之间的关系,列出的技巧与公式可以当做参考手册以方便查找。实现部分演示了怎样用代码来实现这些理论概念。读者论论了3D的方位,包括四元数和对不同表示技术之间的优劣比较。   描述了数学和几何的实际应用示例,提供了一些C++类和不同的矩阵类,每个类都完成特定的几何任务。   所有基本变换矩阵的完整来历。      专门用Python讲解计算机视觉编程 目录 第1章 简介 1.1 什么是3D数学 1.2 为什么选择本书 1.3 阅读本书需要的基础知识 1.4 概览 第2章 笛卡尔坐标系统 2.1 1D数学 2.2 2D笛卡尔数学 2.3 从2D到3D 2.4 练习 第3章 多坐标系 3.1 为什么要使用多坐标系 3.2 一些有用的坐标系 3.3 嵌套式坐标系 3.4 描述坐标系 3.5 坐标系转换 3.6 练习 第4章 向量 4.1 向量——数学定义 4.2 向量——几何定义 4.3 向量与点 4.4 练习 第5章 向量运算 5.1 线性代数与几何 5.2 符号约定 5.3 零向量 5.4 负向量 5.5 向量大小(长或模) 5.6 标量与向量的乘法 5.7 标准化向量 5.8 向量的加法和减法 5.9 距离公式 5.10 向量点乘 5.11 向量叉乘 5.12 线性代数公式 5.13 练习 第6章 3D向量类 …… 第7章 矩阵 第8章 矩阵和线性变换 第9章 矩阵的更多知识 第10章 3D的方位与角位移 第11章 C++实现 第12章 几何图元 第13章 几何检测 第14章 三角网络 第15章 图形数学 第16章 可见性检测 第17章 后记 附录A 简单的数学概念 附录B 参考文献

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值