Unity中Shader裁剪空间推导(正交相机到裁剪空间的转化矩阵)

文章目录

  • 前言
  • 一、正交相机视图空间 转化到 裁剪空间 干了什么
    • 1、正交相机裁剪的范围主要是这个方盒子
    • 2、裁剪了之后,需要把裁剪范围内的坐标值化到[-1,1]之间,这就是我们的裁剪空间。
    • 3、在Unity中,设置相机为正交相机
    • 4、在这里设置相机的近裁剪面和远裁剪面
  • 二、把正交相机的方盒子内的坐标 转化到 裁剪空间
    • 1、我们在Unity创建两个游戏对象来解释
    • 2、正交相机坐标 到 裁剪坐标 的映射关系
    • 3、化简X轴坐标
    • 4、化简Y轴坐标
    • 5、化简Z坐标(OpenGL下 [-1,1])
    • 6、化简Z坐标(DirectX下 [0,1])
  • 三、把转化后的坐标转化为矩阵
    • 1、OpenGL下
    • 2、DirectX


前言

我们把顶点坐标信息转化为裁剪空间。有可能使用到正交相机信息 或 透视相机。我们在这篇文章中,推导一下正交相机视图空间下的坐标转化到裁剪空间的矩阵。

在这里插入图片描述

  • 本地空间->世界空间->观察空间->裁剪空间->屏幕映射

一、正交相机视图空间 转化到 裁剪空间 干了什么

1、正交相机裁剪的范围主要是这个方盒子

  • 因为使用的是右手坐标系。所以,摄像机的Z轴正方向是在X轴正方向右侧的。

在这里插入图片描述

2、裁剪了之后,需要把裁剪范围内的坐标值化到[-1,1]之间,这就是我们的裁剪空间。

  • 在不同平台下裁剪空间的X 和 Y轴范围都是[-1,1]
  • OpenGL下,Z范围[-1,1]
  • DirectX下,Z范围[0,1]
    在这里插入图片描述

3、在Unity中,设置相机为正交相机

  • Unity视图窗口使用了左手坐标系,Z轴正方向 在 X轴正方向左侧。但是,我们计算使用的是右手坐标系,这里需要注意。
    在这里插入图片描述

4、在这里设置相机的近裁剪面和远裁剪面

在这里插入图片描述


二、把正交相机的方盒子内的坐标 转化到 裁剪空间

1、我们在Unity创建两个游戏对象来解释

在这里插入图片描述

  • 我们的绿线Cube相当于我们的裁剪空间
  • 我们的大长方体相当于世界空间下的游戏对象
  • 当我们进行转化时,对大长方体进行缩放、平移即可转化到裁剪空间

2、正交相机坐标 到 裁剪坐标 的映射关系

在这里插入图片描述

  • l ≤ x ≤ r l \leq x \leq r lxr 化为 -1 ≤ x ≤ \leq x \leq x 1
  • b ≤ y ≤ t b \leq y \leq t byt 化为 -1 ≤ x ≤ \leq x \leq x 1
  • f ≤ z ≤ n f\leq z \leq n fzn 化为 -1 ≤ x ≤ \leq x \leq x 1

3、化简X轴坐标

l ≤ x ≤ r l \leq x \leq r lxr

l − l ≤ x − l ≤ r − l l - l \leq x - l \leq r - l llxlrl

0 ≤ x − l ≤ r − l 0 \leq x - l \leq r - l 0xlrl

0 ≤ x − l 2 r − l ≤ r − l 2 r − l 0 \leq x - l \frac{2}{r - l} \leq r - l \frac{2}{r - l} 0xlrl2rlrl2

0 ≤ 2 x − 2 l r − l ≤ 2 0 \leq \frac{2x - 2l }{r - l} \leq 2 0rl2x2l2

− 1 ≤ 2 x − 2 l r − l − 1 ≤ 1 -1 \leq \frac{2x - 2l }{r - l} - 1\leq 1 1rl2x2l11

