【GAMES101】观测变换

 图形学不等于 OpenGL,不等于光线追踪,而是一套生成整个虚拟世界的方法

记得有个概念叫光栅化,就是把三维虚拟世界的事物显示在二维的屏幕上,这里就涉及到观察变换

观察变换,叫viewing transformation,包括视图变换和投影变换,投影变换又分为正交投影变换和透视投影变换

目录

视图变换

投影变换

正交投影变换

透视投影变换


视图变换

怎么理解这个视图变换呢,闫神举了个例子,比如说要拍张照片,那么把人物和场景摆放好就是模型变换,而找一个好位置放好摄像机并调好角度就是视图变换,而最后拍照成像的这个过程就是投影变换

怎么实现这个视图变换呢?我们首先来规定好摄像机的摆放参数,有一个位置,摄像机的朝向(往左往右看),还有一个向上的方向(类似于歪头)

为了方便,于是约定俗成的把这个摄像机的位置放在原点处,然后让摄像机朝向z轴的负方向,向上的方向为y轴正方向

那么如何把一个摄像机移到原点并且旋转到我们需要的方向呢?

我们可以先平移在旋转,平移这个简单,直接就能写出变换矩阵来

旋转呢?如果直接考虑从g旋转到-z,t旋转到y,以及g×t旋转到x,这个比较复杂,但是反过来旋转就比较简单的可以写出变换矩阵,所以我们需要的变换矩阵就是这个简单变换矩阵的逆矩阵,又因为旋转矩阵是正交矩阵,正交矩阵的逆矩阵就是其本身的转置矩阵,所以这个简单的旋转矩阵转置就是我们需要的旋转矩阵

投影变换

投影变换就是为了实现将三维的事物展示在二维上

这个透视投影呢就是近大远小,而正交投影就是相当于这个摄像机放在无限远处,那么这样近处和远处的大小看起来也是一样的了

正交投影变换

正交投影变换就是相当于把所有的点都移到XoY这个平面上,相当于这个z坐标不要了

为了显示所有的点,我们将所有的点都限制在[-1,1]里面来

但是这样分不清远近,因此我们希望限制在一个正方体里面去,这个叫做标准的正方体,记为

 [l, r] x [b, t] x [f, n]

这个l和r是left和right,就是x方向的左右,b和t呢是bottom和top,对应y方向的上下,而这个f<n是far和near,对应z方向的远近,那为什么远比近小呢?这是因为我们的摄像机是看向-z方向的

因此对于一个场景,我们通过平移和缩放两种变换就可以把它限制在这个标准的正方体里面去

透视投影变换

透视投影比较常见,欧几里得说过,在一个平面中,永不相交的两条直线是平行线,但是透视投影却使得平行线可以看起来是相交的

在我们开始之前,我们再回顾一下,在齐次坐标系中,对于一个点而言,如果我们直接对每个维度都乘以某个不为0的系数,那么这个点是不变的,这个点还是这个点对吧

那我们怎么来做这个投影变换呢?

实际上,我们想做的就是把这个截锥体给挤压成这个长方体,然后再做一次正交投影就行了

怎么挤压呢,我们可以取某个点来分析,这里用到相似三角形的原理,相似三角形的一切对应线段(对应高、对应中线、对应角平分线、外接圆半径、内切圆半径等)的比等于相似比

我们先取x和y做分析哈,那么挤压后的这个x和y就可以通过先前近平面的n和远平面的z的比值乘以x和y得到

 

因此我们就可以找到一个这么一个对应关系使得这个点挤压过去,但是这个z会变成什么样我们还不清楚

那么现在这个从透视投影变换到正交投影的变换矩阵已经有了雏形了

 

怎么解决第三行呢?

我们注意到近平面上的点在挤压后是不会发生变换的,同时远平面上的点的z坐标也不会发生变化

