图形几何之美系列:仿射变换矩阵之先转后偏

news/2024/11/16 19:48:18/

在几何计算、图形渲染、动画、游戏开发等领域,常需要进行元素的平移、旋转、缩放等操作,一种广泛应用且简便的方法是使用仿射变换进行处理。相关的概念还有欧拉角、四元数等,四元数在图形学中主要用于解决旋转问题,特别是在三维空间中绕任意轴的旋转,且四元数与仿射变换可以相互转换。

  1. 图形几何之美系列:三维实体结构表达

  2. 图形几何之美系列:仿射变换矩阵

  3. 图形几何之美系列:仿射变换矩阵(二)

    上文我们讲述了仿射变换矩阵的原理、构成以及局部坐标系到世界坐标系的转换。

    本文我们将继续聊聊矩阵的使用注意事项,比如先转后偏的用法,并从机制原理的角度探究其原因。

1.前言

    如果一次仿射变换中存在多种类型的姿态变换,需要先进行矩阵左上角的3X3部分(缩放、旋转、镜像、非均匀变换)的构造处理,最后再叠加偏移。

    这是我们从一些书籍或老司机口中得知的重要经验,大白话就是“先转后偏”,那么为什么要这样呢?先偏后转不行吗?还是先转后偏有其不可忽略的独门绝技?

如果先偏移,则需要基于偏移值的坐标点进行矩阵左上角3X3部分的构造,这将变得复杂的多,这对于大多数人来说不可接受,毕竟我们很多时候要做的是化繁为简,同时提高精度。

下面我们对比下先转后偏和先偏后转的特点和区别。

2.先转后偏

图片
图:先转后偏

    如上图所示,我们对点P进行仿射变换,同时包含旋转和平移,即绕点T旋转Θ,然后平移向量P'P''

如果是先旋转后偏移:(1)P绕T旋转θ;(2)移动P'P'';即可得到最终姿态P''。

补充
构造P绕T旋转θ的仿射变换矩阵时:

  1. 可以先构造偏移TO的偏移矩阵(这样T偏移到了原点,而P可以绕原点旋转了)TrsT2O;

  2. 然后构造P绕原点旋转θ的3X3矩阵,再叠加OT偏移得到TrsRotate_and_O2T;嘿嘿,这又是一个先转后偏的实践。

  3. 左乘上述两个矩阵得到结果矩阵TrsRotate_and_O2T x TrsT2O

3.先转后偏

    如果是先偏后转,问题将变得复杂,在偏移P的同时需要对T也作相同力度的偏移,没错,进行“先偏”操作时,你需要关心其他姿态变换元素,如“绕T旋转的元素T”;然后再绕T'点旋转θ。

图片
图:先偏后转

    记住,我们是要化繁为简,以清晰便捷的过程去处理问题,这会降低错误的发生,也降低了学习成本,提高学习工作体验。

谁不愿意开心的学习和工作呢?对,还有开心的生活~

补充
构造先偏后转的矩阵时:

  1. 先构造偏移**P'P''**的矩阵TrsP'2P'',同时作用于P和T,分别得到P'和T';

  2. 构造绕T'旋转θ的矩阵,好吧,这和上述第1步+第2步类似,执行吧......我们得到了TrsT'2O和TrsRotate_and_O2T';

  3. 左乘上述三个矩阵得到结果矩阵TrsRotate_and_O2T' x TrsT'2O x TrsP'2P''

思考
思考以上上述两种方案的特点和区别。为什么我们没有把TrsT'2O x TrsP'2P''进行合并呢?合并后将是1个偏移矩阵啊,那最后不也是两个矩阵相乘吗?

4.继续探究

    如果上面的内容你已经明白,那么我们来看一个类似的场景:P绕原点旋转θ,再偏移P'P''。

    这个场景更典型,实际上上述先转后偏的第2步就是这样一个场景,绕原点旋转θ,再叠加偏移,这比较简单的构造出了一个矩阵,也就是结果矩阵。而先偏再转将带来很多工作,得不偿失,或许该换个词表达。

提示
读者可以自行推导这个典型场景中先偏后转的矩阵构造和运算过程,加深理解。

    注意,如果同时有旋转、缩放、镜像、不均匀变换时(如透视投影)时,这几种姿态变换没有先后顺序的要求,你可以先转后缩,也可以先缩后转。想一想4x4矩阵的构造,这几种类型都是左上角3x3部分,该部分3列实际上是三个基向量。

欢迎关注,图形几何之美系列 将继续更新......

  1. 图形几何之美系列:三维实体结构表达

  2. 图形几何之美系列:仿射变换矩阵

  3. 图形几何之美系列:仿射变换矩阵(二)

  4. 图形几何之美系列:仿射变换矩阵先转后偏


http://www.ppmy.cn/news/1547525.html

相关文章

DB-GPT系列(四):DB-GPT六大基础应用场景part1

一、基础问答 进入DB-GPT后,再在线对话默认的基础功能就是对话功能。这里我们可以和使用通义千问、文心一言等在线大模型类似的方法, 来和DB-GPT进行对话。 但是值得注意的是,DB-GPT的输出结果是在内置提示词基础之上进行的回答&#xff0c…

Java项目实战II基于微信小程序的实习记录(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在高等教育…

spark.default.parallelism 在什么时候起作用,与spark.sql.shuffle.partitions有什么异同点?

spark.default.parallelism 和 spark.sql.shuffle.partitions 是 Spark 中两个控制并行度的配置参数,但它们作用的场景和用途不同: spark.default.parallelism 用途:spark.default.parallelism 用于控制 RDD 中的默认分区数。适用场景&…

音视频入门基础:MPEG2-TS专题(4)——使用工具分析MPEG2-TS传输流

一、引言 有很多工具可以分析MPEG2-TS文件/流,比如Elecard Stream Analyzer、PROMAX TS Analyser、easyice等。下面一一对它们进行简介(个人感觉easyice功能更强大一点)。 二、Elecard Stream Analyzer 使用Elecard Stream Analyzer工具可以…

【mysql】使用宝塔面板在云服务器上安装MySQL数据库并实现远程连接

前言 使用宝塔Linux面板安装MySQL数据库并实现远程连接 使用宝塔面板安装mysql 宝塔面板,华为云开放3306端口 一些命令 // 命令行连接数据库 mysql -uroot -p // MySQL 5 版本 GRANT ALL ON *.* TO root% IDENTIFIED BY 替换成你的root密码 WITH GRANT OPTION; // …

C++ 数据结构详解

目录 C 数据结构详解 引言 1. 数组 (Array) 示例代码 2. 向量 (Vector) 示例代码 3. 链表 (List) 示例代码 4. 栈 (Stack) 示例代码 5. 队列 (Queue) 示例代码 6. 集合 (Set) 示例代码 7. 映射 (Map) 示例代码 C 数据结构详解 引言 数据结构是计算机科学中的…

集合的介绍与比较器的应用

1.集合: 是一种容器,一种变量类型,跟数组很像 数组的缺点: A.数组的空间长度固定,一旦确定不可以更改。多了浪费,少了报错。 B.使用数组 操作数据的时候,【删除,增加】效率比较低。…

RTSP播放器EasyPlayer.js播放器UniApp或者内嵌其他App里面webview需要截图下载

EasyPlayer.js H5播放器,是一款能够同时支持HTTP、HTTP-FLV、HLS(m3u8)、WS、WEBRTC、FMP4视频直播与视频点播等多种协议,支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式,支持MSE、WASM、WebCodec等多种解码方…