计算机图形学games101——MVP

news2024/10/7 20:28:05

首先记得一个知识点

在旋转矩阵中,旋转矩阵的逆矩阵就是旋转矩阵的转置,这个矩阵是正交矩阵

我们需要做到的就是观测变换,这个变换包括视图变换和投影变换(投影变换包含正交变换和透视变换)

三维变换复习

首先复习一下三维变换,三维变换在二维变换的基础上添加一个维度,首先我们在之前的学习中可以了解到,物体的旋转和缩放都可以通过一个矩阵来表示,但是位移比较特殊,如果我们需要完整的描述一个物体在空间内的变换,就需要做到仿射变换+位移变换

为了解决这个问题,我们才引入了齐次坐标,也就是说,将每一个坐标扩展一维,最后一个数为0时代表为一个向量,最后一个坐标为1时代表为一个点,这样做旋转,缩放和位移都可以通过矩阵来表达

在三维的变换中,也是同样的道理

之后我们通过一个4X4的矩阵就可以表达三维世界中物体的变换了,先应用线性变换再加上位移

三维世界中的旋转比较复杂,我们先按照简单的来,根据轴的旋转,其实更具轴的旋转我们就可以简单的看为轴上的值不变,其它两轴为旋转向量,其中Y轴方向的旋转向量为何不同,这是因为Y轴是由Z轴叉乘X轴得来的,反过来了

那么将这个旋转扩展到整个三维空间中应该怎么做呢,简单来说就是绕任何轴的旋转都可以分解成三个轴的旋转,但是要怎么分解是一个难题,首先我们需要证明任意一个方向的旋转和以被三个轴旋转的方向所表示,实际上这是可行的,例如一个飞机的旋转,用欧拉角可以用来表示

最后在数学上,人们得到了一个公式用来表示任意一个旋转,这个旋转公式叫做罗得里格斯公式,这个公式由角度和旋转轴构成,这个旋转轴我们默认其过了原点 ,这样的话我们就可以在旋转之前先将旋转轴和物体移动到原点,然后再旋转然后再移回去,这里的N矩阵就是叉乘的矩阵表示

四元数这里不细说,我们只需要知道四元数是用来做插值的,因为例如旋转15度和旋转25度有两个矩阵表示,我将其加起来平均肯定不代表这个旋转矩阵表示旋转20度,因此引入了四元数的概念

视图变换

我们的目的是为了将三维的物体变成二维的图片,首先我们需要规定场景,那就是模型和场景的放置(model transformation),摄像机的位置方向(view transformation),最后是投影灯到相机上(projection transform),合起来成为MVP变换

怎么做视图变换,也就是怎么摆放摄像机,包括摆放位置(position),朝向(look—at direction),以及一个向上的方向(Up direction)

我们知道,物体之间的运动表示为相对运动,那么我们为了简化计算,我们可以规定,相机永远不动,都是其它物体相对于相机运动,相机永远处在原点位置,朝向Z轴的负方向,向上的方向为Y轴

为了达成这个目标,我们需要一一对应摆放好摄像机

这样一系列的操作,通过几个矩阵表示,位移好写,但是旋转不好写,但同时反过来更好写,那么写出来逆矩阵再求逆矩阵就好了

同时旋转矩阵式是正交矩阵,那么直接写一个转置矩阵就好了,视图矩阵和模型矩阵本质上做的东西都是差不多的

投影变换

投影有两种不同的方法,分别是正交投影和透视投影,我们的视觉是透视投影,是否有近大远小的性质就是这两者的最大区别

正交投影

这个投影很简单,简单理解就是我们定好摄像机的位置后,抛弃掉Z轴,将所有的图形放在XY平面上,并将其缩放到-1,1的这样一个矩形上就可以了

在图形学中的做法是,我们将一个三维世界中的物体用一个长方体包起来,分别定义其X轴上的左和右,Y轴方向上的下和上,以及Z轴上的远和近,然后将整个立方体移动到以原点为中心的地方,再将其缩放成一个标准的【-1,1】^3的立方体就可以了

怎么写成数学上的形式呢,非常直观,一个平移一个缩放

透视投影

这个透视投影使用的更加普遍,在透视投影中,两条平行的线是会相交的

在学习透视投影前,我们需要复习一个概念,就是只要在齐次坐标中,最后一个维度的数字不为0,那么这个永远都是代表空间中的一个点

