Cesium Model 中的剪裁平面 (ClippingPlane)

Cesium Model 中的剪裁平面 (ClippingPlane)

在这里插入图片描述

参考: https://www.cnblogs.com/webgl-angela/p/9197672.html

Cesium Model 中的剪裁平面 (ClippingPlane)

// 相关类:
class ClippingPlaneCollection {}
class ClippingPlane {}// 剪裁的整体流程:
Model.prototype.update = () => {//...// 1.剪裁纹理的构建updateClippingPlanes()// 2.Shader 的构建buildDrawCommands()// 3.剪裁矩阵的构建updateReferenceMatrices();//...
}
1、剪裁纹理的构建
ClippingPlaneCollection.prototype.update = () => {//...// 1. 计算纹理的分辨率, { x: 剪裁平面的数量, y: 2 }computeTextureResolution()// 2. 创建纹理clippingPlanesTexture = new Texture()// 3. 将剪裁平面数据打包成浮点数的数组 _float32ViewpackPlanesAsFloats()// 4.拷贝图片数据 _float32View 到纹理中clippingPlanesTexture.copyFrom()//...
}
2、Shader 的构建
ModelClippingPlanesPipelineStage.process = () => {const uniformMap = {model_clippingPlanes: function () {return clippingPlanes.texture;},model_clippingPlanesEdgeStyle: function () {const style = Color.clone(clippingPlanes.edgeColor);style.alpha = clippingPlanes.edgeWidth;return style;},model_clippingPlanesMatrix: function () {return model._clippingPlanesMatrix;},};
};
3、剪裁矩阵的构建
functin updateReferenceMatrices() {// ...// 模型空间 转换到 世界空间const referenceMatrix = model.modelMatrix;// 模型空间 转换到 裁剪平面空间const clippingPlanesModelMatrix = model._clippingPlanes.modelMatrix;// 世界空间 转换到 视图空间clippingPlanesMatrix = Matrix4.multiply(context.uniformState.view3D,referenceMatrix,clippingPlanesMatrix);// 视图空间 转换到 裁剪平面空间, 在视图空间中调整模型的裁剪平面// 由于裁剪平面的定义与模型空间无关,因此即使在视图空间中调整,裁剪平面的功能仍然相同:定义哪些模型部分应该被渲染、哪些部分应该被剔除。clippingPlanesMatrix = Matrix4.multiply(clippingPlanesMatrix,clippingPlanesModelMatrix,clippingPlanesMatrix);// 裁剪平面空间 转换到 视图空间model._clippingPlanesMatrix = Matrix4.inverseTranspose(clippingPlanesMatrix,model._clippingPlanesMatrix);// ...
}
4、Shader 赏析
/*** Transforms a plane.** @name czm_transformPlane* @glslFunction** @param {vec4} plane The plane in Hessian Normal Form.* @param {mat4} transform The inverse-transpose of a transformation matrix.*/
vec4 czm_transformPlane(vec4 plane, mat4 transform) {vec4 transformedPlane = transform * plane;// Convert the transformed plane to Hessian Normal Formfloat normalMagnitude = length(transformedPlane.xyz);return transformedPlane / normalMagnitude;
}vec4 getClippingPlane(highp sampler2D packedClippingPlanes,int clippingPlaneNumber,mat4 transform
) {int pixY = clippingPlaneNumber / CLIPPING_PLANES_TEXTURE_WIDTH;int pixX = clippingPlaneNumber - (pixY * CLIPPING_PLANES_TEXTURE_WIDTH);float pixelWidth = 1.0 / float(CLIPPING_PLANES_TEXTURE_WIDTH);float pixelHeight = 1.0 / float(CLIPPING_PLANES_TEXTURE_HEIGHT);float u = (float(pixX) + 0.5) * pixelWidth; // sample from center of pixelfloat v = (float(pixY) + 0.5) * pixelHeight;vec4 plane = texture(packedClippingPlanes, vec2(u, v));return czm_transformPlane(plane, transform);
}float clip(vec4 fragCoord, sampler2D clippingPlanes, mat4 clippingPlanesMatrix) {// 视图空间的位置vec4 position = czm_windowToEyeCoordinates(fragCoord);vec3 clipNormal = vec3(0.0);// 视图空间的剪裁平面位置vec3 clipPosition = vec3(0.0);float pixelWidth = czm_metersPerPixel(position);float clipAmount = 0.0;bool clipped = true;for (int i = 0; i < CLIPPING_PLANES_LENGTH; ++i) {vec4 clippingPlane = getClippingPlane(clippingPlanes, i, clippingPlanesMatrix);clipNormal = clippingPlane.xyz;clipPosition = -clippingPlane.w * clipNormal;// 计算当前像素位置到裁剪平面的投影距离。这个距离是沿着裁剪平面法线的距离。如果这个距离小于等于0,则意味着像素位于裁剪平面的内部。float amount = dot(clipNormal, (position.xyz - clipPosition)) / pixelWidth;clipAmount = max(amount, clipAmount);clipped = clipped && (amount <= 0.0);}if (clipped) {discard;}return clipAmount;
}void modelClippingPlanesStage(inout vec4 color)
{float clipDistance = clip(gl_FragCoord, model_clippingPlanes, model_clippingPlanesMatrix);vec4 clippingPlanesEdgeColor = vec4(1.0);clippingPlanesEdgeColor.rgb = model_clippingPlanesEdgeStyle.rgb;float clippingPlanesEdgeWidth = model_clippingPlanesEdgeStyle.a;if (clipDistance > 0.0 && clipDistance < clippingPlanesEdgeWidth) {color = clippingPlanesEdgeColor;}
}

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

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

