计算机图形学(三) -- 3D 变换

news2025/1/21 4:57:43

文章目录

  • 3D 变换
    • 缩放(Scale)
    • 平移(Translation)
    • 旋转(Rotation)
    • 3D 旋转(3D Rotation)
  • 什么是欧拉角
      • 罗德里格斯旋转公式(Rodrigues' Rotation Formula)
  • Viewing transformation
    • 什么是 View / Camera Transformation
      • 相机标准位置(约定俗成)
      • 怎样将一个相机从一个任意的摆放,放到一个标准位置![在这里插入图片描述](https://img-blog.csdnimg.cn/c2c486750b964b9fb51db909a70374be.png)
      • 使用数学方式表示相机到标准位置的变换
    • 投影变换(Projection Transformation)
      • 正交投影和透视投影的区别
      • 正交投影
        • 正交投影的变换矩阵
    • 透视投影(Perspective Projection)
      • 怎样实现透视投影
      • 计算透视投影的变换矩阵

3D 变换

同样引入齐次坐标:

  • 3D 点 = ( x , y , z , 1 ) T (x, y, z, 1)^T (x,y,z,1)T
  • 3D 向量 = ( x , y , z , 0 ) T (x, y, z, 0)^T (x,y,z,0)T
    通常, ( x , y , z , w ) (x, y, z, w) (x,y,z,w)(w != 0) 表示一个坐标为 ( x / w , y / w , z / w ) (x/w, y/w, z/w) (x/w,y/w,z/w) 的 3D 点

用一个 4x4 的矩阵来表示 3D 的仿射变换
( x ′ y ′ z ′ 1 ) \begin{pmatrix}x'\\y'\\z'\\1\end{pmatrix} xyz1 = ( a b c t x d e f t y g h i t z 0 0 0 1 ) \begin{pmatrix}a&b&c&t_x\\d&e&f&t_y\\g&h&i&t_z\\0&0&0&1\end{pmatrix} adg0beh0cfi0txtytz1. ( x y z 1 ) \begin{pmatrix}x\\y\\z\\1\end{pmatrix} xyz1

2D/3D 变换中,是先做旋转(线性变换)再做平移

缩放(Scale)

S ( s x , s y , s z ) S(s_x, s_y, s_z) S(sx,sy,sz) = ( s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 ) \begin{pmatrix}s_x&0&0&0\\0&s_y&0&0\\0&0&s_z&0\\0&0&0&1\end{pmatrix} sx0000sy0000sz00001

平移(Translation)

T ( t x , t y , t z ) T(t_x, t_y, t_z) T(tx,ty,tz) = ( 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ) \begin{pmatrix}1&0&0&t_x\\0&1&0&t_y\\0&0&1&t_z\\0&0&0&1\end{pmatrix} 100001000010txtytz1

旋转(Rotation)

绕 x, y, z 三个轴分别做旋转的情况:
在这里插入图片描述

  • 绕 X 轴旋转
    R x ( α ) R_x(\alpha) Rx(α) = ( 1 0 0 0 0 c o s α − s i n α 0 0 s i n α c o s α 0 0 0 0 1 ) \begin{pmatrix}1&0&0&0\\0&cos\alpha&-sin\alpha&0\\0&sin\alpha&cos\alpha&0\\0&0&0&1\end{pmatrix} 10000cosαsinα00sinαcosα00001
  • 绕 Y 轴旋转
    R y ( α ) R_y(\alpha) Ry(α) = ( c o s α 0 s i n α 0 0 1 0 0 − s i n α 0 c o s α 0 0 0 0 1 ) \begin{pmatrix}cos\alpha&0&sin\alpha&0\\0&1&0&0\\-sin\alpha&0&cos\alpha&0\\0&0&0&1\end{pmatrix} cosα0sinα00100sinα0cosα00001
  • 绕 Z 轴旋转
    R z ( α ) R_z(\alpha) Rz(α) = ( c o s α − s i n α 0 0 s i n α c o s α 0 0 0 0 1 0 0 0 0 1 ) \begin{pmatrix}cos\alpha&-sin\alpha&0&0\\sin\alpha&cos\alpha&0&0\\0&0&1&0\\0&0&0&1\end{pmatrix} cosαsinα00sinαcosα0000100001

提示: R_y 中 − s i n α -sin\alpha sinα 而 R_x 和 R_z 中是 s i n α sin\alpha sinα 的原因是, Y 轴是由 Z 叉乘 X 得到的,而不是 X 叉乘 Z(右手定则).

3D 旋转(3D Rotation)

任意的 3D 旋转都可以表示为绕 X Y Z 轴旋转的组合,公式如下
R x y z ( α , β , γ ) R_{xyz}(\alpha,\beta,\gamma) Rxyz(α,β,γ) = R x ( α ) R y ( β ) R z ( γ ) R_x(\alpha)R_y(\beta)R_z(\gamma) Rx(α)Ry(β)Rz(γ)

什么是欧拉角

其中, α , β , γ \alpha, \beta, \gamma α,β,γ 分别代表绕 X Y Z 三个轴旋转的角度,叫做欧拉角 (pitch, yaw, roll)
pitch 是围绕 X 轴旋转,也叫做俯仰角
yaw 是围绕 Y 轴旋转,也叫偏航角
roll 是围绕 Z 轴旋转,也叫翻滚角

罗德里格斯旋转公式(Rodrigues’ Rotation Formula)

在这里插入图片描述

Viewing transformation

这里的 Viewing transformation 包括 View(视图)/Camera 变换和 Projection(投影) 变换

投影变换包括: 正交(Orthographic)投影和透视(Perspective)投影

什么是 View / Camera Transformation

思考怎么拍一张照片?

  1. 找到一个合适的地方并且排列好拍照的人 (模型变换 Model Transformation)
  2. 找到一个合适的拍照角度放置相机 (视图变换 View Transformation)
  3. 拍照 (投影变换 Projection Transformation)
    简称 MVP

怎么进行视图变换(View/Camera Transformation)?
首先定义相机的姿态(位置 e ⃗ \vec{e} e ,看的方向 g ^ \hat{g} g^,向上方向(up direction, t ^ \hat{t} t^))
在这里插入图片描述

相机标准位置(约定俗成)

相机的位置为原点(0, 0, 0), Y 轴向上,看向 -Z,物体随着相机变换
在这里插入图片描述
View Transformation 操作的是相机,其他物体跟着进行同样的变换

怎样将一个相机从一个任意的摆放,放到一个标准位置在这里插入图片描述

  • e ⃗ \vec{e} e 平移到原点
  • g ^ \hat{g} g^ 旋转到 -Z
  • t ^ \hat{t} t^ 旋转到 Y
  • 旋转 ( g x t ) (g x t) (gxt) 到 X (注解: g 叉乘 t 得到 t ⃗ g ⃗ \vec{t} \vec{g} t g 坐标系的另一个轴)与 X 对应

使用数学方式表示相机到标准位置的变换

在这里插入图片描述
第一步,先做 e ⃗ \vec{e} e 到原点的平移, T v i e w T_{view} Tview 如图
第二部,因为计算从 g 到 -Z, t 到 Y, (g x t) 到 X 的旋转矩阵 R v i e w R_{view} Rview 比较困难,则先考虑 X 到 (g x t), Y 到 t, Z 到 -g,然后在求逆, 因为旋转矩阵就是一个正交矩阵,对求得旋转矩阵做一个转置,则可得到 g 到 -Z, t 到 Y, (g x t) 到 X 的旋转矩阵 R v i e w R_{view} Rview

相机按照此变换矩阵进行变换之后,相机内的物体都需按照此矩阵进行同样的变换。

View/Camera Transformation 是为了 Projection Transformation 做准备

投影变换(Projection Transformation)

前面说到投影变换分为正交投影(Orthographic Projection) 和透视投影(Perspective Projection)
在这里插入图片描述

正交投影和透视投影的区别

正交投影, 不会给人带来近大远小的视觉(错觉),通常用在工程制图方面。
透视投影, 会给人带来近大远小的视觉(错觉)
在这里插入图片描述

正交投影

正交投影简单的理解/做法:

  1. 将相机放置在原点,看向 -Z,Y 是向上方向
  2. 那么如果直接将 Z 坐标直接扔掉,就可很方便的得到一个(x, y)二维平面的图形。
  3. 之后在将其平移和缩放到一个 [-1, 1] 的矩形内。
    在这里插入图片描述
    通常的做法:
    将一个立方体的 [左(left), 右(right)] x [下(bottom), 上(top)] x [远(fast), 近(near)] 映射到一个 canonical 的立方体上 [ − 1 , 1 ] 3 [-1, 1]^3 [1,1]3
    在这里插入图片描述
    通常的做法与简单的做法的区别:
  • 通过平移将立方体居中
  • 通过缩放将立方体变为 “canonical” 立方体

此种情况下,对于 X 和 Y 都是 l, b 在 X, Y 轴的负半轴,r 和 t 在 X, Y 轴的正半轴, 则都是 r > l, t > b。而 f 在 Z 的负半轴(Camera 看向 -Z),n 在 Z 的正半轴,所以当立方体距离相机近的 n 的值是大于距离相机远的 f(正常应该是距离越远,值越大)。这也是 OpenGL 为什么使用左手系的原因.

正交投影的变换矩阵

在这里插入图片描述
2 r − l \frac{2}{r-l} rl2 是将立方体的长度缩放到 [-1, 1] 的范围内,对于它的 Y 和 X 是同样的操作。
− r + l 2 -\frac{r+l}{2} 2r+l 是 X 轴的平移,对于它的 Y 和 X 是同样的操作

透视投影(Perspective Projection)

回顾一下齐次坐标的概念:
( x , y , z ) , ( k x , k y , k z , k ! = 0 ) , ( x z , y z , z 2 , z ! = 0 ) (x, y, z), (kx, ky, kz, k != 0), (xz, yz, z^2, z != 0) (x,y,z),(kx,ky,kz,k!=0),(xz,yz,z2,z!=0) 都表示在 3D 空间中的同一个点 ( x , y , z ) (x, y, z) (x,y,z)
例如, ( 1 , 0 , 0 , 1 ) (1, 0, 0, 1) (1,0,0,1) ( 2 , 0 , 0 , 2 ) (2, 0, 0, 2) (2,0,0,2) 都表示 ( 1 , 0 , 0 ) (1, 0, 0) (1,0,0)

怎样实现透视投影

  • 先将 Frustum 挤压称为一个长方体(n -> n, f -> f)( M p e r s p − > o r t h o M_{persp->ortho} Mpersp>ortho)
  • 然后做正交投影
    在这里插入图片描述

计算透视投影的变换矩阵

在这里插入图片描述
y ′ y' y 类似的 x ′ = n z x x' = \frac{n}{z}x x=znx
那么在齐次坐标系中就有:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/40800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

clickhouse单节点以及集群的安装

安装 因为clickHouse很消耗cpu资源,所以需要修改:用户可打开的文件数量和最大进程数: vim /etc/security/limits.conf * soft nofile 65536 * hard nofile 65536 * soft nproc 131072 * hard nproc 131072//第一列代表用户用户组&#x…

[LeetCode周赛复盘] 第 92 场双周赛20221015

[LeetCode周赛复盘] 第 92 场双周赛20221015 一、本周周赛总结二、 [Easy] 6249. 分割圆的最少切割次数1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6277. 行和列中一和零的差值1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6250. 商店的最少代价1. 题目描述2. 思路分析…

org.springframework.test.util.ReflectionTestUtils.invokeMethod方法的使用

序言 为什么要用spring框架的ReflectionTestUtils工具类的invokeMethod方法? 当我们想要调用一个实例对象的私有方法时,我们可以利用反射机制去调用该私有方法。 Demo 含有私有方法的类, public final class DemoClass {private static …

Spring - BeanFactoryPostProcessor 扩展接口

文章目录Preorg.springframework.beans.factory.config.BeanFactoryPostProcessor源码探究1 是否实现BeanDefinitionRegistryPostProcessor 接口,分别写入集合2 处理实现了的PriorityOrdered和 BeanDefinitionRegistryPostProcessors 的 bean3. 处理实现了的Ordered…

Linux基础

一、Linux发展历程 1.1、Linux前身-Unix 1968年Multics 项目 MIT|、Bell 实验室、美国通用电气有限公司走到了一起,致力于开发Multics项目。到后期由于开发进度不是很好,MIT 和Bell实验室相继离开这个项目的开发,最终导致项目搁浅。 1970年 …

接口测试用例设计方法方式和流程一文到底

目录 1、通用信息校验 1、URL校验 2、请求方法校验 3、请求头 4、接口鉴权 2、接口参数校验 1、参数的必填项校验 2、参数的选填项校验 3、参数长度校验 4、参数数据类型校验 5、参数的有效性校验 6、参数的唯一性校验 7、参数关联项校验 3、其他补充项 1、幂等…

Kafka必问面试题

一、说说你对kafka的理解 kafka本身是一个流式处理平台,同时也具有消息系统得能力,在我们得系统中更多得是把kafka作为一个消息队列系统来使用 而如果来介绍kafka,大致可以分为这几块: kafka集群元数据得管理,集群得…

【云原生 | Kubernetes 实战】04、k8s 名称空间和资源配额

目录 一、什么是命名空间? 二、namespace 应用场景 三、namespacs 使用案例 四、namespace 资源限额 一、什么是命名空间? Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间。 命名空间namespace…

《基础IO》

【一】C文件接口 我们使用C语言向文件写入东西的时候,基本上的套路都是先打开文件,然后调用C的文件接口,向文件中输入相应的数据,然后关闭文件。 a.size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream …

AlibabaP9整理出微服务笔记:Spring微服务不止架构和设计

微服务是一种架构风格,也是一种针对现代业务需求的软件开发方法。微服务并非发明出来的,确切地说是从之前的架构风格演进而来的。 但是深入介绍Spring Boot、Spring Cloud、Docker、 Mesos和Marathon掌握响应式微服务设计原则,轻松构建大规模…

每天五分钟机器学习:常用的聚类算法——k均值的运行原理和实现

本文重点 K-均值是聚类算法之一,该算法接受一个没有标签的数据集,然后将数据聚类成不同的簇。 k-均值运行原理 K-均值是一个迭代算法,假设我们想要将数据聚类成k个组,其方法为: 1.首先选择 k 个随机的点(样本点),称为聚类中心。 2.遍历数据集中的每一个数据,计算距离…

single sign on 与 cas

single sign on 与 cas cookie与session与token、普通登录、单点登录、三种常见实现方式、cas-server、cas-client 注:oauth2 是保护服务端资源,即受 oauth2 保护的资源能不能被客户端访问;cas 是保护用户信息,即该用户有没有权…

第五届传智杯【初赛】- F-二人的大富翁游戏

F-二人的大富翁游戏 题目预览 题目背景(推荐阅读 题目预览) 如果遇到提交失败,请多次刷新,多次提交,会有成功几率 作为大学生,莲子和梅莉有着比高中时更为闲暇的课余时光。在没有课的时候,她们喜欢玩大富翁这一游戏…

08.OpenWrt-连接wifi网络

08.OpenWrt-连接wifi网络 8.1 连接其他wifi热点上网 rootOpenWrt:/# cat /etc/config/wireless config wifi-device ‘radio0’ option type ‘mac80211’ option path ‘platform/10300000.wmac’ option channel ‘1’ option band ‘2g’ option htmode ‘HT20’ option …

NFIQ怎么使用?NFIQ2.0软件怎么操作来进行图片质量得分计算?NFIQ2.0支持什么图片格式

一、背景 前段时间准备写个指纹图像生成论文,结果需要用NFQI进行分析,参考的论文中都是结果,还是折线图,看着好厉害,但论文中没有说明具体咋出来的值。网上找了半天相关的,一个有用的信息都没有,好不容易找…

一文带你学透Java Servlet(建议收藏)

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:前端开发者…

【滤波跟踪】扩展卡尔曼滤波的无人机路径跟踪【含Matlab源码 2236期】

⛄一、EKF算法简介 扩展卡尔曼滤波是利用泰勒级数展开方法将非线性滤波问题转化成近似的线性滤波问题,利用线性滤波的理论求解非线性滤波问题的次优滤波算法。其系统的状态方程和量测方程分别如式(1)、式(2)所示: 式中,X(k)为n维的随机状态向量序列,Z(k)为n维的随机量测向量序…

【图像处理】基于图像聚类的无监督图像排序问题(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

推荐算法高级案例-通过WideDeep算法进行特征组合的商品推荐详细教程 代码+数据

案例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。 方法概述:…

R语言与RStudio的下载与安装方法

本文介绍R语言及其集成开发环境RStudio的下载、安装方法。 R语言是一个属于GNU操作系统的开源软件,在数据统计与分析、可视化等方面具有优秀的表现;而RStudio则是R语言的集成开发环境(IDE),可以帮助我们更好地编辑、调…