ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Cesium 3D Tiles 元数据实战:用属性属性(Property Attributes)为点云注入强度与分类,并在瓦片集中定义统计信息

Cesium 3D Tiles 元数据实战:用属性属性(Property Attributes)为点云注入强度与分类,并在瓦片集中定义统计信息 Cesium 3D Tiles 元数据实战用属性属性Property Attributes为点云注入强度与分类并在瓦片集中定义统计信息【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium本文基于 Cesium 仓库中的示例数据集Specs/Data/Cesium3DTiles/Metadata/PropertyAttributesPointCloud/完整讲解如何用 glTF 扩展EXT_structural_metadata的属性属性property attributes为点云逐点存储元数据一个FLOAT32标量intensity、一个UINT16枚举classification让 glTF 资源与 3D Tiles 瓦片集共享同一份元数据模式MetadataSchema并配合 3D Tiles 规范中的 metadata statistics如intensity的最小/最大值、各classification枚举值的出现次数让 Cesium 在渲染管线中把统计量直接注入 shader。读完后你将掌握构建可着色、可查询、带统计的元数据点云瓦片集的完整数据组织方式并能在源码层面理解 Cesium 如何消费这份数据。一、示例数据集整体结构该数据集是一个最小化的 3D Tiles 1.1 瓦片集共包含一个瓦片集描述、一个元数据模式文件、两个点云 glTF 资源各带一个二进制 buffer和一份说明文档文件仓库根目录相对路径作用tileset.json3D Tiles 瓦片集描述根瓦片、两个子瓦片、schemaUri引用与全局元数据统计MetadataSchema.json元数据模式定义一个类、两个属性、一个枚举PropertyAttributesPointCloudHouse.gltf房屋点云 glTF22462 个点引用EXT_structural_metadata的属性属性PropertyAttributesPointCloudTree.gltf树木点云 glTF6876 个点同上两个同名.bin文件各 glTF 的几何与属性二进制 buffer数据集的设计意图见 README是演示EXT_structural_metadata与 3D Tiles 多项特性的组合一份元数据模式同时被 glTF 资源和 3D Tiles 瓦片集引用逐点元数据以 glTF 属性属性存储瓦片集层面再提供跨资源的元数据统计。数据文件以 CC0 协议发布。二、共享元数据模式MetadataSchema.json 详解按照 3D Metadata Specification模式文件使用id标识自身并用classes定义元数据类、enums定义枚举类型。本示例的模式完整内容如下摘自 MetadataSchema.json{ id: PropertyAttributesPointCloudMetadataSchemaId, classes: { exampleMetadataClass: { name: Example metadata class, description: An example metadata class for property attributes, properties: { intensity: { name: Example intensity property, description: An example property for the intensity, with component type FLOAT32, type: SCALAR, componentType: FLOAT32 }, classification: { name: Example classification property, description: An example property for the classification, with the classificationEnumType, type: ENUM, enumType: classificationEnumType } } } }, enums: { classificationEnumType: { valueType: UINT16, values: [ { name: MediumVegetation, value: 0 }, { name: Buildings, value: 1 } ] } } }关键设计点id字段PropertyAttributesPointCloudMetadataSchemaId是模式的全局标识瓦片集与 glTF 都通过schemaUri 该 id 关联到同一份模式保证一套模式、多处引用。intensity是SCALAR类型、FLOAT32分量类型对应单精度浮点标量逐点存储一个连续值点云中的回波强度概念。classification是ENUM类型引用classificationEnumType该枚举的valueType为UINT16两个枚举值MediumVegetation 0、Buildings 1。枚举语义允许客户端把整数还原为具名类别。类与属性都带name/description便于检查器与工具链展示可读名称这是规范要求的可选但推荐的字段。这份模式文件同时被两类消费方引用glTF 资源决定数据怎么存与 3D Tiles 瓦片集决定整体统计如何描述下文分别展开。三、glTF 侧用属性属性存储逐点元数据3.1 资产级声明schemaUri 与 propertyAttributes两个 glTF 文件的资产级extensions中声明了EXT_structural_metadata摘自 PropertyAttributesPointCloudHouse.gltfTree 文件结构完全相同extensions: { EXT_structural_metadata: { schemaUri: MetadataSchema.json, propertyAttributes: [ { class: exampleMetadataClass, properties: { intensity: { attribute: _INTENSITY }, classification: { attribute: _CLASSIFICATION } } } ] } }, extensionsUsed: [ EXT_structural_metadata ]这里体现了EXT_structural_metadata的**属性属性property attributes**机制属性定义在几何属性attribute上即每个顶点/点直接携带一个元数据值。与属性纹理property textures用 UV 采样纹理或属性表property tables用索引查表不同属性属性是最直接、最适合点云的存储方式。schemaUri相对 glTF 文件解析正好指向同目录的 MetadataSchema.json。3.2 顶点级绑定与 accessor 布局在 mesh primitive 中属性属性通过propertyAttributes: [0]绑定到 primitive几何属性表则把模式属性映射到具体 accessorattributes: { POSITION: 0, COLOR_0: 1, _INTENSITY: 2, _CLASSIFICATION: 3 }注意约定俗成的命名自定义几何属性以下划线开头_INTENSITY、_CLASSIFICATION与保留属性POSITION、COLOR_0区分。两个文件的 accessor 布局一致均为 4 个 accessor 指向同一个.binbuffer 中的 4 个 bufferViewaccessor语义componentTypetypeHouse 点数Tree 点数0POSITION5126 (FLOAT)VEC32246268761COLOR_05126 (FLOAT)VEC32246268762_INTENSITY5126 (FLOAT)SCALAR2246268763_CLASSIFICATION5123 (UNSIGNED_SHORT)SCALAR224626876从 accessor 的min/max可以直接验证数据与后续瓦片集统计的一致性House_INTENSITY范围[0.0, 0.6333334]_CLASSIFICATION的 min/max 均为1—— 即全部 22462 个点都是BuildingsTree_INTENSITY范围[0.0, 0.5]_CLASSIFICATION的 min/max 均为0—— 全部 6876 个点都是MediumVegetation。另外两个 primitive 的mode均为0POINTS确认它们是真正的点云几何而非三角形网材质为全白pbrMetallicRoughnessmetallicFactor: 0.0、roughnessFactor: 1.0、doubleSided: true几何本身只带COLOR_0颜色。glTF 的asset.generator标注为 JglTF说明数据由该工具链生成。四、瓦片集侧tileset.json 的 schemaUri 与 metadata statisticstileset.json 是 3D Tiles 1.1 资产asset: { version: 1.1 }其结构包含三部分1模式引用瓦片集顶层字段schemaUri: MetadataSchema.json与 glTF 中的schemaUri指向同一文件。这样客户端可以只下载一次模式同时服务瓦片集统计解释与模型元数据读取两个用途。2元数据统计3D Tiles 规范的 metadata statisticsstatistics: { classes: { exampleMetadataClass: { count: 29338, properties: { intensity: { min: 0.0, max: 0.6333333849906921, mean: 0.28973701532415364, median: 0.25416669249534607, standardDeviation: 0.18222664489583626, variance: 0.03320655011, sum: 8500.30455558002, _skewness: 0.4226942540824248, _kurtosis: -0.230171075517038 }, classification: { occurrences: { MediumVegetation: 6876, Buildings: 22462 } } } } } }逐项解读count: 29338等于两个 glTF 点数之和22462 6876即整个瓦片集内该元数据类的实例总数intensity的数值统计min/max/mean/median/standardDeviation/variance/sum七个值中max与 House accessor 的_INTENSITY最大值0.6333334吻合这些是 3D Tiles 规范定义的必备统计字段_skewness、_kurtosis以下划线开头属于规范中可选/未标准化的附加统计客户端可以选择忽略。从 Cesium 源码看见第五节Cesium 只消费min/max/mean/median/standardDeviation/variance/sum七个字段classification的occurrences枚举型属性没有数值统计规范改为记录每个枚举值的出现次数——MediumVegetation: 6876Tree 全部点、Buildings: 22462House 全部点与两个 glTF 的 accessor min/max 完全对应。3瓦片树结构root 瓦片geometricError: 1024refine: ADD含一个box包围盒两个子瓦片geometricError: 0.0第一个直接引用PropertyAttributesPointCloudHouse.gltf第二个通过transform平移(10, 0, 0)后引用PropertyAttributesPointCloudTree.gltf且包围盒中心也相应平移。也就是说树木点云整体放在房屋点云右侧 10 米处各自有独立包围盒。五、Cesium 源码如何消费这份数据仓库中的单元测试 MetadataPipelineStageSpec.js 直接以本数据集的 tileset.json 为测试数据第 36-37 行tilesetWithMetadataStatistics验证了两条消费链路1瓦片集统计进入 shader 结构体。测试 Handles a tileset with metadata statistics 通过Cesium3DTilesTester.loadTileset加载该瓦片集随后断言tileset.metadataExtension.statistics已被解析第 775-777 行。在实现端渲染管线的 MetadataPipelineStage.js 通过content?.tileset.metadataExtension?.statistics拿到统计对象再按类/属性匹配生成 shader 声明测试断言生成的 GLSL 中包含floatMetadataStatistics结构体字段为minValue/maxValue/mean/median/standardDeviation/variance/sum并在initializeMetadata中硬编码写入瓦片集中的统计值如metadataStatistics.intensity.mean float(0.28973701532415364);。这意味着自定义着色器或点云样式可以直接读取全瓦片集的强度均值/中位数等量而不必自己遍历几何。2属性属性生成元数据结构。同一测试还断言 shader 中出现metadata.classification attributes.classification;、metadata.intensity attributes.intensity;的赋值——即 Cesium 把 glTF 中以_INTENSITY/_CLASSIFICATION命名的几何属性经EXT_structural_metadata映射后暴露为vsInput.metadata/fsInput.metadata结构体字段。测试中的 mock 自定义着色器mockCustomShader遍历structuralMetadata.propertyAttributes把每个属性按其 GLSL 类型加进着色器模拟真实使用场景这也说明属性属性会同时进入顶点着色器与片元着色器而属性纹理只进入片元着色器对应扩展规范的差异。从源码结构看MetadataPipelineStage还定义了METADATA_STATISTICS_FIELDS常量来统一统计字段列表并按出现过的 GLSL 类型为每种类型声明对应的xxxMetadataStatistics结构体——本数据集intensity为float故只声明floatMetadataStatistics与测试断言一致。使用方式在应用中加载该瓦片集后即可通过tileset.metadataExtension读取模式与统计若要按intensity/classification着色可给模型挂CustomShader如测试所示在vertexMain/fragmentMain中读取vsInput.metadata.intensity或利用点云样式point cloud styling读取metadata.intensity与metadata.classification的具名枚举值。六、要点总结一份模式两端引用MetadataSchema.json同时被 glTF 的schemaUri和 tileset.json 的schemaUri引用模式id保证身份唯一这是 3D Tiles 1.1 元数据体系的推荐组织方式。属性属性适合点云逐点元数据直接落在几何属性上_INTENSITY为 FLOAT32 SCALAR_CLASSIFICATION为 UNSIGNED_SHORT SCALARmin/max可写进 accessor 做校验点云 primitive 使用mode: 0。瓦片集统计是跨资源的全局描述count聚合多个 glTF 的点数数值属性提供七项统计枚举属性提供occurrences下划线前缀字段_skewness/_kurtosis为规范外附加项Cesium 不消费。可验证性本数据集的 accessor 范围、tileset 统计、Cesium 测试断言三者数值互相印证如max 0.6333334、Buildings 22462可作为构造同类元数据点云瓦片集时的完整参照相关消费逻辑可继续从 MetadataPipelineStage.js 与 MetadataPipelineStageSpec.js 深入阅读。【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表