因此对于一个点(x,y,n,1)在挤压后应该还是(x,y,n,1),那么乘以z,也就是乘以n,这个第三行的结果应该是n²,那么这样的话,第三行应该长成(0,0,A,B)这个样,只有这样计算出来的结果才会和x和y没有关系

那么再加上远平面上的点挤压后z不变的结果,我们可以得到一个二元一次方程组

进而可以得到A和B的解,那么这个变化矩阵就找到了

这节课的最后,闫神留了个问题,在挤压的过程中,这个z坐标会如何变化,是变远呢还是变近了呢,还是不变呢 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Live555实现RtspServer及高清高码率视频传输优化

基于Live555实现RtspServer及高清高码率视频传输优化 最近做了一些pc和嵌入式平台的RTSP服务器项目&#xff0c;大多数的要求是简单但是功能全面&#xff0c;并且性能还要强劲。综合考虑后&#xff0c;基本都是在基于live555的基础上进行开发&#xff0c;在进行Live555本身的优…

前端-杂记

1 子域请求时候会默认带上父域下的Coolkie 2 document.cookie 设置cookie只能设置当前域和父域&#xff0c;且path只能是当前页或者/ 比如当前页面地址为 http://localhost:3000/about 我们设置 document.cookie "demo11"; 设置 document.cookie "demo22; …

[ROS2] --- param

1 param介绍 类似C编程中的全局变量&#xff0c;可以便于在多个程序中共享某些数据&#xff0c;参数是ROS机器人系统中的全局字典&#xff0c;可以运行多个节点中共享数据。 全局字典 在ROS系统中&#xff0c;参数是以全局字典的形态存在的&#xff0c;什么叫字典&#xff1f;…

Ubunutu18.04 ROS melodic 无人机 XTDrone PX4 仿真平台配置

一、依赖安装 sudo apt install ninja-build exiftool ninja-build protobuf-compiler libeigen3-dev genromfs xmlstarlet libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev python-pip python3-pip gawk pip2 install pandas jinja2 pyserial cerberus pyulog0.7.0 n…

【uC/OS-II】

uC/OS-II 1. uC/OS-II1.1 代码组成1.2 任务基本概念1.3 任务控制块![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/23fe7cd390b94b7eb06a110b10165d22.png)1.4 任务的状态与切换1.5 任务创建的代码 2 任务2.1 系统任务2.2 任务管理相关函数2.3 任务基本属性2.4 uC/…

IP地址定位技术:追踪位置、识别风险

随着互联网的普及&#xff0c;IP地址定位技术逐渐成为网络安全领域的一项重要工具。通过追踪IP地址位置&#xff0c;可以识别潜在的风险用户&#xff0c;加强网络安全。本文将深入研究IP地址定位技术的原理、应用以及相关的风险与防范。 1. IP地址定位技术的原理&#xff1a; …

架构面试:全链路压测,你是怎么设计的?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;很多小伙伴拿到一线互联网企业、上市企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 就在前几天&#xff0c;尼恩的指导一个 30岁小伙拿到一个工业互联网上市企业55W年薪的offer&#xff0c;是架构师…

Python数据处理的六种方式总结,Python零基础学习

文章目录 前言1、dedup()去重并排序2、traverse()拆分嵌套数组3、filter()数据筛选4、groupby()分组运算5、select()遍历结果集6、sort()数据排序 总结 前言 在 Python 的数据处理方面经常会用到一些比较常用的数据处理方式&#xff0c;比如pandas、numpy等等。 今天介绍的这…

AI文档助手,当下热门的AI文档助手【2024】

在当今信息爆炸的时代&#xff0c;文档创作的需求愈发庞大。为了满足用户对高效、准确、原创性文档的需求&#xff0c;人工智能技术的应用日益广泛。本文将专心分享AI文档助手领域的热门推荐。 AI文档助手的背景与应用 AI文档助手作为人工智能技术在文档创作领域的一大应用&am…