我们做透视投影的时候,可以先将透视投影中的那个原平面的平面先缩放成一个和近平面一样的大小的矩形,那这样我们就得到了一个长方体,之后拿这个长方体做一次正交投影就可以了,那么相较于正交投影,我们需要做到的就是一步从投影到正交,挤压的一个过程,这个过程也是一个变化矩阵

我们为了得到唯一的一个挤压结果,需要定义一下,首先是近平面永远不变,远平面的z值不变,远平面的中心点在挤压前后不变

我们通过从侧面看,通过相似三角形可以得到y之间的关系

y之间的关系清楚之后,同样的我们也可以获得x之间的关系,无非就是将侧视图换成俯视图,那么在得到两个点y和x的关系之后,我们可以知道这个挤压变换矩阵乘以任意一个点可以得到的新的坐标中,x和y已经确定了

那么根据已知的信息,我们已经可以获得这个变化矩阵大部分的值了

我们就只需要再求出第三行,这时候需要利用到两个条件,第一个条件,在近平面上变换后所有的点不变,在远平面上所有的点变换后z不变

代入两个条件,第一个条件近处平面,那么我们可以知道第三行前两个数为0,因为结果的第三行一列的数字为n,和xy没有关系

带入第二个条件,远平面的定义,我们取远平面的中心点(0,0,f,1)那么结合刚刚的等式,我们可以得到两个等式

根据这两个等式我们就可以得出A和B

最后我们要明白中间的Z在经过挤压变化的时候是会变化的,应该是边近了,因为投影的线会变短

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

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

相关文章

Ubuntu20.04配置TurtleBot3 Waffle Pi远程控制

这里写目录标题 0. 机器人配置1. Ubuntu20.04配置TurtleBot3 Waffle Pi远程控制1.1 TurtleBot3 Waffle Pi端配置1.2 PC端配置1.2.1 安装turtlebot3的环境配置1.2.2 创建项目并安装Turtlebot31.2.3 配置环境变量 1.3 PC端与TurtleBot3进行通信1.3.1 PC端与机器人端互PING和SSH连…

ATA-L2水声功率放大器驱动水声换能器的测试研究

随着水声通信技术的发展,水下通信设备也开始逐步走向实用化,为了满足其实际的使用要求,功率放大器的设计需要具有高效率的特性,并能在水下长时间连续可靠的工作。 压电陶瓷换能器主要负责电信号与声信号之间的转换,换能…

ruoyi-cloud登录接口实现滑块验证码

一、前言 ruoyi项目默认的验证码是这样的 今天来尝试增加滑块验证码,我们用到的是tianai-captcha。 文档地址:http://doc.captcha.tianai.cloud/ 源码地址:https://gitee.com/tianai/tianai-captcha 下面来看具体的步骤。 二、后端 在g…

JL-33 手持式气象站/便携式气象站 小型气象站厂家 微型气象站

产品概述 手持式气象站是一款携带方便,操作简单,集多项气象要素于一体的可移动式气象观测仪器。产品采用传感器及芯片,能同时对空气温度、空气湿度、风速、风向、光照、大气压力、颗粒物、噪声等要素进行准确测量、记录并存储。仪器带有机械…

游泳哪个牌子好?6大游泳耳机选购技巧总结分享

游泳耳机作为水上运动爱好者和游泳专业人士的必备装备,不仅要能够抵御水的侵入,还要提供清晰的音质和舒适的佩戴体验。在市面上,不同品牌的游泳耳机琳琅满目,选择起来可能会令人头疼。本文旨在为您提供一份详尽的游泳耳机选购指南…

详细解释下flutter初始示例的代码

详细解释下flutter初始示例的代码 main 首句导入需要的包 类似于其他语言的import main函数为入口函数 包裹MyApp类 MyApp 这个类继承自无状态类 可见myapp不管理任何状态 build方法是所有widget内必须实现的方法 此处返回一个 ChangeNotferiProvider 可以看到它用于管理应…

2024年低碳发展与地球科学国际会议 (LCDES 2024)

2024年低碳发展与地球科学国际会议 (LCDES 2024) 2024 International Conference on Low Carbon Development and Earth Science 【重要信息】 大会地点:长沙 大会官网:http://www.iclcdes.com 投稿邮箱:iclcdessub-conf.com 【注意&#xf…

一个opencv实现检测程序

引言 图像处理是计算机视觉中的一个重要领域,它在许多应用中扮演着关键角色,如自动驾驶、医疗图像分析和人脸识别等。边缘检测是图像处理中的基本任务之一,它用于识别图像中的显著边界。本文将通过一个基于 Python 和 OpenCV 的示例程序&…

