区块链技术博客
www.b2bchain.cn

M3D – 一个想突破又还有很多包袱的新生三维数据格式杂谈求职学习资料

本文介绍了M3D – 一个想突破又还有很多包袱的新生三维数据格式杂谈求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

  • 1 门派
  • 2 几个术语简析
  • 3 结构简析
    • 3.1 空间剖分方式
    • 3.2 空间范围表示方式
  • 4 M3DDataInfo.mcj 类定义
  • 5 NodeInfo.json 类定义
  • 6 *.m3d 文件
  • 7. 地质模型几何结构定义
    • 7.1 钻孔模型几何结构定义
    • 7.2 地质剖面模型几何结构定义
    • 7.3 地质体模型几何结构定义
    • 7.4 网格模型几何结构
  • 8 属性文件的设计

都说 “一流企业定标准,二流企业卖品牌,三流企业卖产品,四流企业做项目”,在面向类 WebGL 技术的三维浏览器端渲染的大规模流式数据加载技术中,等到了 MapGIS 主导的 m3d 标准。

1 门派

这一份浓浓的武汉味似乎是想在继 Cesium 3d-Tiles、Esri i3s、超图 S3M 后再在三维市场分一杯羹。

在前言中,吴老爷子带路,洋洋洒洒的一队人。

2 几个术语简析

  • m3d:Model of 3D,在原文第 4 节有指出,但是翻译过来不太对的样子。
  • glbx:glTF 数据规范中,对于 glb 格式的一种变种文件。原文指的是 “gltf数据的扩展格式”,我不清楚 m3d 标准对 gltf 扩展了什么顶层属性,或者是没有好好研究 glTF 规范,因为 glTF 规范本身在几乎所有的属性中都有 extensionsextras 的预留属性,用于扩展各种不同逻辑的业务功能或渲染特征。

3 结构简析

M3D - 一个想突破又还有很多包袱的新生三维数据格式杂谈

结构的设计与 Esri i3s 略相类似,使用 Node 充当空间剖分的术语。

  • M3DDataInfo.mcj:一种 JSON 文本文件,后缀名是 mcj,且此文件的文件名可任意设置,用于描述整份 m3d 数据
  • RootNodeInfo.jsonNodeInfo<i>.json:对 node 的描述文件,文件名可以自定义
  • *.m3d:m3d 文件,一种压缩文件,可选压缩格式有:,后缀名是m3d,文件名可以自定义

每份 m3d 数据,其根目录下有

  • 一个 mcj 文件描述整份数据
  • 一个 Shared 目录存放 Shared.m3d 文件
  • 一个 根节点(RootNode)json 描述文件
  • 一个 Data 目录用于存放子一级的节点目录
    • 每个节点目录下仍能拥有更下一级的节点目录,可递归
    • 每个节点目录下有一个对当前 node 的 json 描述文件
    • 每个节点目录下可拥有 n 个 m3d 文件,这些被称作 “瓦片”,用于管理不同行业的数据(点云.m3d、倾斜摄影模型.m3d、bim.m3d、地质体.m3d)
    • 每个 m3d 文件下压缩了三个目录:GeometryTextureAttribute,分别存放 *.glb/glbx*.jpg/png/webp*.json/bin 文件用于存储几何、纹理、属性数据

3.1 空间剖分方式

规范中的术语是 “数据树形结构”,个人认为使用 空间剖分方式 更好,直观。

使用了三种常规三维数据结构,即空间八叉树、四叉树、KD树。

3.2 空间范围表示方式

  • BoundingBox
  • BoundingSphere

以上两种常见空间范围体二选一。

其中,BoundingBox 使用的定义是 6 元素的 AABB 包围盒,即经纬高三轴的最值。

4 M3DDataInfo.mcj 类定义