相关文章

牛客小白月赛97 (个人题解)(待补完)

前言&#xff1a; 前天晚上写的一场牛客上比赛&#xff0c;虽然只写出了三道&#xff0c;但比起之前的成绩感觉自己明显有了一点进步了&#xff0c;继续努力吧&#xff0c; 正文&#xff1a; 链接&#xff1a;牛客小白月赛97_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞…

如何用DCA1000持续采集雷达数据

摘要&#xff1a;本文介绍一下如何通过mmwave studio软件&#xff0c;搭配DCA1000数据采集卡&#xff0c;对AWR1843BOOST进行不间断的数据采集。本文要求读者已经掌握了有关基础知识。 本文开放获取&#xff0c;无需关注。 到SensorConfig页面下&#xff0c;一步步操作&#xf…

ubuntu 18 虚拟机安装(3)安装mysql

ubuntu 18 虚拟机安装&#xff08;3&#xff09;安装mysql 参考 https://cloud.tencent.com/developer/article/1700780 技术分享 | MySQL 设置管理员密码无法生效一例 https://cloud.tencent.com/developer/article/2014384 在Ubuntu18.04上安装MySQL &#xff5c; 超级详细…

283. 移动零【快慢指针】【C++】

题目描述 移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nu…

无人机挂载抛弹吊舱技术详解

随着无人机技术的飞速发展&#xff0c;无人机在军事、安全、农业、环保等领域的应用越来越广泛。其中&#xff0c;挂载抛弹吊舱的无人机在精确打击、应急处置等场合发挥着重要作用。抛弹吊舱技术通过将弹药、物资等有效载荷挂载在无人机下方&#xff0c;实现了无人机的远程投放…

昇思25天学习打卡营第7天|模型训练

模型训练 模型训练一般分为四个步骤&#xff1a; 构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。 前面几天依次学习了前面几个步骤的操作&#xff0c;今天继续学习模型训练。 数据集和神经网络模型这个前面已经有详细的介绍。准确…

JVM(13):虚拟机性能分析和故障解决工具之Visual VM

1 Visual VM作用 是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序&#xff0c;并且可以遇见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。官方在VisualVM的软件说明中写上了“All-in-One”的描述字样&#xff0c;预示着他除了运行监视、故障处理外&…

ConcurrentHashMap是如何保证线程安全的-put方法简要分析

简介 ConcurrentHashMap 是 Java 中并发编程中常用的线程安全的哈希表&#xff08;HashMap&#xff09;实现。它具有以下几个显著的特点和优点&#xff0c;适合在特定的并发场景中使用&#xff1a; 线程安全性&#xff1a; ConcurrentHashMap 提供了并发访问的线程安全保证&am…

左耳听风_032_31_编程范式游记2-_泛型编程