− 1 ≤ 2 x − 2 l r − l − r − l r − l ≤ 1 -1 \leq \frac{2x - 2l }{r - l} - \frac{r - l}{r - l}\leq 1 1rl2x2lrlrl1

− 1 ≤ 2 x − l − r r − l ≤ 1 -1 \leq \frac{2x - l -r }{r - l} \leq 1 1rl2xlr1

  • l = − r , r = − l l = -r,r = -l l=r,r=l
    我们在Unity中看出,我们的正交相机是处于裁剪面中央的。
    所以,我们的裁剪面x、y坐标,在摄像机空间下,是对称的。所以 r 和 l 是相反数。

    在这里插入图片描述

− 1 ≤ 2 x − ( − r ) − r r − ( − r ) ≤ 1 -1 \leq \frac{2x - (-r) -r }{r - (-r)} \leq 1 1r(r)2x(r)r1

− 1 ≤ 2 x 2 r ≤ 1 -1 \leq \frac{2x}{2r} \leq 1 12r2x1

  • w = 2 l = 2 r w = 2l = 2r w=2l=2r

(w为我们正交相机方盒子的宽,我们这里先假设为w。可以通过屏幕像素相除得到屏幕高宽比。然后,乘以h即可得到宽)

我们已知的是:
正交相机方盒子的高 Size(等于Unity单位值的2倍)
正交相机的近远裁剪面(Z值)

在这里插入图片描述
在这里插入图片描述

− 1 ≤ 2 x w ≤ 1 -1 \leq \frac{2x}{w} \leq 1 1w2x1

4、化简Y轴坐标

b ≤ y ≤ t b \leq y \leq t byt

b − b ≤ y − b ≤ t − b b - b\leq y - b \leq t - b bbybtb

0 ≤ y − b ≤ t − b 0\leq y - b \leq t - b 0ybtb

0 ≤ y − b 2 t − b ≤ t − b 2 t − b 0\leq y - b\frac{2}{t - b} \leq t - b\frac{2}{t - b} 0ybtb2tbtb2

0 ≤ 2 y − 2 b t − b ≤ 2 0\leq \frac{2y - 2b}{t - b} \leq 2 0tb2y2b2

− 1 ≤ 2 y − 2 b t − b − 1 ≤ 1 -1\leq \frac{2y - 2b}{t - b} - 1\leq 1 1tb2y2b11

− 1 ≤ 2 y − 2 b t − b − t − b t − b ≤ 1 -1\leq \frac{2y - 2b}{t - b} - \frac{t - b}{t - b}\leq 1 1tb2y2btbtb1

− 1 ≤ 2 y − b − t t − b ≤ 1 -1\leq \frac{2y - b - t}{t - b}\leq 1 1tb2ybt1

  • b = − t , b = − t b = -t,b = -t b=t,b=t
    我们在Unity中看出,我们的正交相机是处于裁剪面中央的。
    所以,我们的裁剪面x、y坐标,在摄像机空间下,是对称的。所以 b 和 t 是相反数。

    在这里插入图片描述

− 1 ≤ 2 y − ( − t ) − t t − ( − t ) ≤ 1 -1\leq \frac{2y - (-t) - t}{t - (-t)}\leq 1 1t(t)2y(t)t1

− 1 ≤ 2 y + t − t t + t ≤ 1 -1\leq \frac{2y + t - t}{t + t}\leq 1 1t+t2y+tt1

− 1 ≤ 2 y 2 t ≤ 1 -1\leq \frac{2y}{2t}\leq 1 12t2y1

  • h = 2 b = 2 t h = 2b = 2t h=2b=2t

(h为我们正交相机方盒子的高,这里先假设h代替)

− 1 ≤ 2 y h ≤ 1 -1\leq \frac{2y}{h}\leq 1 1h2y1

5、化简Z坐标(OpenGL下 [-1,1])

