透视投影矩阵的推导

2023-11-08

视锥体

 

 

如图,近截面与远截面之间构成的这个四棱台就是视锥体,而透视投影矩阵的任务就是把位于视锥体内的物体的顶点X,Y,Z坐标映射到[-1,1]范围。这就相当于把这个四棱台扭曲变形成一个立方体。这个立方体叫做规则观察体   (Canonical View Volume, CVV)。如下图:

 

变换方法或规则:

如下图,有一点P,位于视锥体内,设坐标为(x,y,z).分别对x,y坐标和z坐标的变换到[-1,1]的方式进行讨论:

1.x,y坐标的变换方式:

(1)连接视点eye与P点与近裁剪面交于P’点

(2)设近裁剪面的宽度为W,高度为H,P’点的x坐标范围是[-W/2,W/2],y坐标范围是[-H/2,H/2],然后分别线性映射至[-1,1]内即可。

 

2.z坐标的变换方式

 z坐标的范围是N至F,需要映射到[-1,1],映射方法暂时按下,不做想法。

 

透视投影函数形式

void Matrix4X4::initPersProjMatrix(float FOV, const float aspect, float zNear, float zFar) 

透视投影矩阵构建函数的参数:

Fov:纵向的视角大小

 

aspect:裁剪面的宽高比

zNear:近裁剪面离摄像机的距离,图中的n

zFar:远裁剪面离摄像机的距离,图中的f

 

通过这几个参数和三角函数的数学知识可以求得近裁剪面的高度,参考上图:

 

 

 

求得点P在近裁剪面的投影点P’的坐标

 

根据相似三角形对应边长度的比率相同,由图可得

 

其中

 

x’,y’的范围沿原点对称,只要将他们分别除以W/2,H/2,即可以使范围位于[-1,1]内。前面已求得W,H,因此:

 

 

假设

我们最后需要的坐标点P’’即是

 

推导矩阵

然后为了自动化的得到这个结果,我们使用矩阵这种数学工具,将一个矩阵乘以一个向量,得到一个新的向量,使得我们所有的运算步骤和运算数据蕴藏在矩阵和乘法中。下面的工作就是寻找到一个矩阵使得:

 

我们发现求解

很难找出合适的m00、m02,因为左边x和z是以加法的形式相邻,右边z确成为了x的分母。

解决方法:将右边的以四维列向量表示的坐标每一项乘以z,所以有:

 

 

 

所以可以求得矩阵为

 

最后求得投影矩阵为

将这样的矩阵乘以视锥体内的一个顶点坐标,得到一个新的向量,再将这个向量的每个分量除以第四个分量(z),这样就可以得到顶点映射到规则立方观察体后的新的坐标。

 

注意:z坐标的映射方式的获得,最后我们是为了方便矩阵乘法的操作反向求得了z坐标与cvv中的z坐标的映射方式:

可见两者的映射并不是线性的,当z越大时,z的变化对z’’的扰动越小

 

代码示例:

复制代码

