【5】:三维到二维变换(模型、视图、投影)

观测变换

物体上某一点的坐标变换顺序:M->V->P

MVP变换用来描述视图变换的任务,即将虚拟世界中的三维物体映射(变换)到二维坐标中。

1.Model Transformation 模型变换

场景中每个物体上的某一点,从局部坐标系变换到世界坐标系,每个物体有自己独有的模型变换矩阵,代表物体独有的在世界坐标系中的位置。

2.View / Camera Transformation 视图变换

相机在世界坐标系中移动。对同一个相机,所有模型共用一个视图变换矩阵

3.Projection Transformation 投影变换

正交投影:投影区域为一个长方体,远近物体最终在屏幕上显示同等大小

透视投影:投影区域为一个梯台,近、远平面为两个缩放的长方体,四侧边线延迟交于相机,最终显示到屏幕为近大远小

MVP变换

MVP变换,就是Model模型、View观察、Projection投影变换三个单词的缩写。是图形学中将三维空间的物体呈现在二维屏幕上十分重要的三个变换。在学习MVP变换之前,首先要知道几个空间的概念。

视图变换 View / Camera Transformation

需要确定的参数

需要知道相机的位置,相机看向的方向,还需要知道相机的上方向

确定相机的上方向,相当于确定相机在手中拍照时旋转的角度

在变换之前的约定

因为相机与物体之间的相互位置不变时,相机与物体这对组合放在空间中的哪里是无关紧要的

比如相机与物体的位置组合是 (a1, b1) 和 (a2, b2) 这两组,只要 a1 与 b1 之间的相对位置与 a2 与 b2 之间的相对位置是相等的,那么 (a1, b1) 与 (a2, b2) 在相机拍摄出来的效果是一样的

然后有一个约定就是,相机始终在原点,相机始终指向 -Z

因为既然你这对组合在空间中是自由的嘛,所以我给其中一个顶死了,另外一个也定死了

我个人是感觉,为了方便一直处理一个数据对象,可以假设相机始终在

视图变换的步骤

1.将摄像机的中心移动到世界坐标原点

2.将摄像机的前方向 g 转动到世界坐标系的 -Z 方向

3.将摄像机的上方向 t 转动到世界坐标系的 Y 方向

此后,摄像机的右方向 g x t 自然是世界坐标系的 X 方向

要计算这个变换矩阵的具体形式时,分为两个矩阵来写

第一个矩阵是平移矩阵,写在连乘式的最左边

第二个矩阵是旋转矩阵,是 g 到 -Z,t 到 Y,g x t 到 X 的旋转矩阵

平移矩阵很好写,但是这个旋转矩阵不好写

因为是三个任意的轴旋转到三个固定的轴

虽然旋转矩阵不好写,但是这个旋转矩阵的逆矩阵好写

这个旋转矩阵的逆矩阵的意义是,-Z 到 g,Y 到 t,X 到 g x t

正交投影 Orthographic

因为在前面已经把相机的前方向指向了 -Z,那么只要将物体的 Z 坐标丢掉,得到的就是物体在 XY 面上的投影

最后得到的投影结果,约定要缩放到 [-1, 1]

一般性的正交投影的描述

约定要将一个长方体投影到正方体

各个面的描述

l 左边 left

r 右边 right

b 底部 bottom

t 顶部 top

n 近处 near

f 远处 far

在图示的右手系中,与一般的常识不同的是,距离我们比较近的 n 面,z 值比较大,距离我们比较远的 f 面,z 值比较小

opengl 在窗口空间(屏幕空间)中使用的左手系,就是为了方便符合 n 面的 z 值小,f 面的 z 值大

正交投影的变换式

首先是平移矩阵

要计算两个面之间中心,然后在这个面的方向上移动到原点

例如 (r+l)/2 是两个 x 方向上两个面之间的中心,然后 -(r+l)/2 就是把中心移动到 x = 0

然后是缩放矩阵

因为要缩放到的正方体的长度为 2,要覆盖 [-1, 1]。而原来的边长,也就是两个面之间的距离是两个面的坐标值相减

例如 x 方向上,原来的边长是 r-l,现在要缩放到 2,那么就是乘一个 2/(r-l)

透视投影 Perspective Projection

背景

欧式几何中的平行线在透视投影之后会相交

在齐次坐标中,(x,y,z,1), (kx,ky,kz,k) 表示同一个点

因此 (x,y,z,1), (xz,yx,z^2,z) 也表示同一个点

约定

约定与正交投影中类似的近面 n 远面 f

挤压视锥体到长方体的思路

