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; 超级详细…

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

随着无人机技术的飞速发展&#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…

python进阶函数

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

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

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

AWT的菜单组件

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

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;提供错误日志记录 、配置文件解析 、事件驱动机…

46 - 删除重复的电子邮箱(高频 SQL 50 题基础版)

46 - 删除重复的电子邮箱 delete p1 from Person p1,Person p2 where p1.emailp2.email and p1.id>p2.id;

ios13多窗口(UIWindowScene)学习笔记

ios13引入了UIWindowScene类、UIWindowSceneDelegate协议以便支持多窗口功能&#xff0c;但其适用于ipad&#xff0c;不适用于iphone&#xff0c;因为iphone不支持多窗口功能。注意&#xff0c;这里说的窗口不是UIWindow&#xff0c;而是UIWindowScene。 ios13前后的app的UI架…

2024年【建筑电工(建筑特殊工种)】考试试题及建筑电工(建筑特殊工种)模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【建筑电工(建筑特殊工种)】考试试题及建筑电工(建筑特殊工种)模拟考试题库&#xff0c;包含建筑电工(建筑特殊工种)考试试题答案和解析及建筑电工(建筑特殊工种)模拟考试题库练习。安全生产模拟考试一点通结合…

2024年【广东省安全员A证第四批(主要负责人)】新版试题及广东省安全员A证第四批(主要负责人)考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【广东省安全员A证第四批&#xff08;主要负责人&#xff09;】新版试题及广东省安全员A证第四批&#xff08;主要负责人&#xff09;考试试卷&#xff0c;包含广东省安全员A证第四批&#xff08;主要负责人&am…

Go线程实现模型-P

P 概述 P是G能够在M中运行关键。Go的运行时系统会适时地让P与不同的M建立或断开关联&#xff0c;以使P中的那些可运行的G能够及时获得&#xff0c;这与操作系统内核在CPU之上实时切换不同进程或线程的情况类似 改变P的数量 改变单个Go程序间拥有的P的最大数量有两种方法 调…

Android - 利用 jitpack 免费发布闭源 aar

一、简述 目前(Android/java) library 的主要发布仓库有 MavenCentral 和 jitpack,我之前也对这两种仓库的发布流程做了详细介绍: 发布至 MavenCentral: https://juejin.cn/post/6953598441817636900发布至 jitpack: https://juejin.cn/post/7040733114506674183#heading-…

图灵虚拟机配置

导入虚拟机 点击新建&#xff0c;选择虚拟硬盘文件 环境机器.vmdk 配置网络