【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坐标会如何变化,是变远呢还是变近了呢,还是不变呢 

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

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

相关文章

1、关于前端js-ajax绕过

1、Ajax知识 、js--Ajax 传统请求跟js--Ajax请求的差别 在实例中用的上js-ajax的有 表单验证&#xff1a; 在用户填写表单时&#xff0c;可以使用 Ajax 在不刷新页面的情况下验证表单字段&#xff0c;并提供即时反馈。 实时搜索&#xff1a; 在搜索框中输入内容时&#xff0…

Gateway

网关的作用&#xff1a; 可以对访问的用户进行身份认证和权限校验还可以服务路由&#xff0c;负载均衡还可以进行请求限流 网关本身也是微服务的一部分&#xff0c;所以需要使用nacos进行服务注册和发现 网关路由的配置 路由id&#xff1a;路由唯一标识uri&#xff1a;路由…

使用STM32 HAL库进行GPIO控制的实例

✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进&#xff0c; 代码获取、问题探讨及文章转载可私信。 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 &#x1f34e;获取更多嵌入式资料可点击链接进群领取&#xff0c;谢谢支持&#xff01;…

利用R语言heatmap.2函数进行聚类并画热图

数据聚类然后展示聚类热图是生物信息中组学数据分析的常用方法&#xff0c;在R语言中有很多函数可以实现&#xff0c;譬如heatmap,kmeans等&#xff0c;除此外还有一个用得比较多的就是heatmap.2。最近在网上看到一个笔记文章关于《一步一步学heatmap.2函数》&#xff0c;在此与…

java-两个列表进行比较,判断那些是需要新增的、删除的、和更新的

文章目录 前言两个列表进行比较&#xff0c;判断那些是需要新增的、删除的、和更新的 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实…

SpringIOC之@Configuration

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

Django的logging-日志模块的简单使用方法

扩展阅读&#xff1a; Python-Django的“日志功能-日志模块(logging模块)-日志输出”的功能详解 现在有下面的Python代码&#xff1a; # -*- coding: utf-8 -*-def log_out_test(content_out):print(content_out)content1 "i love you01" log_out_test(content1)现…

云服务器Centos中安装Docker

云服务器Centos中安装Docker 1 简介DockerCentosCentos和Ubuntu区别 2 安装3 测试hello-world的镜像测试 1 简介 Docker Docker是一个开源的应用容器引擎&#xff0c;利用操作系统本身已有的机制和特性&#xff0c;可以实现远超传统虚拟机的轻量级虚拟化。它支持将软件编译成…

Windows 12 和 AI 计算机

据商业时报消息 &#xff0c;微软计划于 2024 年 6 月发布Windows 12。 新版本的操作系统将伴随集成人工智能。 该数据基于广达首席执行官林百里和宏基陈杰森在中国台北医疗科技展上的发言。 虽然这篇文章没有直接引用微软高管的话&#xff0c;但它是根据他们的评论得出的结…

IDEA 社区版 add GitLab Account

问题 IntelliJ IDEA Community Edition 2023.3&#xff08;社区版&#xff09;在使用GitLab连接时&#xff0c;使用个人访问令牌出现报错&#xff0c;代码&#xff1a; GraphQL error:[No such type ProjectMember,so it cant be a fraggment condition,Field id doesnt exis…

2023年最新prometheus + grafana搭建和使用

一、安装prometheus 1.1 安装 prometheus官网下载地址 sudo -i mkdir -p /opt/prometheus #移动解压后的文件名到/opt/,并改名prometheus mv prometheus-2.45 /opt/prometheus/ #创建一个专门的prometheus用户&#xff1a; -M 不创建家目录&#xff0c; -s 不让登录 useradd…

Navicat 技术指引 | 适用于 GaussDB 分布式的数据迁移工具

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

单例模式---饿汉式、懒汉式

一、什么是单例模式 单例模式&#xff0c;指的是一个类中的对象只能有一个&#xff0c;它在内存中只会创建一次对象的设计模式。 二、饿汉式 public class SingleTon {// 私有的构造方法private SingleTon() {};// 1. 饿汉式private static SingleTon instance new SingleTon…

整数以及浮点数在内存中的存储

一.整数在内存当中的存储 数据在内存中是以十六进制补码的形式进行存储的。 原码表示法简单易懂&#xff0c;适用于乘法&#xff0c;但用原码表示的数进行加减运算比较复杂&#xff0c;当两数相加时&#xff0c;如果同号则数值相加&#xff0c;但是进行减法时要先比较绝对值的…

认知觉醒(六)

认知觉醒(六) 第二节 感性&#xff1a;顶级的成长竟然是“凭感觉” 人类生存于世&#xff0c;比拼的是脑力思维&#xff0c;但极少有人知道&#xff0c;我们的身体里还有一个更高级的系统&#xff0c;若能善用&#xff0c;成就非凡。 1941年&#xff0c;德军对英国本土进行…

目标检测器技术演进简史

引言 目标检测算法的发展已经取得了长足的进步&#xff0c;从早期的计算机视觉方法开始&#xff0c;通过深度学习达到了很高的准确度。在这篇博文中&#xff0c;我们将一起回顾一下这些算法的发展阶段以及现代目标检测系统中使用的主要方法。 我们首先回顾早期传统的目标检测…

大数据技术3:数据仓库的ETL和分层模型

前言&#xff1a;我们先了解一下数据仓库架构的演变过程。 1 、数据仓库定义 数据仓库是一个面向主题的&#xff08;Subject Oriented&#xff09;、集成的&#xff08;Integrate&#xff09;、相对稳定的&#xff08;Non-Volatile&#xff09;、反映历史变化&#xff08;Time…

电商系统架构演进

聊聊电商系统架构演进 具体以电子商务网站为例&#xff0c; 展示web应用的架构演变过程。 1.0时代 这个时候是一个web项目里包含了所有的模块&#xff0c;一个数据库里包含了所需要的所有表&#xff0c;这时候网站访问量增加时&#xff0c;首先遇到瓶颈的是应用服务器连接数&a…

深入体验:山海鲸可视化软件的独特魅力

山海鲸可视化软件是一款功能强大的数据可视化工具&#xff0c;作为该软件的资深用户&#xff0c;我深感其独特的魅力和优势。下面&#xff0c;我将从软件特点、操作体验、数据交互和实际应用场景等方面&#xff0c;为大家详细介绍山海鲸可视化软件。 首先&#xff0c;山海鲸可视…

解决Eslint和Prettier关于三元运算符的冲突问题

三元运算符Prettier的格式化 三元运算符Eslint的格式要求 解决办法 // eslint加入配置&#xff0c;屏蔽标红报错indent: [error, 2, { ignoredNodes: [ConditionalExpression] }]效果