描述整个 m3d 文件的 json 文件,它拥有如下顶层属性:

  • asset: string,基本信息,简单的字符串
  • version: string,这个令我十分无语,UML 图中是 string,在文下是 float,我认为 string 更合适。
  • dataName: string,数据名
  • guid: string,数据唯一标识符
  • compressType: string,压缩类型,可选 "zip""7z""rar"
  • spatialReference: string,空间参考,可选 "WGS84""CGCS2000"
  • treeType: string,空间剖分结构,可选 "QuadTree""OCTree""K-DTree""RTree",这点我也有点无语,在前文中并未提及 R树,虽然 R树在空间搜索中还是很常见的。
  • lodType: string,层次细节类型,可选 "ADD""REPLACE"
  • boundingVolume: BoundingVolume
  • position: Point
  • rootNode: Uri
  • fieldInfo: Array

其中,BoundingVolume 在上文已提及,连同 PointField,在此简单使用 Rust 结构体定义:

struct BoundingVolume {   boundingBox: BoundingBox,   boundingSphere: BoundingSphere, }  struct BoundingBox {   left: f64,   top: f64,   right: f64,   bottom: f64,   minHeight: f64,   maxHeight: f64, }  struct BoundingSphere {   center: Point,   radius: f64, }  struct Point {   x: f64,    y: f64,   z: f64, }  struct Field {   name: String,   type: String,   alias: String,   size: i32, }

其中,Field 的 type 字段可选值为 "bool""int16""uint16""int32""uint32""int64""uint64""float""double""wchar""text""date""time""timestamp"

5 NodeInfo.json 类定义

每个节点(node)的描述文件是一个 json 文件,它的顶层属性有:

  • name: string
  • lodLevel: string,用字符串是一个留余量的设计,因为不一定 level 必须是数字
  • boundingVolume: BoundingVolume
  • lodMode: string,可选值 "distance""pixel"
  • lodType: string,可选值 "ADD""REPLACE"
  • lodError: string,切换误差值,单位根据 lodMode 决定
  • transform: float[16],转换矩阵
  • parentNode: NodeInfo
  • childrenNode: Array
  • uri: string
  • shared: Uri
  • tileDataInfoIndex: int,M3D 瓦片索引
  • tileDataInfoList: Array,瓦片数据列表

其中,TileDataInfo 的类定义用 rust 表示可为:

struct TileDataInfo {   tileData: Uri,   geometry: Geometry,   attribute: Attribute,   texture: Uri,   dataType: string, // 可选值 "Vector"、"TiltPhotography"、"Model"、"BIM"、"PointCloud"、"PipeLine"、"GeoModel"、"GeoGrid"、"GeoDrill"、"GeoSection",分别表示:矢量、倾斜、模型、BIM、点云、管线、地质体、地质体网格、地址钻孔、地质剖面 }  struct Geometry {   blobType: string, // 可选值 "glb"、"glbx"   url: string,   geoCompressType: string, // 只能是 "draco"   geometryType: string, // 可选值 "Point"、"Line"、"Polygon"、"Surface"、"Entity" }  struct Attribute {   attType: string, // 可选值 "json"、"bin"   uri: string, }

6 *.m3d 文件

文中对 m3d 的介绍在 7.4 节,就不复述了,主要提一点:

  • glbx:基于 glb 数据扩展了单体化信息及地质体数据信息的几何要素文件,后缀名为.glbx,文件名可自定义。

我觉得这个格式的提出是多余的,槽点最后再谈。

7. 地质模型几何结构定义

由于本部分(原文位于7.4.3节)在原文中较为详细,只捡几个点提一提。

7.1 钻孔模型几何结构定义

略。

7.2 地质剖面模型几何结构定义

剖面使用的是一个点列表表示的简单封闭三维线,这是有缺点的,因为不能表达多剖面的情况。

7.3 地质体模型几何结构定义

地质体在此处使用了多个索引三角面来定义,其实可以完全使用 glTF 来定义,只不过这里简化成了索引+顶点的形式。

7.4 网格模型几何结构

这部分的设计略显冗杂,有重复设计的嫌疑,没有优化。

8 属性文件的设计

属性文件的类型在 M3DDataInfo 对象中定义,见本文第 4 部分。

它使用 “属性记录(Record)” 来描述一个属性,又分了下列两个类定义:

  • 1 门派
  • 2 几个术语简析
  • 3 结构简析
    • 3.1 空间剖分方式
    • 3.2 空间范围表示方式
  • 4 M3DDataInfo.mcj 类定义
  • 5 NodeInfo.json 类定义
  • 6 *.m3d 文件
  • 7. 地质模型几何结构定义
    • 7.1 钻孔模型几何结构定义
    • 7.2 地质剖面模型几何结构定义
    • 7.3 地质体模型几何结构定义
    • 7.4 网格模型几何结构
  • 8 属性文件的设计

都说 “一流企业定标准,二流企业卖品牌,三流企业卖产品,四流企业做项目”,在面向类 WebGL 技术的三维浏览器端渲染的大规模流式数据加载技术中,等到了 MapGIS 主导的 m3d 标准。

1 门派

这一份浓浓的武汉味似乎是想在继 Cesium 3d-Tiles、Esri i3s、超图 S3M 后再在三维市场分一杯羹。

在前言中,吴老爷子带路,洋洋洒洒的一队人。

2 几个术语简析

  • m3d:Model of 3D,在原文第 4 节有指出,但是翻译过来不太对的样子。
  • glbx:glTF 数据规范中,对于 glb 格式的一种变种文件。原文指的是 “gltf数据的扩展格式”,我不清楚 m3d 标准对 gltf 扩展了什么顶层属性,或者是没有好好研究 glTF 规范,因为 glTF 规范本身在几乎所有的属性中都有 extensionsextras 的预留属性,用于扩展各种不同逻辑的业务功能或渲染特征。

3 结构简析

M3D - 一个想突破又还有很多包袱的新生三维数据格式杂谈

结构的设计与 Esri i3s 略相类似,使用 Node 充当空间剖分的术语。

  • M3DDataInfo.mcj:一种 JSON 文本文件,后缀名是 mcj,且此文件的文件名可任意设置,用于描述整份 m3d 数据
  • RootNodeInfo.jsonNodeInfo<i>.json:对 node 的描述文件,文件名可以自定义
  • *.m3d:m3d 文件,一种压缩文件,可选压缩格式有:,后缀名是m3d,文件名可以自定义

每份 m3d 数据,其根目录下有

  • 一个 mcj 文件描述整份数据
  • 一个 Shared 目录存放 Shared.m3d 文件
  • 一个 根节点(RootNode)json 描述文件
  • 一个 Data 目录用于存放子一级的节点目录
    • 每个节点目录下仍能拥有更下一级的节点目录,可递归
    • 每个节点目录下有一个对当前 node 的 json 描述文件
    • 每个节点目录下可拥有 n 个 m3d 文件,这些被称作 “瓦片”,用于管理不同行业的数据(点云.m3d、倾斜摄影模型.m3d、bim.m3d、地质体.m3d)
    • 每个 m3d 文件下压缩了三个目录:GeometryTextureAttribute,分别存放 *.glb/glbx*.jpg/png/webp*.json/bin 文件用于存储几何、纹理、属性数据

3.1 空间剖分方式

规范中的术语是 “数据树形结构”,个人认为使用 空间剖分方式 更好,直观。

使用了三种常规三维数据结构,即空间八叉树、四叉树、KD树。

3.2 空间范围表示方式

  • BoundingBox
  • BoundingSphere

以上两种常见空间范围体二选一。

其中,BoundingBox 使用的定义是 6 元素的 AABB 包围盒,即经纬高三轴的最值。

4 M3DDataInfo.mcj 类定义

描述整个 m3d 文件的 json 文件,它拥有如下顶层属性:

  • asset: string,基本信息,简单的字符串
  • version: string,这个令我十分无语,UML 图中是 string,在文下是 float,我认为 string 更合适。
  • dataName: string,数据名
  • guid: string,数据唯一标识符
  • compressType: string,压缩类型,可选 "zip""7z""rar"
  • spatialReference: string,空间参考,可选 "WGS84""CGCS2000"
  • treeType: string,空间剖分结构,可选 "QuadTree""OCTree""K-DTree""RTree",这点我也有点无语,在前文中并未提及 R树,虽然 R树在空间搜索中还是很常见的。
  • lodType: string,层次细节类型,可选 "ADD""REPLACE"
  • boundingVolume: BoundingVolume
  • position: Point
  • rootNode: Uri
  • fieldInfo: Array

其中,BoundingVolume 在上文已提及,连同 PointField,在此简单使用 Rust 结构体定义:

struct BoundingVolume {   boundingBox: BoundingBox,   boundingSphere: BoundingSphere, }  struct BoundingBox {   left: f64,   top: f64,   right: f64,   bottom: f64,   minHeight: f64,   maxHeight: f64, }  struct BoundingSphere {   center: Point,   radius: f64, }  struct Point {   x: f64,    y: f64,   z: f64, }  struct Field {   name: String,   type: String,   alias: String,   size: i32, }

其中,Field 的 type 字段可选值为 "bool""int16""uint16""int32""uint32""int64""uint64""float""double""wchar""text""date""time""timestamp"

5 NodeInfo.json 类定义

每个节点(node)的描述文件是一个 json 文件,它的顶层属性有:

  • name: string
  • lodLevel: string,用字符串是一个留余量的设计,因为不一定 level 必须是数字
  • boundingVolume: BoundingVolume
  • lodMode: string,可选值 "distance""pixel"
  • lodType: string,可选值 "ADD""REPLACE"
  • lodError: string,切换误差值,单位根据 lodMode 决定
  • transform: float[16],转换矩阵
  • parentNode: NodeInfo
  • childrenNode: Array
  • uri: string
  • shared: Uri
  • tileDataInfoIndex: int,M3D 瓦片索引
  • tileDataInfoList: Array,瓦片数据列表

其中,TileDataInfo 的类定义用 rust 表示可为:

struct TileDataInfo {   tileData: Uri,   geometry: Geometry,   attribute: Attribute,   texture: Uri,   dataType: string, // 可选值 "Vector"、"TiltPhotography"、"Model"、"BIM"、"PointCloud"、"PipeLine"、"GeoModel"、"GeoGrid"、"GeoDrill"、"GeoSection",分别表示:矢量、倾斜、模型、BIM、点云、管线、地质体、地质体网格、地址钻孔、地质剖面 }  struct Geometry {   blobType: string, // 可选值 "glb"、"glbx"   url: string,   geoCompressType: string, // 只能是 "draco"   geometryType: string, // 可选值 "Point"、"Line"、"Polygon"、"Surface"、"Entity" }  struct Attribute {   attType: string, // 可选值 "json"、"bin"   uri: string, }

6 *.m3d 文件

文中对 m3d 的介绍在 7.4 节,就不复述了,主要提一点:

  • glbx:基于 glb 数据扩展了单体化信息及地质体数据信息的几何要素文件,后缀名为.glbx,文件名可自定义。

我觉得这个格式的提出是多余的,槽点最后再谈。

7. 地质模型几何结构定义

由于本部分(原文位于7.4.3节)在原文中较为详细,只捡几个点提一提。

7.1 钻孔模型几何结构定义

略。

7.2 地质剖面模型几何结构定义

剖面使用的是一个点列表表示的简单封闭三维线,这是有缺点的,因为不能表达多剖面的情况。

7.3 地质体模型几何结构定义

地质体在此处使用了多个索引三角面来定义,其实可以完全使用 glTF 来定义,只不过这里简化成了索引+顶点的形式。

7.4 网格模型几何结构

这部分的设计略显冗杂,有重复设计的嫌疑,没有优化。

8 属性文件的设计

属性文件的类型在 M3DDataInfo 对象中定义,见本文第 4 部分。

它使用 “属性记录(Record)” 来描述一个属性,又分了下列两个类定义:

