three.js NDC空间转视图空间(getViewPosition)

news2024/11/25 19:36:29

three.js NDC空间转视图空间

请添加图片描述

NDC空间转视图空间, 比较常用。很多效果依赖于此。
包括:

  • GTAOShader
  • ReflectorForSSRPass
  • SSRShader

下面看一下它的庐山真面目。

1、计算clipW

视图空间(view) 应用投影矩阵后转换到 剪裁空间(clip)
[ A 0 B 0 0 C D 0 0 0 E F 0 0 − 1 0 ] [ v i e w x v i e w y v i e w z 1 ] = [ c l i p x c l i p y c l i p z c l i p w ] \left[ \begin{matrix} A & 0 & B & 0 \\ 0 & C & D & 0 \\ 0 & 0 & E & F \\ 0 & 0 & -1 & 0 \end{matrix} \right] \left[ \begin{matrix} view_{x} \\ view_{y} \\ view_{z} \\ 1 \\ \end{matrix} \right] = \left[ \begin{matrix} clip_{x} \\ clip_{y} \\ clip_{z} \\ clip_{w} \\ \end{matrix} \right] A0000C00BDE100F0 viewxviewyviewz1 = clipxclipyclipzclipw

投影矩阵按列存储在glsl中。那么就会存储为:
[ A 0 0 0 0 C 0 0 B D E − 1 0 0 F 0 ] \left[ \begin{matrix} A & 0 & 0 & 0 \\ 0 & C & 0 & 0 \\ B & D & E & -1 \\ 0 & 0 & F & 0 \end{matrix} \right] A0B00CD000EF0010

于是:

// clipZ = E * viewZ + F
clipZ = (viewZ * cameraProjectionMatrix[2][2]) + cameraProjectionMatrix[2][3]

// clipW = -1 * viewZ + 0
clipW = (viewZ * cameraProjectionMatrix[3][2]) + cameraProjectionMatrix[3][3] = -viewZ
2、计算viewZ

原理见: three.js 中的 perspectiveDepthToViewZ

float getDepth( const in vec2 uv ) {
  return texture2D( tDepth, uv ).x;
}

float getViewZ( const in float depth ) {
  return perspectiveDepthToViewZ( depth, cameraNear, cameraFar );
}

float depth = getDepth( vUv );
float viewZ = getViewZ( depth );
3、计算 viewPos
vec3 getViewPosition(
  const in vec2 uv,
  const in float depth,
  const in float clipW
) {
  // ndc
  vec4 clipPosition = vec4( ( vec3(uv, depth) - 0.5 ) * 2.0, 1.0 );

  // clip
  clipPosition *= clipW;

  // view
  return ( cameraInverseProjectionMatrix * clipPosition ).xyz;
}

vec3 viewPosition = getViewPosition( vUv, depth, clipW );

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

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

相关文章

Truenas scale 配置 Official Zerotier 并设置一直固定Zerotier IP

Zerotier 安装 TrueNAS Scale -> Apps -> Discover Apps -> 搜索 Zerotier 并安装Netwoek 中填入你 zerotier 网页中的的 Network IDAuto Token (API key) zerotier网页的 Account -> API Access Tokens -> New Tokenidentity.secret 和 identity.public 通过 …

国际化技术参考

一、概述 国际化就是用户可以选择对应的语言,页面展示成对应的语言; 一个系统的国际化按照信息的所在位置,可以分为三种国际化信息: 前端页面信息后端提示信息数据库的字典类信息二、前端页面国际化 使用i18n库实现国际化 i18n国际化库思路:通过jquery或者dom操作拿到需…

【动态规划】打家劫舍

