Cesium高级教程-3D高斯泼溅-Splat-高斯数据渲染
Cesium高级教程-3D高斯泼溅-Splat-高斯数据渲染数据加载完成后下一步我们应该做的是排序操作但是现在我们先省略排序的步骤直接先进行数据的渲染因为排序只会影响绘制图形的前后遮挡关系并不会影响图形的变换及着色结果并且排序的结果是否正确只有渲染出来才能验证所以我们先将数据渲染出来再看排序对渲染结果的影响。实例化渲染准备在开始渲染Splat数据之前我们需要先准备好图形实例化渲染的基本环境相关内容前面百万级图形渲染一章已经介绍得非常详细了这里就不再重复阐述实例化渲染一个矩形的基本代码如下// z// | /y// |/// o------xconstpositionsnewFloat32Array([-2,-2,2,-2,2,2,-2,2]);constvertexBufferCesium.Buffer.createVertexBuffer({context:viewer.scene.context,typedArray:positions,usage:Cesium.BufferUsage.STATIC_DRAW});constattributes[{index:0,vertexBuffer:vertexBuffer,componentsPerAttribute:2,componentDatatype:Cesium.ComponentDatatype.FLOAT,}];constvertexArraynewCesium.VertexArray({context:viewer.scene.context,attributes:attributes});constvs...constfs...constshaderProgramCesium.ShaderProgram.fromCache({context:viewer.scene.context,vertexShaderSource:vs,fragmentShaderSource:fs,attributeLocations:{position:0,}})letpositionCesium.Cartesian3.fromDegrees(105.41883,26.68244,0);letmodelMatrixCesium.Transforms.eastNorthUpToFixedFrame(position);letcommandnewCesium.DrawCommand({modelMatrix:modelMatrix,vertexArray:vertexArray,shaderProgram:shaderProgram,renderState:Cesium.RenderState.fromCache({depthTest:{enabled:true,}}),pass:Cesium.Pass.OPAQUE,instanceCount:vertexCount,uniformMap:{}})classMyPrimitive{constructor(){}update(frameState){frameState.commandList.push(command);}isDestroyed(){returnfalse;}}letpnewMyPrimitive();viewer.scene.primitives.add(p);代码中我们省略了着色器代码缺省代码可以在前面章节中获取因为这里我们只先准备一个基本骨架。因为我们最终需要将结果渲染在地球上的某个位置所以需要指定一个从世界坐标原点到该位置的变换矩阵modelMatrix这里可以自行定义该位置的坐标值。instanceCount属性初始值为0当vertexCount变化后记得更新instanceCount数据纹理与索引接下来我们按照 Splat Viewer 中的代码先将高斯数据打包到一张纹理图里面去因为打包过程是在WebWorker中进行的所以我们需要将数据传入Worker并注册消息事件接收结果。letdataTexturenewCesium.Texture({context:viewer.scene.context,width:1,height:1,pixelFormat:Cesium.PixelFormat.RGBA_INTEGER,pixelDatatype:Cesium.PixelDatatype.UNSIGNED_INT,sampler:newCesium.Sampler({minificationFilter:Cesium.TextureMinificationFilter.NEAREST,magnificationFilter:Cesium.TextureMagnificationFilter.NEAREST})});functioncreateTexture(texdata,texwidth,texheight){returnnewCesium.Texture({context:viewer.scene.context,width:texwidth,height:texheight,pixelFormat:Cesium.PixelFormat.RGBA_INTEGER,pixelDatatype:Cesium.PixelDatatype.UNSIGNED_INT,source:{arrayBufferView:texdata,width:texwidth,height:texheight,},sampler:newCesium.Sampler({minificationFilter:Cesium.TextureMinificationFilter.NEAREST,magnificationFilter:Cesium.TextureMagnificationFilter.NEAREST})});}letcommandnewCesium.DrawCommand({...uniformMap:{u_texture:(){returndataTexture;},}})...上面的代码中我们先创建了一张默认的纹理图当我们接收到WebWorker的打包结果后再覆写其内容。现在我们需要手动触发纹理打包操作因为Splat Viewer中默认是排序时才会打包纹理而我们现在并没有开启排序。要触发纹理打包操作我们需要修改两处代码一是在接收到网络请求的高斯数据后将其推送到WebWorker二是在WebWorker中接收到数据后调用generateTexture函数进行纹理打包。functioncreateWorker(self){...letsortRunning;self.onmessage(e){if(e.data.buffer){buffere.data.buffer;vertexCounte.data.vertexCount;}elseif(e.data.vertexCount){vertexCounte.data.vertexCount;}elseif(e.data.view){viewProje.data.view;throttledSort();}};}...while(true){...if(vertexCountlastVertexCount){worker.postMessage({buffer:splatData.buffer,vertexCount:Math.floor(bytesRead/rowLength),});lastVertexCountvertexCount;}}现在纹理数据已经有了但是我们还得为其准备一个默认的索引排序这里我们直接将0,1,2,3,4...设置为其默认的索引即可索引数据需要通过Buffer来传递所以我们需要修改一下前面默认的VAO。constinitialIndicesnewUint32Array(x);for(leti0;ix;i)initialIndices[i]i;letindexBufferCesium.Buffer.createVertexBuffer({context:viewer.scene.context,typedArray:initialIndices,usage:Cesium.BufferUsage.STATIC_DRAW});constattributes[{index:0,vertexBuffer:vertexBuffer,componentsPerAttribute:2,componentDatatype:Cesium.ComponentDatatype.FLOAT,},{index:1,vertexBuffer:indexBuffer,componentsPerAttribute:1,instanceDivisor:1,componentDatatype:Cesium.ComponentDatatype.UNSIGNED_INT}];着色器代码修改现在我们把Splat Viewer中的两个着色器代码片段直接拷贝进来替换vs与fsfs代码基本不需要进行任何修改而vs代码中我们需要一些修改才能正常运行。首先是视图矩阵(view)、投影矩阵projection以及视口大小viewport需要改为Cesium内置的变量其次是focal参数焦距Cesium中并没有内置的我们可以通过vec2(viewport.y / 2.0) * abs(projection[1][1]);或vec2(czm_viewport.z * czm_projection[0][0])来获取其余代码保持不变。constvs... uniform highp usampler2D u_texture; // uniform mat4 projection, view; // uniform vec2 focal; // uniform vec2 viewport; in vec2 position; in float splatIndex;//Cesium中不支持int类我们可以先用float后面再进行类型转换 out vec4 vColor; out vec2 vPosition; void main () { int indexint(splatIndex); mat4 viewczm_modelView; mat4 projectionczm_projection; vec2 viewportczm_viewport.zw; vec2 focal vec2(viewport.y / 2.0) * abs(projection[1][1]); uvec4 cen texelFetch(u_texture, ivec2((uint(index) 0x3ffu) 1, uint(index) 10), 0); vec4 cam view * vec4(uintBitsToFloat(cen.xyz), 1); vec4 pos2d projection * cam; ... }.trim();示例效果可到 xt3d 官网 运行查看至此就可以运行页面查看渲染结果不出意外的话现在看到的就是一堆带有颜色的椭圆这些椭圆都是由高斯椭球投影而来因为现在没有开启颜色混合所以看起来和原始效果差别有点大。颜色混合与轴向开启颜色混合选项需要修改绘制指令的渲染状态属性混合模式有很多种Cesium内置的这里我们选择与Splat Viewer中比较近似的一种PRE_MULTIPLIED_ALPHA_BLEND当然也可以自定义混合模式。letcommandnewCesium.DrawCommand({modelMatrix:modelMatrix,vertexArray:vertexArray,shaderProgram:shaderProgram,...})示例效果可到 xt3d 官网 运行查看现在颜色渲染基本上正确了但是看上去是倾斜的这是因为默认的Splat数据是Y轴朝上的我们只需要将其绕X轴旋转一下即可。letpositionCesium.Cartesian3.fromDegrees(105.41883,26.68244,0);letmodelMatrixCesium.Transforms.eastNorthUpToFixedFrame(position);letrotationCesium.Matrix4.fromRotationTranslation(Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(-90)));Cesium.Matrix4.multiply(modelMatrix,rotation,modelMatrix);示例效果可到 xt3d 官网 运行查看更多内容见 Cesium高级教程-教程简介

