计算机图形学-GAMES101-4

news2024/11/25 0:57:49

一、变换矩阵中的旋转部分

  • 当我们旋转Q角度和旋转-Q角度时,变换矩阵中旋转的部分如下图所示:
    在这里插入图片描述

  • 旋转Q和旋转-Q的变换矩阵应该互为逆矩阵,而我们可以看到它们互为对方矩阵的转置。其实Rq是一个正交矩阵,因此其逆矩阵就是它自己的转置。当我们旋转图形一个角度为Q时,如果我们想旋转为-Q,可以直接将其变换矩阵中旋转的部分做转置。

  • 3D空间中的变换:
    在这里插入图片描述

  • 3D空间中绕不同轴旋转的变换矩阵(y的sin是反的是因为z叉乘x才能得到y,而不是x叉乘z):
    在这里插入图片描述

二、3D空间中的旋转

  • 欧拉角:
    在这里插入图片描述在这里插入图片描述

  • 在3D空间中绕任意一条过原点的轴n旋转:
    在这里插入图片描述

  • 如果轴不过原点,那么我们就将它平移到原点上,再进行旋转,然后旋转完再平移回去。

  • A旋转对应的旋转矩阵为MA,B旋转对应的旋转矩阵为MB,(MA+BM)/ 2 旋转矩阵对应的旋转可不是 (A+B) / 2,因此欧拉角使用欧拉角有很多不方便的地方,诸如不能还原角度、万向节死锁。建议使用四元数表示旋转。

三、Veiwing transformation

 我们变换的最终目的是把三维空间中的物体,变成一张二维的照片。我们需要做的变换为如下MVP变换:

  • 模型变换:把物体摆好,把场景搭建好。
  • 视图变换:把相机摆好,把相机的位置和方向确定下来。
  • 投影变换:根据场景和相机,把三维空间投影到二维中。

(1)View / Camera transformation

 相机具有的属性有:

  • 位置POS、方向FRONT、向上方向UP(相机转动角度垂直于向上方向)。

 以上就是观测矩阵需要的定义。

  • 当相机和场景中的物体相对位置保持不变时,拍出来的照片内容相同。因此为什么我们不讲相机永远固定在一个位置呢?

  • 我们定义相机永远位于原点、朝向负Z方向、向上方向为Y轴。

  • 进行视图变换(将相机平移到原点,朝向-Z轴,向上为Y轴):
    在这里插入图片描述

  • 平移矩阵很简单:
    在这里插入图片描述

  • 怎么旋转呢?将摄像机的朝向g转向-Z,将摄像机的向上方向t转向Y,而g×t自然朝向X。可是g转向-Z不好写,有什么简单的呢?我们可以简单的写出X转向g×t 和 Y转向t,这样Z自然就转向-g了,这个矩阵为:
    在这里插入图片描述

  • 上图中矩阵乘以(1,0,0,0)即X轴会得到(Xgt,Ygt,Zgt)即g×t的方向,乘以(0,1,0,0)即Y轴会得到(Xt,Yt,Zt)即相机向上方向t,乘以(0,0,1,0)即Z轴会得到(X-g,Y-g,Z-g)则把Z轴转向摄像机方向的反向。因此上图矩阵可以把XYZ轴分别旋转到g×t、t、-g方向。

  • 现在我们需要的是把g×t、t、g方向分别旋转到XY -Z轴,那该怎么办呢?我们又知道变换矩阵中旋转部分是一个正交矩阵,只要转置就能得到逆矩阵,就能得到 “把XYZ轴分别旋转到g×t、t、-g方向” 的逆操作 “g×t、t、g方向分别旋转到XY -Z轴”。因此我们使用逆矩阵即可。
    在这里插入图片描述

  • 我们将物体和相机一起应用观察矩阵即可保证它们的相对位置不变,同时还把相机移到了一个规范通用简单的位置。

  • 模型矩阵:怎样拜访物体。视图矩阵:怎样把物体和相机摆放到标准位置。模型矩阵和视图矩阵都会应用到物体上。

(2)Projection transformation

 当我们把相机和场景都移动到标准位置,即相机位于原点朝向-Z轴时,我们如何得到相机看到的画面呢?想象现在有一个相机,我们知道它的位置(一个点)、朝向(一个向量),我们总不能只描绘出一个点吧?类比我们人类的眼睛,其实可以看到一定角度中的内容,而透视投影定义的就是如何将三维空间投影到一个二维平面上。
 透视投影会看到平行的线不再平行,比如你的眼睛。正交投影不会带来"近大远小"的效果。两种投影的示意图如下:
在这里插入图片描述
 从z方向看的好处是我们可以扔掉物体的z坐标(区分前后内容后面再讨论),只保留x和y。然后不管相机拍摄覆盖区域有多大,我们都把它们的x、y值移动到【-1,1】的区间中。

(2.1)Orthographic projection

 正交投影需要投影一个立方体区域,它假设摄像机距离场景无限远,因此摄像机镜头的边界是两束平行光。定义正交投影,就是定义这样一个立方体是什么样的,我们规定这个立方体有如下参数:
在这里插入图片描述
 要注意Z轴朝向的是屏幕以外,即Z值越小其位置离我们越远。不管立方体是怎么样的,我们只需要把它移动到原点然后再缩放到【-1,1】中。
在这里插入图片描述
 上述变换对应的变换矩阵如下:
在这里插入图片描述
 当我们把原本的一个立方体缩放到【-1,1】,会导致物体的拉伸,但是在所有的变换都做完,所有的物体都处在【-1,1】立方体内时,还会做一次拉伸叫做视口变换。(缩放是xyz都要缩放)
 正交投影的立方体块是我们自己定义的,想要投影哪一块就定义哪一块,设置对应的立方体块参数。

(2.2)Perspective projection

 使用最多的投影方式;近大远小;投影后平行线不再平行,如下图所示:
在这里插入图片描述

  • 透视投影会将平面投影到另一个平面上,导致平行线不再平行。
    在这里插入图片描述

  • 透视投影和正交投影的示意图
    在这里插入图片描述

  • 透视投影:先将Frustum四面体挤成一个Cuboid立方体,再进行正交投影。Frustum近平面永远不变,远平面的z值不变,Frustum中心点不变。我们现在要做的是求变换矩阵,从透视到正交的变换矩阵。
    在这里插入图片描述

  • 原本的Z值不管,对于Y,从侧面分析得到以下式子:
    在这里插入图片描述

  • 对X同理应用相似三角形,得到:
    在这里插入图片描述

  • 设变换矩阵为:
    在这里插入图片描述
    在这里插入图片描述

  • 根据近平面和远平面中心点不变推导得到参数为:

在这里插入图片描述

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

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

相关文章

chrome渲染引擎的工作主流程

一见如故 浏览器的渲染:HTML字符串>渲染成最终的像素1、CSS Parser发生在css预解析线程中,不在主线程中;会预览整个HTML文档,下载css相关全部内容,解析生成CSSOM树 2、attachment >以及生成布局树>分层>按…

微服务的使用场景和架构设计方案

目录 【单体架构】 【微服务解决哪些问题】 微服务的拆分原则 微服务使用过程中有哪些坑? 【RPC框架】 常见的网络 IO 模型 RPC 执行过程总结 【CAP原理】 如何使用 CAP 理论 【服务注册和发现】 【配置中心】 【Consul】 Consul介绍 Consul角色 Con…

Go语言的结构体、方法、指针

目录 【定义新数据类型】 【结构体】 定义结构体 结构体变量的声明和初始化 结构体的内存表示 【方法】 receiver 参数 receiver参数的约束 方法的深入理解 goroutine中方法的使用 receiver 参数类型如何选择?T还是*T? 方法集合 【指针】 …

9. 三星索引和Mysql内核查询成本计算实战

MySQL性能调优 1. 高性能的索引创建策略1.1 只为用于搜索、排序或分组的列创建索引1.2 合理设计多列索引1.3 尽可能设计三星索引1.4 主键尽量是很少改变的列1.5 处理冗余和重复索引1.6 删除未使用的索引1.7 InnoDB中的索引 2. 补充资料:磁盘和B树Mysql内核查询成本计…

从0到1无比流畅的React入门教程

无比流畅的React入门教程TOC React 是什么 简介 用于构建 Web 和原生交互界面的库React 用组件创建用户界面通俗来讲:是一个将数据渲染为HTML视图的开源JS库 其他信息 Facebook 开发,并且开源 为什么使用React? 原生JS使用DOM-API修改UI代码很繁…

使用Appium实现录制回放

1、cmd中转到abd所在位置: cd C:\Users\lenovo\AppData\Local\Android\Sdk\platform-tools 2、打开Appium运行 3、打开Appium Inspector (1)获取设备名称 在cmd中输入以下命令: adb devices (2)获取appP…

c++核心知识—多态