透视投影是非常困难的,如果要直接写出来是不好理解的

好理解的做法呢,首先知道透视投影和正交投影的目标都是类似的,都是将一个区域投影到一个边长为 2 的正方体

假如拿远平面的四个点去挤压到近平面,它们在同一个高度上,它们给挤成一个空间中的长方体,做完这些操作以后就可以看到这些线经过这些正交投影给它投影到了了近平面上去。也就是说,讲透视投影拆成了两半:

1.先把远平面以及中间的这些位置给挤成长方体

2.再做一次正交投影

那么如果进行“挤”呢?有几点需要规定:1.近平面永远不变2.远平面的点z值不变仍然是f,仅仅是在这个平面内向里面收缩3.中心点挤了之后也不会变化

y’和y根据相似三角形得出,对于x也是同理。任何的z

新向量三个值都是已知的

为什么不是新向量的,也就是压缩之后的向量,的第三个维度的值不是保持为 z?

这是一种错觉,之前约定了 near 和 far 面的 z 值不变,就给人了一种感觉是,好像中间的点的 z 在压缩的时候也不会变,实际上是会变的

这个错觉的一个另一个可能的来源是,在计算压缩之后的 x 和 y 的值的时候,我们是使用旧面的 z 来参与相似三角形的计算

但是我使用旧面的 z 只是因为我在 x 和 y 上的变换值与近面是有这个联系的,不代表变换之后旧面不会动

然后我们保持这个新向量的第三个维度的值不知道

就已经可以知道这个变换矩阵的其他值了,就差变换矩阵的第三行不知道了

这一行不知道,所以一般的想法就是待定系数法来解

然后我们已知的条件是,近面和远面都不变,所以我们将近面和远面的点代入这个变换式,就可以解出

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

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

相关文章

YoloV8实战:各种图绘制汇总(mAP50、mAP50-95、loss、PR_curve、F1_curve)|科研必备|绘图神器

摘要 本文的内容是告诉大家如何绘制mAP50、mAP50-95、loss、PR_curve、F1_curve等图像,方便大家写论文。 绘制mAP50、mAP50-95、loss等图。 先上效果,如下图: 首先将,训练的result.csv汇总到一个文件夹下面(这样方便寻找),要不然找起来太麻烦。如下图: 我都放到re…

Pyinstaller打包exe文件解决指南

打包命令 打包 Python 文件 输入如下格式的命令即可 默认命令 Pyinstaller 文件名.py Pyinstaller -option1 -option2 -... 要打包的文件 Pyinstaller 文件名.pyPyinstaller -option1 -option2 -... 要打包的文件 参数选项比较多,这里我列一个表:…

