当前位置: 首页 > news >正文

图形学初识--屏幕空间变换

文章目录

  • 前言
  • 正文
    • 为什么需要屏幕空间变换?
    • 什么是屏幕空间变换?
    • 屏幕空间变换矩阵如何推导?
      • 问题描述
      • 步骤描述
  • 结尾:喜欢的小伙伴点点关注+赞哦!

前言

前面章节主要讲解了视图变换和投影变换,此时距离在屏幕空间显示也就只差一步之遥了,只需要将NDC坐标转换为屏幕空间坐标即可!有了前面一些章节的学习,相信大家对于本章节的学习还是很容易的!

正文

为什么需要屏幕空间变换?

因为经过了视图变换和投影变换后,咱们已经将所有的顶点坐标转换成了NDC坐标,也就是x/y/z的范围都在 [ − 1 , 1 ] [-1,1] [1,1] 的坐标,但是正常咱们得电脑屏幕的XY坐标范围一般都是 [ 0 , w i d t h − 1 ] × [ 0 , h e i g h t − 1 ] [0,width-1] \times [0, height-1] [0,width1]×[0,height1] ,所以咱们需要屏幕空间变换!

什么是屏幕空间变换?

本质上和之前的视图变换、投影变换并无不同,就是一个矩阵罢了!

屏幕空间变换矩阵如何推导?

问题描述

将x坐标由 [ − 1 , 1 ] [-1,1] [1,1] 变换为 $ [0,screen_width - 1]$ ,将y坐标由 [ − 1 , 1 ] [-1,1] [1,1] 变换为 $ [0,screen_height - 1]$ ,将z坐标由 [ − 1 , 1 ] [-1,1] [1,1] 变换为 $ [0,1]$​.

如下图所示:

在这里插入图片描述

步骤描述

步骤1:将xyz坐标变换到 [ 0 , 1 ] [0,1] [0,1] 的范围

步骤2:将xy坐标缩放至 [ 0 , s c r e e n w i d t h − 1 ] × [ 0 , s c r e e n h e i g h t − 1 ] [0, screen_width - 1] \times [0, screen_height - 1] [0,screenwidth1]×[0,screenheight1]

咱们先思考下步骤1如何实现呢?当前的xyz坐标范围为 [ − 1 , 1 ] [-1,1] [1,1] ,目标的坐标范围为 [ 0 , 1 ] [0,1] [0,1] ,如何做呢?

这时候其实咱们分两步:

第一步:将 [ − 1 , 1 ] [-1,1] [1,1] 缩放至 [ − 0.5 , 0.5 ] [-0.5,0.5] [0.5,0.5] 的范围。

第二步:将 [ − 0.5 , 0.5 ] [-0.5,0.5] [0.5,0.5] 沿着对应轴轴方向移动0.5单位即可。

于是咱们分别得到缩放矩阵和平移矩阵如下:
S = [ 0.5 0 0 0 0 0.5 0 0 0 0 0.5 0 0 0 0 1 ] S = \begin{bmatrix} 0.5&0&0&0\\ 0&0.5&0&0\\ 0&0&0.5&0\\ 0&0&0&1\\ \end{bmatrix} S= 0.500000.500000.500001

T = [ 0 0 0 0.5 0 0 0 0.5 0 0 0 0.5 0 0 0 1 ] T = \begin{bmatrix} 0&0&0&0.5\\ 0&0&0&0.5\\ 0&0&0&0.5\\ 0&0&0&1\\ \end{bmatrix} T= 0000000000000.50.50.51

于是咱们只需要将两者相乘,即可获得相应的结果:
M 1 = T ∗ S = [ 0.5 0 0 0.5 0 0.5 0 0.5 0 0 0.5 0.5 0 0 0 1 ] M_1 = T * S = \begin{bmatrix} 0.5&0&0&0.5\\ 0&0.5&0&0.5\\ 0&0&0.5&0.5\\ 0&0&0&1\\ \end{bmatrix} M1=TS= 0.500000.500000.500.50.50.51

然后咱们思考下步骤二,当前的xy坐标范围为: [ 0 , 1 ] [0,1] [0,1] ,目标范围为 $[0,screen_width-1] 和 [0,screen_height-1] $