1 void Matrix4X4::initPersProjMatrix(float FOV, const float aspect, float zNear, float zFar) {
2     const float zRange = zNear - zFar;
3     const float tanHalfFOV = tanf(ToRadian(FOV / 2.0f));
4 
5     elements[0][0] = 1.0f / (tanHalfFOV * aspect);  elements[0][1] = 0.0f;             elements[0][2] = 0.0f;           elements[0][3] = 0.0;
6     elements[1][0] = 0.0f;                     elements[1][1] = 1.0f / tanHalfFOV;   elements[1][2] = 0.0f;            elements[1][3] = 0.0;
7     elements[2][0] = 0.0f;                     elements[2][1] = 0.0f;              elements[2][2] = (-zNear - zFar) / zRange;  elements[2][3] = 2.0f * zFar*zNear / zRange;
8     elements[3][0] = 0.0f;                     elements[3][1] = 0.0f;             elements[3][2] = 1.0f;            elements[3][3] = 0.0;
9 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

透视投影矩阵的推导 的相关文章

  • 如何使用 JSON.parse() 和 JSON.stringify()

    介绍 The JSON object在所有现代浏览器中都可用 有两种有用的方法来处理 JSON 格式的内容 parse and stringify JSON parse JSON parse 获取 JSON 字符串并将其转换为 JavaSc
  • C++ 中的字符串连接:连接字符串的 4 种方法

    在本文中 我们将揭示在中执行字符串连接的各种方法C 语言 该方法在编程时可用于多种目的 但总的来说 这个概念与组合来自不同位置的两个字符串并将它们放在一起是相同的 C 中的字符串连接技术 在 C 中连接字符串时可以考虑以下技术 C 连接 运
  • 如何在 CentOS 7 上安装和使用 PostgreSQL

    介绍 关系数据库管理系统是许多网站和应用程序的关键组件 它们提供了一种结构化的方式来存储 组织和访问信息 PostgreSQLPostgres 或 Postgres 是一个关系数据库管理系统 提供 SQL 查询语言的实现 它是许多小型和大型
  • 如何在 VPS 上使用 Nginx 设置 FastCGI 缓存

    Prelude Nginx 包含一个 FastCGI 模块 该模块具有用于缓存 PHP 后端提供的动态内容的指令 设置此功能无需额外的页面缓存解决方案 例如反向代理 想想Varnish 或特定于应用程序的插件 还可以根据请求方法 URL c
  • DNS 术语、组件和概念简介

    介绍 DNS 即域名系统 通常是学习如何配置网站和服务器的一个非常困难的部分 了解 DNS 的工作原理将帮助您诊断配置网站访问的问题 并让您更深入地了解幕后发生的事情 在本指南中 我们将讨论一些基本的 DNS 概念 这些概念将帮助您开始使用
  • Web 服务面试问题 - SOAP、RESTful

    欢迎来到 Web 服务面试问题及其详细答案 最近我写了很多关于 Web 服务的文章 我们如何用 Java 创建 SOAP 和 RESTful Web 服务 Web 服务面试问题 Here I am providing you a list
  • 如何在 CentOS 6 上使用 Logstash 和 Kibana 集中日志

    状态 已弃用 本文介绍不再受支持的 CentOS 版本 如果您当前运行的服务器运行 CentOS 6 我们强烈建议您升级或迁移到受支持的 CentOS 版本 Reason CentOS 6 于 2020 年 11 月 30 日达到生命周期终
  • Java 是按值传递,而不是按引用传递

    介绍 许多 Java 程序员质疑 Java 是否按值传递 or 通过引用传递 本文总结了为什么 Java 总是按值传递 首先 按值传递和按引用传递是什么意思 按值传递 将方法参数值复制到另一个变量 然后将复制的对象传递给方法 该方法使用副本
  • 如何在 Angular 中使用 Chart.js 和 ng2-charts

    介绍 Chart js是一个流行的 JavaScript 图表库ng2 charts是 Angular 2 的包装器 用于将 Chart js 集成到 Angular 中 在本教程中 您将使用 Chart js 和ng2 charts在 A
  • 将 CSV 文件读入 R 中的数据帧

    借助 R 提供的特定函数 将 CSV 文件读入数据帧要容易得多 什么是 CSV 文件 CSV 扩展为逗号 分隔 值 在此文件中 存储的值用逗号分隔 存储数据的过程要容易得多 为什么 CSV 是最常用的数据存储文件格式 将数据存储在 Exce
  • 如何在 Ubuntu 16.04 上为多个平台构建 Go 可执行文件

    介绍 The Go编程语言附带丰富的工具链 使获取包和构建可执行文件变得异常容易 Go 最强大的功能之一是能够为任何 Go 支持的外部平台交叉构建可执行文件 这使得测试和包分发变得更加容易 因为您不需要访问特定平台即可为其分发包 在本教程中
  • mongodb使用使用 SCRAM 验证客户端设置访问控制

    1 在没有访问控制的情况下启动 MongoDB 启动没有访问控制的mongodb实例 打开终端并以mongod用户身份运行以下命令 mongod port 27017 dbpath var lib mongodb 若是按照我前几篇的步骤来的
  • 贪心算法在计算机体系结构中的应用

    目录 一 前言 二 离线缓存 Offline caching 1 高速缓存技术的简要介绍 2 问题引入 3 精确问题 寻找思路 4 引入贪心算法 5 最优子结构性质的证明 1 变量准备 2 反证法证明 cut paste 法 6 递推表达式
  • 园区消防系统组成

    园区消防系统是一个关键的安全设施 它由多个组成部分构成 以确保园区内的火灾风险得到有效控制和管理 这些组成部分包括火灾报警系统 消防水系统 自动喷水灭火系统 消防通道和紧急出口等 首先 火灾报警系统是园区消防系统的核心组成部分之一 它通过安
  • 准备先敲一遍cesium源码

    由于cesium的例子中 关于shader只有后处理 对基本的单个模型和fbo都没有涉及 而目前公司没人去研究cesium源码 没办法 只能进行下去 否则 没法玩了 FBO什么的都加不上了

随机推荐

  • 美容院管理系统

    新经济环境下 美容院向智能互联网时代转型是大势所趋 在美容院不断拔地而起的今天 市场优胜劣汰 美容院业务范围的扩张和发展 让美容院对智能管理需求也越来越大 如 员工管理 产品管理 客户管理 订单管理 进销存管理 营销管理 报表管理等等 都向
  • 四、C语言进阶:宏定义和头文件

    4 宏定义和头文件 4 1 什么是宏定义 宏是用来表示一段代码的标识符 4 2 宏怎么用 三种用法 当作常量使用 当作函数使用 编译预处理 4 2 1 宏定义常量 预定义宏 ANSI C标准定义有些定义好的宏定义 称为预定义宏 这些宏定义以
  • 八数码深度优先搜索_程序员必知的十大基础实用算法之-DFS(深度优先搜索)...

    深度优先搜索 深度优先搜索是一种在开发爬虫早期使用较多的方法 它的目的是要达到被搜索结构的叶结点 即那些不包含任何超链的HTML文件 在一个HTML文件中 当一个超链被选择后 被链接的HTML文件将执行深度优先搜索 即在搜索其余的超链结果之
  • LoRa Mesh 自组网 采集器

    外观结构 分为主机跟从机 1个网络需要1个主机 技术参数和指标 电源 无线参数 有线参数 应用场景 无线抄表 实时监控 数据采集
  • 面向对象(OOP)的基本特征

    面向对象 OOP 的基本特征
  • 64位Windows11系统快速搭建修图神器codeformer运行环境教程详解

    前段时间发现一款低画质照片变高清图软件Codeformer引起了我极大的兴趣 经过学习 现在完全弄明白了它的安装 配置 使用方法 入坑良久 今日出坑 在这里留档备查 让我这个门外小白见识到了复杂的环境配置过程 入门深度学习首先要踩的也是必须
  • kotlin入门!万字长文轻松彻底入门Flutter,含泪整理面经

    前言 最近 有同学参加阿里云的面试 被问到 如果是MySQL引起的CPU消耗过大 你会如何优化 他说 这个问题他第一次遇到 当时一头雾水 不知道该如何回答 还好他当时机制 说MySQL底层不是他研究的重点 所以面试官没有再深入这块 因此 我
  • conda 导出环境/导入环境/导出base环境

    conda的虚拟环境真的非常实用 尤其是对于大的深度学习项目 给每个项目单独配一个环境 轻巧又容易管理 还能直接用别人配好的虚拟环境 非常方便 这里记录几个常用的导入导出命令免得每次找 查看可用环境 conda info envs 输出样式
  • 用群晖筑建音乐之「家」

    创意从业者的灵感总是随时迸发 一段简短的旋律就有可能谱成一首经典歌曲 而这个过程 不仅需要才华 学习 刻苦 还需要 方便保存所有这些灵感的 工具 群晖NAS为音乐爱好者或是音乐从业者打造私有音乐素材库 大量的音乐素材及作品都可以通过群晖NA
  • docker映射mysql修改字符编码_怎么在docker容器的mysql的编码格式变为utf8

    第一个方法 1 编辑MySql的配置文件 MySql的配置文件Windows下一般在系统目录下或者在MySql的安装目录下名字叫my ini 可以搜索 Linux下一般是 etc my cnf 在 mysqld 标签下加上以下内容 defa
  • 深拷贝浅拷贝的理解

    深拷贝 1 是指拷贝一个对象时 不仅仅把对象的引用进行复制 还把该对象引用的值也一起拷贝 2 源对象与拷贝对象互相独立 其中任何一个对象的改动都不会对另外一个对象造成影响 浅拷贝 1 指的是拷贝一个对象时 仅仅拷贝对象的引用进行拷贝 但是拷
  • “由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从...

    WCF程序中一般出现这样的错误 我们需要在服务端的web config中增加
  • 操作系统与shell

    操作系统与shell 操作系统与shell 一 什么是操作系统 1 什么是kernel 2 什么是shell 二 System Call 补充 用户态与内核态 操作系统与shell 一 什么是操作系统 操作系统 即Operating Sys
  • 一文读懂类加载机制

    类记载过程 多个java文件经过编译打包生成可运行的jar包 最终由java命令运行某个主类的main函数启动程序 这里首先需要通过类加载器把主类加载到jvm 主类在运行过程中如果使用到其他类 会逐步加载这些类 注意 jar包里的类不是一次
  • aws ec2 变更pem_用aws和jira建立一个连续的变更日志

    aws ec2 变更pem So you ve decided to go CI CD You read all about the org changes understand the ins and outs of the develo
  • Qt 如何实现文件类型关联

    何为文件打开关联 比如 一个扩展名为txt的文本 双击之后会调用 notepad exe 进行打开 doc的扩展名会调用word打开等等 咱们今天讲的是如何在Qt所编写的程序实现这个动作 这个关联动作都是记录在注册表中的 1 文件格式注册
  • Matlab函数之ismember,find

    一 ismember函数 1 ismember a b 返回前者是否存在于后者的logical数组 举例 a 1 2 3 4 5 6 b 3 5 6 ismember a b 返回的数组为 0 0 1 0 1 1 ismember b a
  • openldap2.4版本管理员文档中文翻译版

    OpenLDAP2 4管理员指南 文章目录 1 OpenLDAP介绍 2 快速开始指南 1 获得软件 2 解压压缩包 3 阅读文档 4 运行configure 5 编译软件 6 测试编译结果 7 安装软件 8 编辑配置文件 9 导入数据库配
  • 计算机网络 第4章 网络层

    第4章 网络层 网络层 network layer 负责为分组交换网上的不同主机提供通信 在发送数据时 将运输层产生的报文段或用户数据报封装成分组或包进行传送 在TCP IP体系中 分组也叫做IP数据包 或简称为数据报 4 1 网络层的几个
  • 透视投影矩阵的推导

    视锥体 如图 近截面与远截面之间构成的这个四棱台就是视锥体 而透视投影矩阵的任务就是把位于视锥体内的物体的顶点X Y Z坐标映射到 1 1 范围 这就相当于把这个四棱台扭曲变形成一个立方体 这个立方体叫做规则观察体 Canonical Vi