《昇思25天学习打卡营第6天|网络构建》

文章目录 前言:今日所学:1. 定义模型类2. 模型层3. 模型参数 前言: 在第六节中我们学习了网络构建,了解了神经网络模型是由神经网络层和Tensor操作构成,我们使用的mindspore.nn中提供了常见的升级网络层的实现&#x…

c++边界处理机制

1.vector std::vector&#xff1a;std::vector 是动态数组&#xff0c;它会在运行时动态地调整存储空间大小&#xff0c;因此当访问超出边界时&#xff0c;会触发运行时异常 std::out_of_range。可以通过try-catch块来捕获这种异常来处理越界访问。 #include <iostream>…

十五、【源码】给代理对象设置属性

源码地址&#xff1a;https://github.com/spring-projects/spring-framework 仓库地址&#xff1a;https://gitcode.net/qq_42665745/spring/-/tree/15-proxy-set-property 给代理对象设置属性 之前的代码是创建Bean进行判断&#xff0c;要不要进行代理&#xff0c;如果代理…

console 报错 之 Uncaught (in promise) RangeError: Maximum call stack size exceeded

1. 背景 demo 环境报错。。。 2. 报错问题 3. 问题原因 vue 报错: “RangeError: Maximum call stack size exceeded” 报错通常是由于无限的递归 导致的。当使用 Vue 路由时&#xff0c;如果设置不当&#xff0c;会导致无限的递归&#xff0c;最终导致栈溢出&#xff0c;即…

【TypeScript】TS入门到实战(详解:高级类型)

目录 第三章、TypeScript的数据类型 3.1 TypeScript的高级类型 3.1.1 class 3.1.1.1 熟悉class类 3.1.1.2 class类继承的两种方式 3.1.1.3 class类的5种修饰符 3.1.2 类型兼容 3.1.3 交叉类型 3.1.4 泛型 3.1.4.1 创建泛型函数 3.1.4.2 泛型函数的调用 3.1.4.3 泛型…

【操作与配置】Linux的CPU深度学习环境

Conda安装 可浏览官网&#xff1a;Miniconda — Anaconda 文档 这四条命令会快速而且悄悄地安装最新的64位安装程序&#xff0c;然后清理安装过程中产生的文件。如果需要安装 Linux 版本的其他版本或架构的 Miniconda&#xff0c;只需要在命令中更改安装程序的名称。 mkdir …

【C++】const详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文作为 JohnKi &#xff0c;引用了部分大佬的案例 &#x1f4e2;未来很长&#xff0c;…

【Kali-linux for WSL】图形化界面安装

文章目录 前言图形化界面安装 前言 之前在WSL中安装了Kali 启动之后发现什么都没有&#xff01;&#xff01;&#xff01; 那我还怎么学习渗透技术&#xff1f;&#xff1f;&#xff1f; 看来&#xff0c;得改进下我的kali-linux for wsl&#xff0c;安装个图形化界面 图形化…

JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测

JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测 目录 JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-Transformer-LSTM多变量回归预测&#xff0c;贝叶斯优化Transformer结合LSTM长…

【Python】Python中的常量与变量

常量与变量 导读一、新建项目二、常量2.1 字面常量2.2 特殊常量 三、变量3.1 变量的定义3.2 变量的命名3.2.1 关键字 结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 在上一篇内容中我们详细介绍了Python环境的搭建过程&#xff0c;…

一键转换,高效管理:引领文件批量改后缀名与TXT转DOCX格式新潮流

在这个数字化时代&#xff0c;文件管理和格式转换成为了我们日常工作中不可或缺的一部分。然而&#xff0c;手动更改文件后缀名以及将TXT文件转换为DOCX格式&#xff0c;不仅耗时耗力&#xff0c;还容易出错。幸运的是&#xff0c;我们有了文件批量改名高手这款强大的工具&…

【JAVA多线程】JDK中的各种锁,看这一篇就够了

目录 1.概论 1.1.实现锁的要素 1.2.阻塞队列 1.3.Lock接口和Sync类 2.各种锁 2.1.互斥锁 2.1.1.概论 2.1.2.源码 1.lock() 2.unlock() 2.2.读写锁 2.3.Condition 2.3.1.概论 2.3.2.底层实现 1.概论 1.1.实现锁的要素 JAVA中的锁都是可重入的锁&#xff0c;因为…