[C#]winform部署官方yolov10目标检测的onnx模型

【框架地址】 https://github.com/THU-MIG/yolov10 【算法介绍】 今天为大家介绍的是 YOLOv10,这是由清华大学研究团队最新提出的,同样遵循 YOLO 系列设计原则,致力于打造实时端到端的高性能目标检测器。 方法 创新 双标签分配策略 众所…

灯塔工厂产业数字化平台解决方案(50页PPT)

方案介绍: 随着工业4.0和智能制造的快速发展,传统工厂正面临着转型升级的迫切需求。为了提升生产效率、优化资源配置、增强市场竞争力,我们推出了灯塔工厂产业数字化平台解决方案。该方案旨在通过先进的信息技术手段,将传统工厂转…

蒙特卡洛法求解机械臂工作空间(以IRB4600型工业机械臂为例)

1. 概念 工作空间是衡量机器人工作能力的一个重要的运动学指标,蒙特卡洛法是一种随机模拟方法,用于在计算机上估计某些统计量,对于要估计的统计量,通过模拟大量的随机抽样,并计算这些样本的随机值来估算这个统计量的值…

数字信号处理实验三:IIR数字滤波器设计及软件实现

一、实验目的 1. 掌握MATLAB中进行IIR模拟滤波器的设计的相关函数的应用; 2. 掌握MATLAB的工具箱中提供的常用IIR数字滤波器的设计函数的应用; 3.掌握MATLAB的工具箱中提供的模拟滤波器转数字滤波器的相关的设计函数的应用。 二、实验内容 本实验为…

CC1310 Debug interface is locked

XDS110连接CC1310板子,打开Smart RF 弹出窗口如下: 解决办法: 1 打开SmartRF Flash Programmer 2 选择连接的设备CC1310, 弹出如下窗口,点击OK。 3 点击Tools图标,选择CC26XX/CC13XX Forced Mass Erase。 4 在弹出的…

Windows11系统安装QEMU虚拟化软件

Windows11系统安装QEMU虚拟化软件 QEMU软件是一个通用的开源机器模拟器和虚拟机。本文档适用于在Windows 11系统平台上安装QEMU软件。 1. 安装准备 1.1 安装平台 Windows 11 1.2. 软件信息 软件名称软件版本安装路径QEMUQEMU-8.2.93D:\qemu 1.3软件下载 QEMU官网官网下…

【全开源】西陆家政系统源码小程序(FastAdmin+ThinkPHP+原生微信小程序)

打造高效便捷的家政服务平台 一、引言:家政服务的数字化转型 随着人们生活节奏的加快,家政服务需求日益增长。为了满足广大用户对高效、便捷的家政服务的需求,家政小程序系统源码应运而生。这款源码不仅能够帮助家政服务提供商快速搭建自己…

关于本人VIP付费文章说明

郑重声明:我写博客只是为了记录分享经验 自从上次写完数据结构系列后我就一直没有登陆,目前也没打算继续开新内容。今天偶然发现我之前写的文章被设为vip文章,要vip解锁才能看,我很确定当初我发布的时候选择的是公开,…

FastGPT + OneAPI 构建知识库

云端text-embedding模型 这个在前面的文章FastGPT私有化部署OneAPI配置大模型中其实已经说过,大概就是部署完成OneAPI后,分别新建令牌和渠道,并完成FastGPT的配置。 新建渠道 选择模型的类型并配置对应的词向量模型即可,这里我…

excel数据丢失怎么办?表格文件恢复的3个方法

Excel作为一个常用的表格文件,我们在工作中经常都需要用到它。最令人崩溃的事就是有时候我们辛辛苦苦用Excel完成了工作,但是突然发现Excel数据丢失。这可怎么办呢?如何找回丢失的Excel数据?下面小编就分享几种恢复办法。 方法一&…

FPGA——eMMC验证

一.FPGA基础 1.FPGA烧录流程 (1) 加载流文件 —— bitfile (2) 烧录文件 —— cmm 二.MMC 1.基础知识 (1)jz4740、mmc、emmc、sd之间的关系? jz4740——处理器 mmc——存储卡标准 emmc——mmc基础上发展的高效存储解决方案 sd—— 三.eMMC和SD case验证 1.ca…

Go 使用 RabbitMQ---------------之一

RabbitMQ 是一种消息代理。消息代理的主要目的是接收、存储并转发消息。在复杂的系统设计和微服务架构中,RabbitMQ 经常被用作中间件来处理和转发系统之间的消息,以确保数据的一致性和可靠性。正是因为提供了可靠的消息机制、跟踪机制和灵活的消息路由,常常被用于排队算法、…

MFC里的工具栏按钮图标如何使用外部图片?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

据库管理-第196期 实战RDMA(20240528)

数据库管理196期 2024-05-28 数据库管理-第196期 实战RDMA(20240528)1 环境2 操作系统配置3 配置NVMe over RDMA4 挂载磁盘处理并挂载磁盘: 5 RDMA性能测试6 iSCSI部署7 iSCSI性能测试8 性能对比总结 数据库管理-第196期 实战RDMA&#xff08…

Transformer 从attention到grouped query attention (GQA)

Attention原理和理解 attention原理参考: Attention Is All You Need The Illustrated Transformer – Jay Alammar – Visualizing machine learning one concept at a time. Transformer图解 - 李理的博客 Attention首先对输入x张量乘以WQ, WK, WV得到query,…

软件程序设计规范(代码编写规范文档)-word下载

程序的编码是一个创造性极强的工作,必须要遵守一定的规则和限制,编码风格的重要性对软件项目开发来说是不言而喻的。 开发工程师在开发过程中必须遵守本规范,规范是代码编写及代码验收等管理环节中必须执行的标准。 编制基本原则:…

169. 多数元素

题目 解答 方法一:Boyer-Moore 投票算法 class Solution {func majorityElement(_ nums: [Int]) -> Int {var candidate 0var count 0for num in nums {if count 0 {candidate numcount 1} else {if candidate num {count 1} else {count - 1}}}return …

计算机毕业设计hadoop+spark+hive物流大数据分析平台 物流预测系统 物流信息爬虫 物流大数据 机器学习 深度学习

流程: 1.Python爬虫采集物流数据等存入mysql和.csv文件; 2.使用pandasnumpy或者MapReduce对上面的数据集进行数据清洗生成最终上传到hdfs; 3.使用hive数据仓库完成建库建表导入.csv数据集; 4.使用hive之hive_sql进行离线计算&…