相关新闻

苏州晟雅泰电子:关于车规级DS90UB941ASRTDRQ1的核心功能与参数

苏州晟雅泰电子:关于车规级DS90UB941ASRTDRQ1的核心功能与参数

DS90UB941ASRTDRQ1 是德州仪器 (TI) 推出的一款车规级、双路 MIPI DSI 转 FPD-Link III 桥接串行器。它专为汽车信息娱乐和高级驾驶辅助系统 (ADAS) 中的高清视频传输而设计。以下是该器件的核心信息汇总:核心功能与特性核心功能:将来自应用处理器&#…

2026/6/23 14:24:38阅读更多 →
六自由度自平衡稳定平台:动态工况下的高精度稳姿技术与行业应用

六自由度自平衡稳定平台:动态工况下的高精度稳姿技术与行业应用

六自由度自平衡稳定平台:动态工况下的高精度稳姿技术与行业应用 随着高端装备制造、海事勘探、车载测绘、精密检测等领域的快速发展,大量精密仪器与作业设备需要在移动载体、扰动环境下保持高精度稳定运行。船体摇摆、路面颠簸、基座振动等多维度扰动&am…

2026/6/23 14:24:38阅读更多 →
实测5款录音转文字神器,这些免费版工具让我工作总结效率翻倍

实测5款录音转文字神器,这些免费版工具让我工作总结效率翻倍