目录 一、多态 1、多态的基本概念 2、深入剖析多态原理: 3、纯虚函数和抽象类 4、虚析构和纯虚析构 一、多态 1、多态的基本概念 多态是C面向对象三大特性之一 多态分为两类: 1、静态多态: 函数重载 和 运算符重载 属于静态多态,复用…

前端八股文(二)

1.什么是diff算法? https://www.bilibili.com/video/BV1JR4y1R7Ln/?spm_id_from333.337.search-card.all.click&vd_source0406fa5cf8203ba41f1c8aec5f967e9d 我们修改了文本内容后会生成新的虚拟dom,新旧俩个虚拟dom之间是存在一定差异的,如果能快…

未来的航空电子设备会是什么样子?

具有多功能航空电子设备、大触摸屏显示器、先进通信系统、高性能/低功耗解决方案和人工智能 (AI) 功能的驾驶舱将成为未来军事飞行员日常生活的一部分。 如今,配备模拟驾驶舱的军用飞机已经很少见,因为大多数都已被采用先进嵌入式硬件和软件解决方案的现…

金融学学习笔记第2章

第2章 金融市场和金融机构 一、金融体系 金融体系包括金融市场、中介、服务公司和其它用于执行家庭、企业及政府的金融决策的机构 1.金融市场 金融市场:以金融资产为交易对象而形成的供求关系及其机制的总和 金融市场可分为有特定地理位置的市场和没有特定地点的市…

使用NodeJs创建Web服务器

Web服务器 什么是Web服务器? 当应用程序(客户端)需要某一个资源时,可以向一个台服务器,通过Http请求获取到这个资源;提供资源的这个服务器,就是一个Web服务器; 目前有很多开源的We…

用ChatGPT生成一个Python贪吃蛇游戏(42)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 和猫妹学Python,一起趣味学编程。 今日主题 什么是ChatGPT? ChatGPT可以帮我们做什么? 用ChatGPT生成一个Python贪吃蛇游戏。 什么是C…

Rust每日一练(Leetday0002) 中位数、回文子串、Z字形变换

目录 4. 寻找两个正序数组的中位数 Median of two sorted arrays 🌟🌟🌟 5. 最长回文子串 Longest Palindromic Substring 🌟🌟 6. Z字形变换 Zigzag Conversion 🌟🌟 🌟 每日…

C/C++每日一练(20230517) 排序问题、查找小值、寻找峰值

目录 1. 排序问题 🌟 2. 查找小值 🌟 3. 寻找峰值 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 排序问题 输入10个数&#…

RK3588平台开发系列讲解(进程篇)Linux文件系统数据结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、Linux 文件系统数据结构有哪些二、超级块结构 spuer_block三、目录 dentry四、文件索引结点 inode五、打开的文件 file沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍 Linux 文件系统数据结构…

深入理解MySQL中的事务和锁

目录 数据库中的事务是什么? MySQL事务的隔离级别 脏读、不可重复读、幻读 MVCC(多版本并发控制) 快照读和当前读 MySQL中的锁 MyISAM引擎的锁: InnoDB引擎的锁: 乐观锁和悲观锁 共享锁和排他锁 数据库中的事…

【STL二十】算法——排序操作(sort、stable_sort)_集合操作(merge)

【STL二十】算法——排序操作(sort、stable_sort)_ 集合操作(merge) 一、分类二、修改序列的操作三、排序操作1、sort2、stable_sort3、is_sorted、is_sorted_until 四、集合操作1、merge2、inplace_merge 一、分类 根据网站https://www.apiref.com/cpp…

JavaScript实现输出一个“天”字的代码

以下为实现输出一个“天”字的程序代码和运行截图 目录 前言 一、实现输出一个“天”字 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择,您可以在目录里进行快速查找; 2.本博文代码可以根据题目要求实现相…

【瑞萨RA系列FSP库开发】初识寄存器

文章目录 一、寄存器是什么二、瑞萨RA6M5 芯片内部模块与资源三、存储器映射1. 存储器映射表2. 存储器区域划分3. 外设寄存器 四、C语言操作寄存器1. C语言对寄存器的封装(1)外设模块基地址定义(2)寄存器结构体定义(3&…

【LLM系列之BLOOM】BLOOM: A 176B-Parameter Open-Access Multilingual Language Model

论文题目:《BLOOM: A 176B-Parameter Open-Access Multilingual Language Model》 论文链接:https://arxiv.org/abs/2211.05100 github链接:https://github.com/huggingface/transformers-bloom-inference/tree/main huggingface链接&#xf…