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

news2024/12/24 13:37:19

观测变换

物体上某一点的坐标变换顺序: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.coloradmin.cn/o/1711282.html

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

相关文章

长安杯2021年wp

背景: 2021年4月25日,上午8点左右,警方接到被害人金某报案,声称自己被敲诈数万元;经询问,昨日金某被嫌疑人诱导裸聊,下载了某“裸聊”软件,导致自己的通讯录和裸聊视频被嫌疑人获取…

Defog发布Llama-3-SQLCoder-8B,文本转SQL模型,性能比肩GPT-4,准确率超90%,消费级硬件可运行

前言 在计算语言学领域,将自然语言转化为可执行的SQL查询是一个重要的研究方向。这对于让那些没有编程或SQL语法知识的用户也能轻松访问数据库信息至关重要。Defog团队近日发布了基于Llama-3的SQLCoder-8B模型,它在文本转SQL模型领域取得了显著突破&…

PS:电子书App自动截图后合成一个PDF文档

说明:有的电子书App不能下载到本地,通过自动截图后合成一个PDF文档来解决! 一、自动截图App 1.安装”免ROOT自动化助手“ 2.创建一个任务 3.编辑任务:根据电子书的操作顺序制定,400次就是书籍页数(次数一…

2024年下半年自考报名信息汇总

2024年下半年自考报名信息汇总,报名详细流程如下图所示:

c#对操作系统的时间无法更新?

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

Apache Pulsar 中文社区有奖问卷调查(2024 上半年度)

Apache Pulsar 中文社区有奖问卷调查(2024 上半年度) 📣 📣 📣 Hi,Apache Pulsar 社区的小伙伴们,社区 2024 上半年度的有奖问卷调查来啦! 🙌 本次调查旨在了解用户使用 …

Windows10(家庭版)中DockerDesktop(docker)的配置、安装、修改镜像源、使用

场景 Windows10中Docker的安装与遇到的那些坑: Windows10中Docker的安装与遇到的那些坑_在 docker.core.logging.httpclientexceptionintercept-CSDN博客 上面讲Docker Desktop在windows10非家庭版上的安装,如果是家庭版,则需要执行如下步骤。 注&am…

ubuntu中idea创建spark项目步骤

1.前置条件 ubuntu中已经安装idea,jdk,scala,spark 2.打开idea,新建,选择Maven项目 3.在IDEA中,File-Setting-Plugin,下载Scala插件 4.File-project structure,导入插件 4.1在全局库中,选择导入刚才的sca…

LLC开关电源开发:第一节,LLC原理概述

第一节,LLC原理概述文章目录 一、LLC概述二、LLC电路拓扑1.电路拓扑2.电路工作原理3.电路原理分析 总结 一、LLC概述 LLC电路,是一种通过控制开关频率(频率调节)来实现输出电压恒定的谐振电路,它包括一个电感L、一个电…

【对算法期中卷子的解析和反思】

一、程序阅读并回答问题&#xff08;共30分&#xff09; #include<cstdio>#include<cstring>#include<iostream>using namespace std;char chess[10][10];int sign[10];int n, k, ans;void dfs(int x, int k) { if (k 0){ans;return; } if (xk-1 >…

C++网络编程——socket

在服务器中&#xff0c;需要建立一个socket套接字才能对外提供一个网络通信接口&#xff0c;在Linux系统中套接字仅是一个文件描述符&#xff0c;也就是一个int类型的值 socket概念 socket 的原意是“插座”&#xff0c;在计算机通信领域&#xff0c;socket 被翻译为“套接字…

HCIP-Datacom-ARST自选题库__BGP/MPLS IP VPN简答【3道题】

1.在BGP/MPLSIPVPN场景中&#xff0c;如果PE设备收到到达同一目的网络的多条路由时&#xff0c;将按照定的顺序选择最优路由。请将以下内容按照比较顺序进行排序。 2.在如图所示的BGP/MPLSIP VPN网络中&#xff0c;管理员准备通过Hub-Spoke组网实现H站点对VPM流量的集中管控&am…

1.2数学基础

向量运算 矩阵运算 比较基础就不记录了 MVP矩阵推导 1.讲为什么要有矩阵变换和不同的坐标空间 将3D物体转化到2D平面为各个空间的运用做准备 2.介绍各个空间的概念和含义 MVP矩阵代表什么&#xff1f; MVP矩阵分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。…

Pycharm中如何引入gitee?

1、在Pycharm中打开settings&#xff0c;找到plugins&#xff0c;搜索gitee&#xff0c;点击install&#xff0c;点击ok即可。 2、下载安装好后&#xff0c;选择VCS&#xff0c;找到Get from version Control。 3、通过ssh公钥方式登录&#xff0c;ssh公钥可以gitee上获取 4、…

跨境电商拓海新策略:智能小家电遇全球机遇与挑战

全球化与互联网普及背景下&#xff0c;跨境电商成为企业拓展海外市场的重要途径。智能小家电以其创新性和实用性&#xff0c;逐渐成为跨境电商热门品类。面对全球市场的机遇与挑战&#xff0c;跨境电商企业需要深思如何制定有效的拓海新策略。 首先&#xff0c;智能小家电在全球…

IC开发——VCS基本用法

1. 简介 VCS是编译型verilog仿真器&#xff0c;处理verilog的源码过程如下&#xff1a; VCS先将verilog/systemverilog文件转化为C文件&#xff0c;在linux下编译链接生成可执行文件&#xff0c;在linux下运行simv即可得到仿真结果。 VCS使用步骤&#xff0c;先编译verilog源…

HT46R002 贴片 SOP8 经济型AD型OTP MCU单片机芯片

HT46R002在智能家居中的具体应用案例可以包括以下几个方面&#xff1a; 1. 智能照明控制&#xff1a;可以用于控制LED灯的亮度和色温&#xff0c;甚至可以通过手机APP远程控制开关和调节灯光效果。 2. 环境监测&#xff1a;用于监测室内温度、湿度、空气质量等&#xff0c;当检…

【busybox记录】【shell指令】ln

目录 内容来源&#xff1a; 【GUN】【ln】指令介绍 【busybox】【ln】指令介绍 【linux】【ln】指令介绍 使用示例&#xff1a; 创建链接文件 - 链接文件&#xff08;默认 - 硬链接&#xff09; 创建链接文件 - 链接文件&#xff08;软链接&#xff09; 创建链接文件 -…

李廉洋:5.29黄金震荡,原油持续走高,今日美盘行情走势分析及策略。

黄金消息面分析&#xff1a;当前美国存在一个令人担忧且未被充分关注的问题&#xff1a;房地产行业低迷、高利率和抵押贷款利率、租金高涨以及美联储的紧缩政策构成了一个恶性循环。由于高房价和高抵押贷款利率&#xff0c;美国住房经济活动远低于两年前的水平。为了让该行业好…

Android ANR Trace日志阅读分析技巧

什么是Trace日志 Trace日志是指ANR目录下的一份txt文件 adb pull /data/anr/traces.txt Trace日志有什么用 分析应用ANR无响应的问题&#xff0c; Trace怎么用 Cmd line: com.xx ABI: arm Build type: optimized Zygote loaded classes3682 post zygote classes3750 Intern…