  • 1 门派
  • 2 几个术语简析
  • 3 结构简析
    • 3.1 空间剖分方式
    • 3.2 空间范围表示方式
  • 4 M3DDataInfo.mcj 类定义
  • 5 NodeInfo.json 类定义
  • 6 *.m3d 文件
  • 7. 地质模型几何结构定义
    • 7.1 钻孔模型几何结构定义
    • 7.2 地质剖面模型几何结构定义
    • 7.3 地质体模型几何结构定义
    • 7.4 网格模型几何结构
  • 8 属性文件的设计

都说 “一流企业定标准,二流企业卖品牌,三流企业卖产品,四流企业做项目”,在面向类 WebGL 技术的三维浏览器端渲染的大规模流式数据加载技术中,等到了 MapGIS 主导的 m3d 标准。

1 门派

这一份浓浓的武汉味似乎是想在继 Cesium 3d-Tiles、Esri i3s、超图 S3M 后再在三维市场分一杯羹。

在前言中,吴老爷子带路,洋洋洒洒的一队人。

2 几个术语简析

  • m3d:Model of 3D,在原文第 4 节有指出,但是翻译过来不太对的样子。
  • glbx:glTF 数据规范中,对于 glb 格式的一种变种文件。原文指的是 “gltf数据的扩展格式”,我不清楚 m3d 标准对 gltf 扩展了什么顶层属性,或者是没有好好研究 glTF 规范,因为 glTF 规范本身在几乎所有的属性中都有 extensionsextras 的预留属性,用于扩展各种不同逻辑的业务功能或渲染特征。

3 结构简析

M3D - 一个想突破又还有很多包袱的新生三维数据格式杂谈

结构的设计与 Esri i3s 略相类似,使用 Node 充当空间剖分的术语。

  • M3DDataInfo.mcj:一种 JSON 文本文件,后缀名是 mcj,且此文件的文件名可任意设置,用于描述整份 m3d 数据
  • RootNodeInfo.jsonNodeInfo<i>.json:对 node 的描述文件,文件名可以自定义
  • *.m3d:m3d 文件,一种压缩文件,可选压缩格式有:,后缀名是m3d,文件名可以自定义

每份 m3d 数据,其根目录下有

  • 一个 mcj 文件描述整份数据
  • 一个 Shared 目录存放 Shared.m3d 文件
  • 一个 根节点(RootNode)json 描述文件
  • 一个 Data 目录用于存放子一级的节点目录
    • 每个节点目录下仍能拥有更下一级的节点目录,可递归
    • 每个节点目录下有一个对当前 node 的 json 描述文件
    • 每个节点目录下可拥有 n 个 m3d 文件,这些被称作 “瓦片”,用于管理不同行业的数据(点云.m3d、倾斜摄影模型.m3d、bim.m3d、地质体.m3d)
    • 每个 m3d 文件下压缩了三个目录:GeometryTextureAttribute,分别存放 *.glb/glbx*.jpg/png/webp*.json/bin 文件用于存储几何、纹理、属性数据

3.1 空间剖分方式

规范中的术语是 “数据树形结构”,个人认为使用 空间剖分方式 更好,直观。

使用了三种常规三维数据结构,即空间八叉树、四叉树、KD树。

3.2 空间范围表示方式

  • BoundingBox
  • BoundingSphere

以上两种常见空间范围体二选一。

其中,BoundingBox 使用的定义是 6 元素的 AABB 包围盒,即经纬高三轴的最值。

4 M3DDataInfo.mcj 类定义

描述整个 m3d 文件的 json 文件,它拥有如下顶层属性:

  • asset: string,基本信息,简单的字符串
  • version: string,这个令我十分无语,UML 图中是 string,在文下是 float,我认为 string 更合适。
  • dataName: string,数据名
  • guid: string,数据唯一标识符
  • compressType: string,压缩类型,可选 "zip""7z""rar"
  • spatialReference: string,空间参考,可选 "WGS84""CGCS2000"
  • treeType: string,空间剖分结构,可选 "QuadTree""OCTree""K-DTree""RTree",这点我也有点无语,在前文中并未提及 R树,虽然 R树在空间搜索中还是很常见的。
  • lodType: string,层次细节类型,可选 "ADD""REPLACE"
  • boundingVolume: BoundingVolume
  • position: Point
  • rootNode: Uri
  • fieldInfo: Array

其中,BoundingVolume 在上文已提及,连同 PointField,在此简单使用 Rust 结构体定义:

struct BoundingVolume {   boundingBox: BoundingBox,   boundingSphere: BoundingSphere, }  struct BoundingBox {   left: f64,   top: f64,   right: f64,   bottom: f64,   minHeight: f64,   maxHeight: f64, }  struct BoundingSphere {   center: Point,   radius: f64, }  struct Point {   x: f64,    y: f64,   z: f64, }  struct Field {   name: String,   type: String,   alias: String,   size: i32, }

其中,Field 的 type 字段可选值为 "bool""int16""uint16""int32""uint32""int64""uint64""float""double""wchar""text""date""time""timestamp"

5 NodeInfo.json 类定义

每个节点(node)的描述文件是一个 json 文件,它的顶层属性有:

  • name: string
  • lodLevel: string,用字符串是一个留余量的设计,因为不一定 level 必须是数字
  • boundingVolume: BoundingVolume
  • lodMode: string,可选值 "distance""pixel"
  • lodType: string,可选值 "ADD""REPLACE"
  • lodError: string,切换误差值,单位根据 lodMode 决定
  • transform: float[16],转换矩阵
  • parentNode: NodeInfo
  • childrenNode: Array
  • uri: string
  • shared: Uri
  • tileDataInfoIndex: int,M3D 瓦片索引
  • tileDataInfoList: Array,瓦片数据列表

其中,TileDataInfo 的类定义用 rust 表示可为:

struct TileDataInfo {   tileData: Uri,   geometry: Geometry,   attribute: Attribute,   texture: Uri,   dataType: string, // 可选值 "Vector"、"TiltPhotography"、"Model"、"BIM"、"PointCloud"、"PipeLine"、"GeoModel"、"GeoGrid"、"GeoDrill"、"GeoSection",分别表示:矢量、倾斜、模型、BIM、点云、管线、地质体、地质体网格、地址钻孔、地质剖面 }  struct Geometry {   blobType: string, // 可选值 "glb"、"glbx"   url: string,   geoCompressType: string, // 只能是 "draco"   geometryType: string, // 可选值 "Point"、"Line"、"Polygon"、"Surface"、"Entity" }  struct Attribute {   attType: string, // 可选值 "json"、"bin"   uri: string, }

6 *.m3d 文件

文中对 m3d 的介绍在 7.4 节,就不复述了,主要提一点:

  • glbx:基于 glb 数据扩展了单体化信息及地质体数据信息的几何要素文件,后缀名为.glbx,文件名可自定义。

我觉得这个格式的提出是多余的,槽点最后再谈。

7. 地质模型几何结构定义

由于本部分(原文位于7.4.3节)在原文中较为详细,只捡几个点提一提。

7.1 钻孔模型几何结构定义

略。

7.2 地质剖面模型几何结构定义

剖面使用的是一个点列表表示的简单封闭三维线,这是有缺点的,因为不能表达多剖面的情况。

7.3 地质体模型几何结构定义

地质体在此处使用了多个索引三角面来定义,其实可以完全使用 glTF 来定义,只不过这里简化成了索引+顶点的形式。

7.4 网格模型几何结构

这部分的设计略显冗杂,有重复设计的嫌疑,没有优化。

8 属性文件的设计

属性文件的类型在 M3DDataInfo 对象中定义,见本文第 4 部分。

它使用 “属性记录(Record)” 来描述一个属性,又分了下列两个类定义:

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » M3D – 一个想突破又还有很多包袱的新生三维数据格式杂谈求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们