前言:一个让人崩溃的周一早晨周一早上9点,我打开电脑,看到上周五连续3场跨部门会议、2个客户访谈、还有一场技术分享的录音文件——整整12个小时的音频。作为需要每周提交详细工作周报和总结的职场人,我深知整理这些录音意味着什么…

2026/6/23 14:24:38阅读更多 →
π0.7项目解析:跨机器人零样本迁移与高效推理的具身智能新范式

π0.7项目解析:跨机器人零样本迁移与高效推理的具身智能新范式

1. 项目概述:从“π0.7”看具身智能的范式跃迁 最近在机器人圈子里,一个代号为“π0.7”的项目讨论热度很高。乍一看这个标题——“机器人视觉语言动作策略π0.7:跨具身零样本迁移与高效推理优化”,充满了学术论文式的术语堆砌&am…

2026/6/23 15:39:53阅读更多 →
智能合约库验证:上下文合约与模块化架构的测试策略对比

智能合约库验证:上下文合约与模块化架构的测试策略对比

1. 项目概述:为什么我们需要“基于测试”的合约验证?在智能合约开发领域,尤其是面对日益复杂的业务逻辑和模块化架构时,一个核心的、常被忽视的环节就是“库合约”的验证。你可能已经熟练掌握了如何编写一个功能强大的库&#xff…

2026/6/23 15:39:53阅读更多 →
基于卷积低秩与改进分位数回归的高维时间序列区间预测方法

基于卷积低秩与改进分位数回归的高维时间序列区间预测方法

1. 从点预测到区间预测:为什么我们需要更“宽”的视角 在时间序列预测这个老生常谈的领域里,绝大多数从业者,包括我自己,很长一段时间都沉迷于点预测的“精确性”竞赛。我们绞尽脑汁优化模型,看着均方根误差&#xff0…

2026/6/23 15:39:53阅读更多 →
稀疏与突发数据下的漏洞活动预测:SARIMAX与计数模型对比实战

稀疏与突发数据下的漏洞活动预测:SARIMAX与计数模型对比实战

1. 项目概述:当漏洞数据变得“稀疏”与“突发”在安全运营中心(SOC)或者漏洞管理团队里,我们每天都会处理海量的告警和扫描数据。理想情况下,我们希望看到平稳、有规律的趋势,这样就能像预测天气一样&#…

2026/6/23 15:39:53阅读更多 →
RISE方法解析:基于注意力机制的大模型训练数据估值与归因实践

RISE方法解析:基于注意力机制的大模型训练数据估值与归因实践

1. 项目概述:为什么我们需要给数据“定价”? 在深度学习和大语言模型(LLM)如火如荼的今天,我们投入海量数据去训练一个模型,但你是否想过,这成千上万亿的token里,哪些数据是真正的“…

2026/6/23 15:39:53阅读更多 →
基于Canvas与物理模拟的植物形态交互界面设计与实现

基于Canvas与物理模拟的植物形态交互界面设计与实现

1. 从一片叶子到一行代码:为什么我们需要“会呼吸”的图表? 最近在做一个数据可视化的项目,盯着屏幕上那些冰冷的柱状图、折线图,我突然感到一阵审美疲劳。它们精准、高效,但总感觉少了点什么——一种与生俱来的亲和力…

2026/6/23 15:34:52阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/23 7:04:52阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/23 1:55:32阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/23 5:55:37阅读更多 →
2026年京东云 618 活动 Hermes Agent/OpenClaw配置Token Plan新手必看指南

2026年京东云 618 活动 Hermes Agent/OpenClaw配置Token Plan新手必看指南

2026年京东云 618 活动 Hermes Agent/OpenClaw配置Token Plan新手必看指南。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流…

2026/6/23 0:00:38阅读更多 →
2026年北京电子沙盘制作公司深度评测:从技术选型到落地效果,谁在真正定义“数字+实体”的融合边界?

2026年北京电子沙盘制作公司深度评测:从技术选型到落地效果,谁在真正定义“数字+实体”的融合边界?

模块一:行业背景——百亿赛道爆发,北京市场的特殊性与选型困局2026年,电子沙盘行业已走过“要不要做”的讨论,进入“找谁做、怎么做”的深水区。据行业研究机构数据,2025年国内电子沙盘市场规模已突破85亿元&#xff0…

2026/6/23 0:00:38阅读更多 →
音视频场景下的 Java 开发者面试:技术与挑战

音视频场景下的 Java 开发者面试:技术与挑战

面试互联网大厂:从音视频场景看 Java 开发者的技能与挑战 在互联网大厂求职的面试中,Java 开发者往往需要面对严苛的技术问题。今天,我们将通过一位名叫燕双非的搞笑程序员与严肃的面试官之间的对话,看看在音视频场景下&#xff0…

2026/6/23 0:00:38阅读更多 →