这个问题也就只是个xy轴的缩放问题而已,很容易得到以下缩放矩阵:
M 2 = [ s c r e e n _ w i d t h 0 0 0 0 s c r e e n _ h e i g h t 0 0 0 0 1 0 0 0 0 1 ] M_2 = \begin{bmatrix} screen\_width&0&0&0\\ 0&screen\_height&0&0\\ 0&0&1&0\\ 0&0&0&1\\ \end{bmatrix} M2= screen_width0000screen_height0000100001

然后咱们将步骤一的结果和步骤二的结果结合起来即可得到最终的屏幕空间变换矩阵,如下:
M s c r e e n = M 2 ∗ M 1 = M 2 = [ 0.5 ∗ s c r e e n _ w i d t h 0 0 0.5 ∗ s c r e e n _ w i d t h 0 0.5 ∗ s c r e e n _ h e i g h t 0 0.5 ∗ s c r e e n _ h e i g h t 0 0 0.5 0.5 0 0 0 1 ] M_{screen}= M_2 * M_1 = M_2 = \begin{bmatrix} 0.5*screen\_width&0&0&0.5*screen\_width\\ 0&0.5*screen\_height&0&0.5*screen\_height\\ 0&0&0.5&0.5\\ 0&0&0&1\\ \end{bmatrix} Mscreen=M2M1=M2= 0.5screen_width00000.5screen_height00000.500.5screen_width0.5screen_height0.51

于是大功告成啦!咱们成功的将NDC坐标转换成了屏幕空间坐标!

结尾:喜欢的小伙伴点点关注+赞哦!

你们的点赞就是我创作的最大动力!希望对各位小伙伴能够有所帮助哦,永远在学习的道路上伴你而行, 我是航火火,火一般的男人!

相关文章:

图形学初识--屏幕空间变换

文章目录 前言正文为什么需要屏幕空间变换?什么是屏幕空间变换?屏幕空间变换矩阵如何推导?问题描述步骤描述 结尾:喜欢的小伙伴点点关注赞哦! 前言 前面章节主要讲解了视图变换和投影变换,此时距离在屏幕空间显示也就…...

爬楼梯 - LeetCode 热题 81

大家好!我是曾续缘😇 今天是《LeetCode 热题 100》系列 发车第 81 天 动态规划第 1 题 ❤️点赞 👍 收藏 ⭐再看,养成习惯 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法…...

详解 Spark 核心编程之 RDD 分区器

一、RDD 分区器简介 Spark 分区器的父类是 Partitioner 抽象类分区器直接决定了 RDD 中分区的个数、RDD 中每条数据经过 Shuffle 后进入哪个分区,进而决定了 Reduce 的个数只有 Key-Value 类型的 RDD 才有分区器,非 Key-Value 类型的 RDD 分区的值是 No…...

Selenium番外篇文本查找、元素高亮、截图、无头运行

Selenium根据文本查找元素 ​ python def find_element_with_text(self, loc, attribute, text):try:WebDriverWait(self.driver, 5).until(EC.all_of(EC.text_to_be_present_in_element_attribute(loc, attribute, text)))element self.driver.find_element(*loc)if isinsta…...

Java 22的FFM API,比起Java 21的虚拟线程

哪个对Java未来的发展影响更大?两个 Java 版本中的重要特性:Java 21 的虚拟线程和 Java 22 的 FFM API。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给…...

用c语言实现简易三子棋

本篇适用于C语言初学者。 目录 完整代码&#xff1a; 分步介绍&#xff1a; 声明&#xff1a; 代码主体部分&#xff1a; 模块功能实现&#xff1a; 完整代码&#xff1a; #include<stdio.h> #include <stdlib.h> #include <time.h>#define ROW 3 #d…...

2024年华为OD机试真题-执行时长-Python-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述: 为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务,假设GPU最多一次执行n个任务,一次执…...

对未知程序所创建的 PDF 文档的折叠书签层级全展开导致丢签的一种解决方法

对需要经常查阅、或连续长时间阅读的带有折叠书签的 PDF 文档展开书签层级&#xff0c;提高阅览导航快捷是非常有必要的。 下面是两种常用书签层级全展开的方法 1、 FreePic2Pdf 1 - 2 - 3 - 4 - 5 - 6&#xff0c;先提取后回挂 2、PdgCntEditor 载入后&#xff0c;直接保存…...