在这里插入图片描述
因为我们观察空间是右手坐标系。但是,我们裁剪空间是左手坐标系。所以,这里需要化简的式子需要变化一下。(左手坐标系Z轴正方向与上图相反)

  • f ≤ z ≤ n f\leq z \leq n fzn 变为 − n ≤ z ≤ − f -n\leq z \leq -f nzf

− n ≤ z ≤ − f -n\leq z \leq -f nzf

0 ≤ z + n ≤ n − f 0\leq z + n \leq n-f 0z+nnf

0 ≤ z + n 2 n − f ≤ n − f 2 n − f 0\leq z + n \frac{2}{n - f} \leq n - f \frac{2}{n - f} 0z+nnf2nfnf2

0 ≤ 2 z + 2 n n − f ≤ 2 0\leq \frac{2z + 2n}{n - f} \leq 2 0nf2z+2n2

− 1 ≤ 2 z + 2 n n − f − n − f n − f ≤ 1 -1\leq \frac{2z + 2n}{n - f} - \frac{n-f}{n-f}\leq 1 1nf2z+2nnfnf1

− 1 ≤ 2 z + n + f n − f ≤ 1 -1\leq \frac{2z + n + f}{n - f} \leq 1 1nf2z+n+f1

− 1 ≤ 2 z + n + f n − f ≤ 1 -1\leq \frac{2z + n + f}{n - f} \leq 1 1nf2z+n+f1

  • 化简为线性式,方便后面把式子化为矩阵

− 1 ≤ 2 z n − f + n + f n − f ≤ 1 -1\leq \frac{2z}{n - f} + \frac{n+f}{n-f} \leq 1 1nf2z+nfn+f1

6、化简Z坐标(DirectX下 [0,1])

在这里插入图片描述
因为我们观察空间是右手坐标系。但是,我们裁剪空间是左手坐标系。所以,这里需要化简的式子需要变化一下。(左手坐标系Z轴正方向与上图相反)

  • f ≤ z ≤ n f\leq z \leq n fzn 变为 − n ≤ z ≤ − f -n\leq z \leq -f nzf

− n ≤ z ≤ − f -n \leq z \leq -f nzf

0 ≤ z + n ≤ n − f 0 \leq z + n\leq n -f 0z+nnf

0 ≤ z + n 1 n − f ≤ 1 0 \leq z+n \frac{1}{n-f} \leq 1 0z+nnf11

0 ≤ z + n n − f ≤ 1 0 \leq \frac{z+n }{n-f} \leq 1 0nfz+n1

  • 化简为线性式,方便后面把式子化为矩阵

0 ≤ z n − f + n n − f ≤ 1 0 \leq \frac{z}{n-f} + \frac{n}{n-f}\leq 1 0nfz+nfn1


三、把转化后的坐标转化为矩阵

  • X
    − 1 ≤ 2 x w ≤ 1 -1 \leq \frac{2x}{w} \leq 1 1w2x1

  • Y
    − 1 ≤ 2 y h ≤ 1 -1\leq \frac{2y}{h}\leq 1 1h2y1

  • Z(OpenGL)
    − 1 ≤ 2 z n − f + n + f n − f ≤ 1 -1\leq \frac{2z}{n - f} + \frac{n+f}{n-f} \leq 1 1nf2z+nfn+f1

  • Z(DirectX)
    0 ≤ z n − f + n n − f ≤ 1 0 \leq \frac{z}{n-f} + \frac{n}{n-f}\leq 1 0nfz+nfn1

1、OpenGL下

[ 2 w 0 0 0 0 2 h 0 0 0 0 2 n − f n + f n − f 0 0 0 1 ] \begin{bmatrix} \frac{2}{w} & 0 & 0 & 0 \\ 0 & \frac{2}{h} & 0 &0\\ 0 & 0 & \frac{2}{n -f} &\frac{n + f}{n - f}\\ 0 & 0 & 0 & 1\\ \end{bmatrix} w20000h20000nf2000nfn+f1