动态规划的四个解题步骤: 1、定义子问题 2、写出子问题的递推关系 3、确定dp数组的计算顺序 4、空间优化(可选)上一篇博客学的有点杂乱,这一篇从解题步骤方面整理一下动态规划这一章。 打家劫舍(难度:中等…

C++进阶中继承的全部主要内容

小编在学习完C中继承的内容之后,觉得继承的内容很重要,所以今天给大家带来的内容就是继承的主要内容,今天的内容包括继承的定义与语法,继承方式与权限,基类和派生类的类型转换赋值,继承中的隐藏&#xff0c…

数据跨境法案:美国篇下

数据跨境法案美国篇下主要介绍2018年《出口管制改革法案》(ECRA)、2018 年《外国投资风险审查现代化法案》(FIRRMA) 和《强化海外关键出口国家框架法》(ENFORCE)。其中 ECRA法案和 FIRRM 法案作为2019财年约翰S麦凯恩国家国防授权法(NDAA&…

MySQL定时备份数据,并上传到oss

1.环境准备 1.安装阿里云的ossutil 2.安装mysql 2.编写脚本 脚本内容如下 #!/bin/bash # 数据库的配置信息,根据自己的情况进行填写 db_hostlocalhost db_usernameroot db_passwordroot db_namedb_root # oss 存贮数据的bucket地址 bucket_namerbsy-backup-buck…

开源发票识别InvoiceNet项目Windows部署踩坑记(1)

今天安装在github上的InvoiceNet开源项目,准备对它进行测试,安装过程出现了一些问题,做个记录,给遇到兄弟爬坑。 第一个问题,conda的问题, 这是另外一个包管理器,不仅仅可以管理python的虚拟…

如何通过smtp设置使ONLYOFFICE协作空间服务器可以发送注册邀请邮件

什么是ONLYOFFICE协作空间 ONLYOFFICE协作空间,是Ascensio System SIA公司出品的,基于Web的,开源的,跨平台的,在线文档编辑和协作的解决方案。在线Office包含了最基本的办公三件套:文档编辑器、幻灯片编辑…

XXE:XML外部实体引入

XXE漏洞 如果服务器没有对客户端的xml数据进行限制,且版本较低的情况下,就可能会产生xxe漏洞 漏洞利用流程 1.客户端发送xml文件,其中dtd存在恶意的外部实体引用 2.服务器进行解析 3.服务器返回实体引用内容 危害:任意文件读…

【C语言】 约瑟夫环,循环链表实现

1、循环链表实现约瑟夫环&#xff0c;每次经过特定步数删除一个元素 //looplist.h #ifndef LOOPLIST_H #define LOOPLIST_H #include<stdio.h> #include<string.h> #include<stdlib.h>typedef int datatype;typedef struct Node {union {int len;datatype d…

大模型应用—大模型赋能网络爬虫

大模型赋能网络爬虫 简单来说,网页抓取就是从网站抓取数据和内容,然后将这些数据保存为XML、Excel或SQL格式。除了用于生成潜在客户、监控竞争对手和市场研究外,网页抓取工具还可以用于自动化你的数据收集过程。 借助AI网页抓取工具,可以解决手动或纯基于代码的抓取工具的…

花几千上万学习Java,真没必要!(二十二)

1、final关键字&#xff1a; 测试代码1&#xff1a; package finaltest.com;public class FinalBasicDemo {public static void main(String[] args) {// final修饰基本数据类型变量final int number 5;// 尝试修改number的值&#xff0c;这将导致编译错误// number 10; // …

JAVA在线文档

1.存在码 JDK21中文API 2.全栈行动派 JDK17中文API 3.mklab.cn JDK11中文API JDK8中文API JDK7-21英文API 4.docs.oracle.com JDK7-22英文文档

Python实现文本转换为语音

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

探究Type-C接口的安装方式及应用场景

在现代电子设备中&#xff0c;Type-C接口因其高速传输、可逆插拔等特点&#xff0c;越来越受到用户的青睐。而Type-C接口的安装方式也是至关重要的一环&#xff0c;影响着设备的稳定性和可靠性。本文将深入分析Type-C接口的四种主要安装方式&#xff1a;表面贴片、穿孔焊接、夹…

【C++】内存管理的深度解析与实例

C内存管理的深度解析与实例 一、C内存管理的基本概念二、C内存分配方式1. 静态内存分配2. 动态内存分配 三、C内存管理的常见问题及解决策略1. 内存泄漏2. 堆内存碎片化3. 栈溢出 四、C内存管理的最佳实践1. 使用RAII&#xff08;Resource Acquisition Is Initialization&#…

图片转pdf的软件有哪些?这几种转换工具了解下

在日常的办公学习中&#xff0c;图片转PDF的需求愈发普遍。不论是工作汇报、学习笔记还是生活点滴&#xff0c;我们都希望将重要的图片内容整理成易于查阅的PDF格式。那么&#xff0c;有哪些软件可以做到将图片转换成PDF格式呢&#xff1f;给大家介绍5种简单好用的转换方法&…

昇思25天学习打卡营第17天|CycleGAN图像风格迁移互换

CycleGAN是一种非常酷的人工智能模型&#xff0c;它能够在没有成对训练样本的情况下&#xff0c;将一种图像风格迁移到另一种图像上。比如&#xff0c;你可以把苹果的图片变成橘子的风格&#xff0c;反之亦然。 CycleGAN的网络结构&#xff0c;包括生成器和判别器&#xff0c;它…

英语语法第八课副词

文章目录 1、副词分类1.1 时间副词&#xff0c;表示时间或频率1.2 地点副词&#xff0c;表示地点或位置1.3 方式副词&#xff0c;表示行为方式1.4 程度副词&#xff0c;表示动作程度1.5 疑问副词&#xff0c;引导特殊疑问句1.6 强调副词&#xff0c;强调形容词或动词1.7 连接副…

RabbitMQ的学习和模拟实现|sqlite轻量级数据库的介绍和简单使用

SQLite3 项目仓库&#xff1a;https://github.com/ffengc/HareMQ SQLite3 什么是SQLite为什么需要用SQLite官方文档封装Helper进行一些实验 什么是SQLite SQLite是一个进程内的轻量级数据库&#xff0c;它实现了自给自足的、无服务器的、零配置的、事务性的 SQL数据库引擎…