你好&#xff0c;我是陈浩网名英&#xff0c;做耳朵house.在上一节课中呢&#xff0c;我们从c语言开始说起&#xff0c;聊了聊面向过程式的辩证范式。 那相信从代码的角度呢&#xff0c;你对这种类型的语言啊已经有了一些理解。 那作为一门高级语言呢&#xff0c;c语言啊它绝…

python进阶函数

目录 函数多返回值函数多种传参方式匿名函数 函数多返回值 问&#xff1a;如果一个函数如些两个return&#xff08;如下所示&#xff09;&#xff0c;程序如何执行&#xff1f; def return_num():return 1return 2result return_num() print(result)答&#xff1a;只执行了第…

Web3 前端攻击:原因、影响及经验教训

DeFi的崛起引领了一个创新和金融自由的新时代。然而&#xff0c;这种快速增长也吸引了恶意行为者的注意&#xff0c;他们试图利用漏洞进行攻击。尽管很多焦点都集中在智能合约安全上&#xff0c;但前端攻击也正在成为一个重要的威胁向量。 前端攻击的剖析 理解攻击者利用前端漏…

DDD学习笔记三

模型的构造块&#xff1a;实体、值对象、领域服务 &#xff08;1&#xff09;实体的领域特征 在领域中&#xff0c;一个由身份而不是属性值定义的客观概念就是实体&#xff0c;这个身份可以由一个唯一标识确认。 一个概念是否是实体取决于系统的应用场景&#xff0c;一个标识是…

ORA-00903: invalid table name\nORA-06512: at line 1\n

错误信息 ORA-00903: invalid table name\nORA-06512: at line 1\n原因 ORA-00903: invalid table name 解释: 这个错误表示在 SQL 语句中使用了无效的表名。 由于在建表中出现了以数字开头的表名,所以出现以下错误 解决方案 表名不能以数字开头

RabbitMQ交换器类型

直连交换机&#xff08;Direct Exchange&#xff09; 直连交换机的工作方式是最简单的路由模式&#xff0c;它会根据消息的routing key将其精确地路由到与之绑定的队列上。每个队列通过一个特定的routing key与交换机绑定。如果一条消息的routing key与队列的绑定键完全匹配&am…

AWT的菜单组件

AWT的菜单组件 前言一、菜单组件的介绍常见的菜单相关组件常见菜单相关组件集成体系图菜单相关组件使用小要点 二、AWT菜单组件的代码示例示例一示例二实现思路 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&…

【Python】Pickle:Python对象序列化与反序列化的利器

在Python编程中&#xff0c;我们经常需要在程序的不同运行之间保存和加载数据&#xff0c;这时候&#xff0c;Python标准库中的pickle模块就派上了用场。pickle模块可以将Python对象序列化为字节流&#xff0c;便于存储到文件或通过网络传输&#xff1b;同时&#xff0c;它也可…

CentOS 7 和 CentOS Stream 8 的主要区别

更新频率&#xff1a; CentOS 7&#xff1a;传统的稳定版本&#xff0c;主要用于生产环境&#xff0c;更新频率较低&#xff0c;主要包含安全补丁和重要修复。CentOS Stream 8&#xff1a;滚动发布版本&#xff0c;更新更频繁&#xff0c;包含最新的特性和改进。它处于 Fedora …

springboot汽车租赁管理系统-计算机毕业设计源码08754

目 录 摘 要 第 1 章 引 言 1.1 选题背景和意义 1.2 国内外研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析…

基于线调频小波变换的非平稳信号分析方法(MATLAB)

信号处理领域学者为了改进小波变换在各时频区间能量聚集性不高的缺点&#xff0c;有学者在小波分析基础上引入调频算子构成了线性调频小波变换&#xff0c;线调频小波一方面继承了小波变换的理论完善性&#xff0c;另一方面用一个新的参数&#xff08;线调频参数&#xff09;刻…

Nginx 配置文件

Nginx的配置文件的组成部分&#xff1a; 主配置文件&#xff1a;nginx.conf子配置文件&#xff1a;include conf.d/*.conf 全局配置 nginx 有多种模块 核心模块&#xff1a;是 Nginx 服务器正常运行必不可少的模块&#xff0c;提供错误日志记录 、配置文件解析 、事件驱动机…