2、DirectX

[ 2 w 0 0 0 0 2 h 0 0 0 0 1 n − f n n − f 0 0 0 1 ] \begin{bmatrix} \frac{2}{w} & 0 & 0 & 0 \\ 0 & \frac{2}{h} & 0 &0\\ 0 & 0 & \frac{1}{n -f} &\frac{n}{n - f}\\ 0 & 0 & 0 & 1\\ \end{bmatrix} w20000h20000nf1000nfn1

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

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

相关文章

[足式机器人]Part2 Dr. CAN学习笔记-Ch00 - 数学知识基础

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Ch00 - 数学知识基础 1. Ch0-1矩阵的导数运算1.1标量向量方程对向量求导,分母布局,分子布局1.1.1 标量方程对向量的导数1.1.2 向量方程对向量的导数 1.2 案例分析&#xf…

Chrome插件精选 — 前端工具

Chrome实现同一功能的插件往往有多款产品,逐一去安装试用耗时又费力,在此为某一类型插件挑选出比较好用的一款或几款,尽量满足界面精致、功能齐全、设置选项丰富的使用要求,便于节省一个个去尝试的时间和精力。 1. FeHelper(前端助…

【网络协议】远程登录安全连接协议SSH(Secure Shell)

文章目录 什么是SSH协议?SSH为何是安全的?SSH由哪些组件构成?SSH可以帮助实现的功能SSH的工作原理SSH的历史版本常用的SSH工具有哪些SSH配置案例参考Windows 安装SSHUbuntu系统SSH配置Cisco Switch SSH配置华为Switch SSH配置 客户端启用SSH连…

WPF 消息日志打印帮助类:HandyControl+NLog+彩色控制台打印

文章目录 前言相关文章Nlog配置HandyControl配置简单使用显示效果文本内容 前言 我将简单的HandyControl的消息打印系统和Nlog搭配使用,简化我们的代码书写 相关文章 .NET 控制台NLog 使用 WPF-UI HandyControl 控件简单实战 C#更改控制台文字输出颜色 Nlog配置 …

vue中 ref 和 reactive 的区别与联系

官方原文:Vue3 建议使用 ref() 作为声明响应式状态的主要API。 ref 用于将基本类型的数据(如字符串、数字,布尔值等)和引用数据类型(对象) 转换为响应式数据。使用 ref 定义的数据可以通过 .value 属性访问和修改。reactive 用于…

什么是数据可视化?数据可视化的流程与步骤

前言 数据可视化将大大小小的数据集转化为更容易被人脑理解和处理的视觉效果。可视化在我们的日常生活中非常普遍,但它们通常以众所周知的图表和图形的形式出现。正确的数据可视化以有意义和直观的方式为复杂的数据集提供关键的见解。 数据可视化定义 数据可视化…

PYTHON基础:最小二乘法

最小二乘法的拟合 最小二乘法是一种常用的统计学方法,用于通过在数据点中找到一条直线或曲线,使得这条直线或曲线与所有数据点的距离平方和最小化。在线性回归中,最小二乘法被广泛应用于拟合一条直线与数据点之间的关系。 对于线性回归&…

从企业级负载均衡到云原生,深入解读F5

上世纪九十年代,Internet快速发展催生了大量在线网站,Web访问量迅速提升。在互联网泡沫破灭前,这个领域基本是围绕如何对Web网站进行负载均衡与优化。从1997年F5发布了BIG-IP,到快速地形成完整ADC产品线,企业级负载均衡…

51单片机(STC8)-- 串口配置及串口重定向(printf)

文章目录 STC8串口概述串口寄存器配置串口1控制寄存器SCON串口1数据寄存器SBUF串口1模式 1工作方式串口1波特率计算方式 串口注意事项串口1通信demo串口重定向 STC8串口概述 由下图可知STC8H3K64S4带有4个4个串行通信接口,芯片名后两位S所带的数字即代表这款芯片带…

echarts自定义鼠标移上去显示,自定义图例,自定义x轴显示

提示:记录一下echarts常用配置,以免后期忘记 1.自定义鼠标移上去效果 tooltip: { show: true, trigger: "axis", axisPointer: { type: "shadow",//默认自定义效果 }, // //自定义鼠标移上去效果 formatter: (v) > { console.log("打印…

IDEA使用之打包Jar,指定main方法

前言 在某些场景,可能会遇到将非Spring项目打包的情况,我们不需要Tomcat服务器部署,只需要执行指定的main方法即可,这种情况打包成jar就比较方便了。 操作步骤 打包结果默认在项目的out目录下 使用 java -jar xxx.jar

Python 爬虫之下载歌曲(二)

获取深夜emo云歌单信息 文章目录 获取深夜emo云歌单信息前言一、基本流程二、代码编写1.基本要素代码2.获取歌名和链接信息3.获取歌曲的作者信息4.将上面三个列表遍历保存 三、效果展示 前言 换个平台,爬歌深夜网抑云平台的歌单的相关信息,关于作者、歌…

阿里云OpenSearch-LLM智能问答故障的一天

上周五使用阿里云开放搜索问答版时,故障了一整天,可能这个服务使用的人比较少,没有什么消息爆出来,特此记录下这几天的阿里云处理过程,不免让人怀疑阿里云整体都外包出去了,反应迟钝,水平业余&a…

【JavaWeb学习笔记】16 - JSon和Ajax

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/json https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/ajax 目录 〇、官方文档 一、JSon 1.JSon介绍 2.JSon快速入门 3.JSON对象和字符串对象转换 1.应用案例 2.注意事项和细节 …

html table可编辑表格数据实现删除

这里教大家使用纯html和js脚本结合实现删除表格数据 <!DOCTYPE html> <html> <head><style>table {border-collapse: collapse;width: 100%;}th, td {border: 1px solid black;padding: 8px;text-align: left;}</style> </head> <body…

人工智能_机器学习077_Kmeans聚类算法_亚洲国家队自动划分类别_3维可视化实现---人工智能工作笔记0117

然后我们上一节使用聚类算法对,2006年世界杯,2010年世界杯,2007年亚洲杯,足球队进行了自动类别划分,然后 这一节,我们使用代码对,聚类算法的划分结果,进行一下可视化 plt.figure(figsize=(12,9)) 首先指定画布大小 ax=plt.subplot(111,projection=3d) 然后指定111,表示画布的,…

Java之遍历树状菜单

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;无 &#x1f33c…

loTDB数据库学习笔记之初识 —— 筑梦之路

loTDB简介 IoTDB 是针对时间序列数据收集、存储与分析一体化的数据管理引擎。具有体量轻、性能高、易使用的特点&#xff0c;适用于工业物联网应用中海量时间序列数据高速写入和复杂分析查询的需求&#xff0c;同时包含数据订阅、数据同步、负载均衡和运维监控功能。 由清华大学…

pytorch中池化函数详解

1 池化概述 1.1 什么是池化 池化层是卷积神经网络中常用的一个组件&#xff0c;池化层经常用在卷积层后边&#xff0c;通过池化来降低卷积层输出的特征向量&#xff0c;避免出现过拟合的情况。池化的基本思想就是对不同位置的特征进行聚合统计。池化层主要是模仿人的视觉系统…

文件夹共享(普通共享和高级共享的区别)防火墙设置(包括了jdk安装和Tomcat)

文章目录 一、共享文件1.1为什么需要配置文件夹共享功能&#xff1f;1.2配置文件共享功能1.3高级共享和普通共享的区别&#xff1a; 二、防火墙设置2.1先要在虚拟机上安装JDK和Tomcat供外部访问。2.2设置防火墙&#xff1a; 一、共享文件 1.1为什么需要配置文件夹共享功能&…