计算机系统结构之FORK和JOIN

程序语言中用FORK语句派生并行任务&#xff0c;用JOIN语句对多个并发任务汇合。 FORK语句的形式为FORK m&#xff0c;其中m为新领程开始的标号。 JOIN语句的形式为JOIN n&#xff0c;其中n为并发进程的个数。 例1&#xff1a;给定算术表达式ZEA*B*C/DF经并行编译得到如下程序…...

Yocto - virtual/kernel介绍

在 Yocto 项目中&#xff0c;"virtual/kernel "是一个虚拟目标&#xff0c;作为 Linux 内核的抽象层。它是一种以灵活方式指定内核依赖关系的方法&#xff0c;允许实际的内核配方由特定构建中使用的机器配置和层决定。 下面是关于 "virtual/kerne"的含义和…...

如何在 DigitalOcean 云服务器上创建自定义品牌名称服务器

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 对于托管提供商或转售商来说&#xff0c;拥有自定义的名称服务器可以为客户提供更专业的外观。这消除了要求客户将其域名指向另一…...

心链6----开发主页以及后端数据插入(多线程并发)定时任务

心链 — 伙伴匹配系统 开发主页 信息搜索页修改 主页开发&#xff08;直接list用户&#xff09; 在后端controller层编写接口去实现显示推荐页面的功能 /*** 推荐页面* param request* return*/GetMapping("/recommend")public BaseResponse<List<User>&…...

【Linux】日志管理

一、日志进程 1、处理日志的进程 rsyslogd&#xff1a;系统专职日志程序 观察rsyslogd程序&#xff1a; ps aux | grep rsyslogd 2、常见的日志文件 1、系统主日志文件: /var/log/messages 动态查看日志文件尾部&#xff1a; tail -f /var/log/messages 2、安全…...

AI 绘画爆火背后:扩散模型原理及实现

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…...

详解智慧互联网医院系统源码:开发医院小程序教学

本篇文章&#xff0c;笔者将详细介绍智慧互联网医院系统的源码结构&#xff0c;并提供开发医院小程序的详细教学。 一、智慧互联网医院系统概述 智慧互联网医院系统涵盖了预约挂号、在线咨询、电子病历、药品管理等多个模块。 二、系统源码结构解析 智慧互联网医院系统的源码…...

【技术实操】银河高级服务器操作系统实例分享,数据库日志文件属主不对问题分析

1. 问题现象描述 2023 年 06 月 30 日在迁移数据库过程中&#xff0c;遇到数据库 crash 的缺陷&#xff0c;原因如下&#xff1a;在数据库启动时候生成的一组临时文件中&#xff0c;有 owner 为 root 的文件&#xff0c; 文件权限默认为 640&#xff0c; 当数据库需要使用的时…...

函数的创建和调用

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 提到函数&#xff0c;大家会想到数学函数吧&#xff0c;函数是数学最重要的一个模块&#xff0c;贯穿整个数学学习过程。在Python中&#xff0c;函数…...

数模混合芯片设计中的修调技术是什么?

一、修调目的 数模混合芯片需要修调技术主要是因为以下几个原因&#xff1a; 工艺偏差&#xff08;Process Variations&#xff09;&#xff1a; 半导体制造过程中存在不可避免的工艺偏差&#xff0c;如晶体管尺寸、阈值电压、电阻和电容值等&#xff0c;这些参数的实际值与…...

MySQL 自定义函数(实验报告)

一、实验名称&#xff1a; 自定义函数 二、实验日期&#xff1a; 2024年 6 月 1 日 三、实验目的&#xff1a; 掌握MySQL自定义函数的创建及调用&#xff1b; 四、实验用的仪器和材料&#xff1a; 硬件&#xff1a;PC电脑一台&#xff1b; 配置&#xff1a;内存&#…...

一次职业院校漏洞挖掘

这个是之前挖掘到的漏洞&#xff0c;目前网站进行重构做了全新的改版&#xff0c;但是这个漏洞特别经典&#xff0c;拿出来进行分享。看到src上面的很多敏感信息泄露&#xff0c;所以自己也想找一个敏感信息泄露&#xff0c;官网如图&#xff1a; 发现在下面有一个数字校园入口…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...