跨平台的文本编辑器——CudaText

CudaText 是一个轻量级、跨平台的文本编辑器&#xff0c;它免费开源&#xff0c;启动速度非常快&#xff0c;有拓展功能&#xff0c;可安装插件。 下载 浏览器搜索框输入CudaText - Home进行搜索&#xff0c; 选择官网进入&#xff0c; 进入官网界面如下&#xff1a;选择点击…

孩子都能学会的FPGA:第二十六课——用FPGA实现CIC抽取滤波器

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

windows系统如何解决爆满C盘

目录 方法一&#xff1a;清理临时文件 方法二&#xff1a;清理临时文件 方法三&#xff1a;清理系统更新文件 方法四&#xff1a; 设置自动清理无用文件 4.1 清理缓存 4.2 打开存储感知 4.3 调整新内容存储地方 方法一&#xff1a;清理临时文件 代码&#xff1a;win …

Python框架篇(4):FastApi-错误处理

提示: 微信搜索【猿码记】回复 【fastapi】即可获取源码信息~ 1.验证错误 1.1 默认返回 当传参不符合模型验证规则时&#xff0c;默认错误信息和格式返回如下: { "detail": [ { "loc": [ "body", "age" …

22、pytest多个参数化的组合

官方实例 # content of test_multi_parametrie.py import pytestpytest.mark.parametrize("x",[0,1]) pytest.mark.parametrize("y",[2,3]) def test_foo(x,y):print("{}-{}".format(x,y))pass解读与实操 要获得多个参数化参数的所有组合&…

科学指南针助力江西高校开展《透射电子显微镜简介及案例分析课程》讲座

2023年11月&#xff0c;科学指南针与江西各大高校合作&#xff0c;共同开展了一场关于《透射电子显微镜的简介及案例分析课程》讲座。该讲座旨在加强学生对于透射电子显微镜的了解&#xff0c;提高他们在科学研究中的实践能力。 透射电子显微镜&#xff08;简称TEM&#xff09…

【LeetCode】每日一题 2023_12_9 下一个更大的数值平衡数(枚举/打表二分)

文章目录 刷题前唠嗑题目&#xff1a;下一个更大的数值平衡数题目描述代码与解题思路官方解法 结语 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;下一个更大的数值平衡数 题目链接&#xff1a;2048. 下一个更大的数值平衡数 …

C++11原子操作atomic

文章目录 原子操作atomic原子操作的相关函数原子操作的特点“平凡的”与“合格的” 原子操作atomic 前面我们介绍了互斥锁等一系列多线程相关操作&#xff0c;这里我们来说下原子操作atomic。 可以理解为原子变量就是将上面的操作进行了整合的一个全新变量&#xff0c;但是实际…

Qt 容器QGroupBox带有标题的组框框架

控件简介 QGroupBox 小部件提供一个带有标题的组框框架。一般与一组或者是同类型的部件一起使用。教你会用,怎么用的强大就靠你了靓仔、靓妹。 用法示例 例 qgroupbox,组框示例(难度:简单),使用 3 个 QRadioButton 单选框按钮,与QVBoxLayout(垂直布局)来展示组框的…

远程控制如何赋能智能制造?贝锐向日葵制造业场景案例解析

随着数字化转型在制造业的不断深入&#xff0c;企业在产线端也逐渐投入更多智能化设备&#xff0c;数字化、智能化设备其中一个比较显著的优势就是可以依托互联网实现远程运维和调试&#xff0c;大大提升产线设备的稳定性和工作效率&#xff1b;而远程调试运维一个重要的实现方…

数据表排序

指针用的有点少了&#xff0c;有点不适应 用的冒泡排序 代码如下&#xff1a; #include<stdio.h> int num[100][100]; int * p[100], jud[100]; int judge(int i, int j, int rank); int m, n, k;int main(void) {scanf("%d%d%d", &m, &n, &k);f…