============ 三维数据模型 ============ .. index:: 三维数据 三维数据模型 ============ 请注意,需要计算机图形学的知识,而且至少要完整学完 `Games101 `_ 的课在看这个,不然三维数据里的纹理材质那块可能完全看不懂,至于GLTF等标准里的动画和蒙皮的部分,得深入了解一下三维动画才行,我建议是要么学一下Blender或者 C4D 等建模软件,了解建模到动画整个流程,或者找个 MMD 教程照着学一下,快速了解即可,GIS里用到这块很少的。 三维数据有很多种,GIS中一般是有几种: - BIM模型其实GIS里用的不多,最常用的是管道,建筑结构方面用的,毕竟其实GIS分析还是偏宏观,而BIM对GIS来说太细了,更偏向建筑专业了,隔行如隔山。GIS里的BIM可能是指LOD3,甚至只有LOD2的细节,不是一个东西。软件一般是Revit。 - 倾斜摄影模型:一般来说是 OSGB 模型,使用 smart3d 之类的软件弄的,一般有很多层级,方便观看,类似栅格数据中有金字塔的 GeoTiff。 - 点云数据:一般要用 pdal 处理,渲染点云,去噪,提取,抽稀都是技术,说白了就是一大堆点,可以看看B站上影视飓风介绍点云和倾斜摄影那两期,现在用无人机拍出来然后点云和倾斜摄影出来的已经可以比较精细的建模了(其实有部分算是渲染技术,例如 3DGS)。 - 单体模型:传统的三角面 Mesh 模型,例如独栋建筑,室内的摆件等独立 Obj 或者类似的模型。 现在三维大范围场景最常用的一般是 osgb 数据或者 3dtiles 数据。一种是老版本的本地数据,一种是Cesium 出品的适配网络的三维数据。 小场景的就有很多种了,3ds,GLTF,obj等等,但是其实都类似。 具体来说,各种格式的应用场景如下: * OBJ 和 PLY 适合简单的静态模型和 3D 打印,PLY 文件还用于点云的存储。 * GLTF 和 FBX 针对实时渲染和复杂场景优化。 * STL 专注于 3D 打印的几何数据。 * USD 和 Collada 用于电影和游戏中的复杂场景管理。 三维的标准没有那么明确,因此这里只介绍一下 GIS 中常用的几种: * :ref:`obj_format` * :ref:`ply_format` * :ref:`gltf_format` * :ref:`3dtiles_format` .. _obj_format: OBJ 格式 +++++++++++ OBJ(Wavefront Object)是一种简单的三维模型文件格式,由 Wavefront Technologies 开发,最初用于其 Advanced Visualizer 软件。它是一种文本格式,易于阅读和编辑,广泛用于存储和交换静态三维模型数据。 格式构成 -------- OBJ 文件由多个部分组成,每部分以关键字开头,定义模型的几何和材质信息。以下是主要的关键字及其含义: 1. **顶点数据** - ``v x y z``: 定义顶点的坐标 (x, y, z)。 - ``vt u v``: 定义纹理坐标 (u, v)。 - ``vn x y z``: 定义法线向量 (x, y, z)。 2. **面片数据** - ``f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 ...``: 定义面片(多边形),由顶点、纹理坐标和法线索引组成。索引从 1 开始。 3. **材质数据** - ``mtllib filename.mtl``: 引用外部材质库文件(.mtl)。 - ``usemtl material_name``: 指定当前使用的材质。 4. **其他** - ``#``: 注释行,用于添加说明信息。 - ``o object_name``: 定义对象名称。 - ``g group_name``: 定义组名称。 示例 OBJ 文件内容: .. code-block:: text # 顶点坐标 v 1.0 0.0 0.0 v 0.0 1.0 0.0 v 0.0 0.0 1.0 # 纹理坐标 vt 0.0 0.0 vt 1.0 0.0 vt 0.0 1.0 # 法线向量 vn 0.0 0.0 1.0 # 面片 f 1/1/1 2/2/1 3/3/1 优缺点 ------ **优点:** 1. **简单易读**:OBJ 是文本格式,易于阅读、编辑和调试。 2. **广泛支持**:几乎所有的 3D 建模软件和渲染引擎都支持 OBJ 格式。 3. **灵活性**:支持顶点、纹理坐标、法线和面片数据,适合存储静态模型。 **缺点:** 1. **功能有限**:不支持动画、骨骼、灯光或复杂场景结构。 2. **文件体积大**:文本格式导致文件体积较大,尤其是对于复杂模型。 3. **性能较低**:由于是文本格式,解析和加载速度较慢。 应用场景 -------- 1. **3D 打印**:OBJ 格式常用于 3D 打印领域,因为它能够精确表示几何形状。 2. **离线渲染**:在电影制作和静态渲染中,OBJ 格式用于存储和交换模型数据。 3. **教育和研究**:由于其简单性,OBJ 格式常用于教学和科研中的三维模型处理。 4. **模型交换**:作为一种通用格式,OBJ 常用于不同 3D 软件之间的模型交换。 总结 ---- OBJ 格式是一种简单且广泛支持的三维模型文件格式,适合存储静态模型和进行模型交换。尽管功能有限且文件体积较大,但其易读性和通用性使其在 3D 打印、离线渲染和教育领域仍然具有重要地位。 .. _ply_format: PLY 格式 +++++++++++++ PLY(Polygon File Format)是一种灵活的三维模型文件格式,由斯坦福大学开发,最初用于存储 3D 扫描数据。它支持存储多边形网格和点云数据,广泛应用于计算机图形学、3D 扫描和科学研究领域。 格式构成 -------- PLY 文件由文件头和数据部分组成,支持文本格式(ASCII)和二进制格式。以下是 PLY 文件的主要结构: 1. **文件头** - 文件头以 ``ply`` 开头,以 ``end_header`` 结束。 - 包含格式声明(ASCII 或二进制)、元素类型(如顶点、面片)及其属性(如坐标、颜色、法线等)。 2. **元素定义** - ``element vertex ``: 定义顶点元素及其数量。 - ``element face ``: 定义面片元素及其数量。 - ``property ``: 定义元素的属性(如坐标、颜色、法线等)。 3. **数据部分** - 根据文件头定义的元素和属性,按顺序存储数据。 示例 PLY 文件内容(ASCII 格式): .. code-block:: text ply format ascii 1.0 comment Created by a tool element vertex 3 property float x property float y property float z element face 1 property list uchar int vertex_indices end_header 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 3 0 1 2 优缺点 ------ **优点:** 1. **灵活性**:支持自定义属性(如颜色、法线、透明度等),适合存储复杂的点云和多边形网格数据。 2. **多格式支持**:支持 ASCII 和二进制格式,便于调试和高效存储。 3. **广泛支持**:被许多 3D 软件和库(如 MeshLab、PCL)支持。 **缺点:** 1. **文件体积较大**:尤其是 ASCII 格式,文件体积较大。 2. **功能有限**:不支持动画、骨骼或复杂场景结构。 应用场景 -------- 1. **3D 扫描与点云处理** - PLY 格式广泛用于存储 3D 扫描数据,支持点云和多边形网格的存储。 - 点云数据通常包含大量顶点,PLY 格式的灵活性使其能够存储额外的属性(如颜色、法线、强度等),适用于激光雷达(LiDAR)和深度相机数据。 2. **计算机图形学** - 用于存储和交换多边形网格数据,支持渲染和几何处理。 3. **科学研究** - 在计算机视觉、机器人学和地理信息系统(GIS)中,PLY 格式用于存储和分析三维数据。 4. **3D 打印** - 用于存储和传输 3D 打印模型数据。 点云应用 -------- PLY 格式在点云数据处理中具有重要地位,主要应用于以下场景: 1. **3D 扫描与重建** - 3D 扫描设备(如激光扫描仪、结构光扫描仪)生成的原始数据通常是点云,PLY 格式能够高效存储这些数据,并支持后续的重建和处理。 2. **LiDAR 数据处理** - 激光雷达(LiDAR)生成的点云数据通常包含坐标、强度、颜色等信息,PLY 格式能够灵活存储这些属性,适用于自动驾驶、地形测绘等领域。 3. **深度相机数据** - 深度相机(如 Kinect)生成的深度图可以转换为点云数据,PLY 格式用于存储和处理这些数据,应用于手势识别、场景重建等。 4. **点云分析与可视化** - PLY 格式支持存储点云的附加属性(如法线、颜色),便于点云的分析(如分割、分类)和可视化。 总结 ---- PLY 格式是一种灵活且功能强大的三维模型文件格式,特别适合存储点云和多边形网格数据。其在 3D 扫描、点云处理、计算机图形学和科学研究中具有广泛应用,尽管功能有限且文件体积较大,但其灵活性和广泛支持使其成为三维数据处理的重要工具。 .. _gltf_format: GLTF 格式 +++++++++++++++ GLTF(GL Transmission Format)是一种高效的三维模型文件格式,由 Khronos Group 开发,旨在成为“3D 领域的 JPEG”。它专为实时渲染和 Web 应用优化,支持复杂的场景、动画、材质和 PBR(基于物理的渲染)工作流,广泛应用于游戏、虚拟现实(VR)和增强现实(AR)等领域。GLTF 格式详解可以参考 `GLTF Overview `_ 文档。 格式构成 -------- GLTF 文件采用 JSON 格式描述场景结构,并支持嵌入或外部分配资源(如纹理、动画数据)。以下是 GLTF 文件的主要组成部分: 1. **JSON 描述文件** - 包含场景的层次结构、节点、网格、材质、动画和相机等信息。 - 使用 JSON 格式,易于阅读和解析。 2. **二进制数据(.bin 文件)** - 存储顶点、索引、动画、蒙皮等二进制数据。 - 通过 JSON 文件中的 ``buffer`` 和 ``bufferView`` 引用。 3. **纹理和图像** - 纹理数据可以嵌入到 GLTF 文件中(Base64 编码),或作为外部文件(如 PNG、JPEG)引用。 4. **扩展和附加功能** - GLTF 支持扩展(extensions)和附加功能(extras),允许开发者自定义数据和行为。 示例 GLTF 文件结构: .. code-block:: json { "scenes": [ { "nodes": [0] } ], "nodes": [ { "mesh": 0 } ], "meshes": [ { "primitives": [ { "attributes": { "POSITION": 1, "NORMAL": 2, "TEXCOORD_0": 3 }, "indices": 0, "material": 0 } ] } ], "materials": [ { "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 } } } ], "textures": [ { "source": 0 } ], "images": [ { "uri": "texture.png" } ], "buffers": [ { "uri": "data.bin", "byteLength": 1024 } ], "bufferViews": [ { "buffer": 0, "byteOffset": 0, "byteLength": 512 } ], "accessors": [ { "bufferView": 0, "componentType": 5123, "count": 256, "type": "SCALAR" } ] } 优缺点 ------ **优点:** 1. **高效性**:GLTF 采用二进制数据存储,文件体积小,加载速度快。 2. **多功能性**:支持复杂的场景、动画、材质、PBR 渲染和蒙皮。 3. **跨平台支持**:被大多数现代 3D 引擎(如 Three.js、Babylon.js)和工具(如 Blender、Unity)支持。 4. **Web 友好**:专为 Web 应用优化,适合在线 3D 内容展示。 **缺点:** 1. **复杂性**:对于简单模型,GLTF 的配置和生成可能过于复杂。 2. **兼容性**:某些旧版软件或工具可能不完全支持 GLTF 2.0 标准。 3. **学习曲线**:理解和使用 GLTF 的高级功能(如扩展、蒙皮)需要一定的学习成本。 应用场景 -------- 1. **游戏开发** - GLTF 格式广泛用于实时游戏引擎(如 Unity、Unreal Engine)中,支持复杂的场景和动画。 2. **Web 3D 应用** - 由于其高效性和 Web 友好性,GLTF 是 WebGL 和 WebXR 应用的首选格式,适用于在线 3D 展示和交互。 3. **虚拟现实(VR)和增强现实(AR)** - GLTF 支持 PBR 材质和动画,适合 VR/AR 应用中的高质量渲染。 4. **3D 内容分发** - GLTF 格式被用于在线 3D 模型库(如 Sketchfab)和电子商务平台,用于展示和分享 3D 内容。 5. **建筑可视化** - 在建筑和设计领域,GLTF 用于展示复杂的三维场景和模型。 总结 ---- GLTF 是一种高效、多功能的三维模型文件格式,专为实时渲染和 Web 应用优化。它在游戏开发、Web 3D 应用、VR/AR 和 3D 内容分发中具有广泛应用,尽管其复杂性和学习曲线较高,但其高效性和跨平台支持使其成为现代 3D 图形领域的标准格式之一。 .. _3dtiles_format: 3D Tiles 格式 +++++++++++++++++++++++++ 3D Tiles 是一种用于高效流式传输和渲染大规模3D地理空间数据的开放标准格式。它由Cesium团队开发,旨在支持海量的3D地理信息数据(如城市建筑、地形、点云等)的实时可视化。3D Tiles 基于层次细节(LOD)和空间索引技术,能够动态加载和渲染数据,适用于Web和桌面应用。详细解析可以参考 `3D Tiles标准解析 `_ 格式构成 -------- 3D Tiles 格式由以下几个核心部分组成: 1. **Tileset** - 描述整个数据集的层次结构和元数据。 - 使用JSON格式定义,包含根Tile、空间范围、几何误差等信息。 2. **Tile** - 数据集中的一个节点,可以是单个模型或一组子Tile。 - 每个Tile包含空间范围、几何误差、内容链接等属性。 3. **Content** - Tile的实际数据内容,可以是3D模型、点云、矢量数据等。 - 支持多种格式,如B3DM(Batched 3D Model)、PNTS(Point Cloud)、I3DM(Instanced 3D Model)等。 4. **Hierarchy** - 基于空间索引的层次结构(通常是四叉树或八叉树)。 - 支持动态加载和卸载,优化渲染性能。 5. **Metadata** - 可选的元数据,用于描述Tile的属性或附加信息。 - 支持自定义扩展,满足特定需求。 6. **Extensions** - 支持自定义扩展,允许开发者添加额外的功能或数据。 优缺点 ------ **优点:** - **高效性**:基于LOD和空间索引技术,能够动态加载和渲染大规模数据。 - **灵活性**:支持多种数据类型(如模型、点云、矢量数据)和格式。 - **跨平台**:适用于Web和桌面应用,兼容CesiumJS等主流3D引擎。 - **可扩展性**:支持自定义扩展和元数据,满足特定需求。 **缺点:** - **复杂性**:对于小型数据集,3D Tiles可能显得过于复杂。 - **生成成本**:将大规模数据转换为3D Tiles格式需要较高的计算资源。 - **学习曲线**:对于新手开发者,理解和实现3D Tiles可能需要一定时间。 应用场景 -------- 3D Tiles 格式广泛应用于以下场景: 1. **数字城市** - 用于可视化大规模城市建筑、道路、地形等数据。 - 支持实时交互和高性能渲染。 2. **地理信息系统(GIS)** - 用于展示和分析地理空间数据,如地形、河流、植被等。 - 支持多种数据类型和格式。 3. **点云可视化** - 用于渲染大规模点云数据,如激光扫描数据。 - 支持高效的流式传输和渲染。 4. **虚拟现实(VR)和增强现实(AR)** - 用于创建和传输高质量的3D地理空间内容,提供沉浸式体验。 5. **智慧城市** - 用于展示和管理城市基础设施、交通、环境等数据。 - 支持实时更新和交互。 实例 ---- 以下是一个简单的3D Tiles Tileset JSON文件示例: .. code-block:: json { "asset": { "version": "1.0", "tilesetVersion": "1.0.0" }, "geometricError": 500, "root": { "boundingVolume": { "region": [-1.31968, 0.698786, -1.31966, 0.698788, 0, 100] }, "geometricError": 500, "refine": "ADD", "content": { "uri": "tiles/tile.b3dm" }, "children": [ { "boundingVolume": { "region": [-1.31968, 0.698786, -1.31966, 0.698788, 0, 50] }, "geometricError": 250, "content": { "uri": "tiles/tile_child.b3dm" } } ] } } 在这个示例中,`tileset.json` 文件描述了整个数据集的层次结构和元数据,而 `tile.b3dm` 和 `tile_child.b3dm` 文件包含了实际的3D模型数据。 总结 ---- 3D Tiles 格式作为一种高效、灵活的地理空间数据格式,广泛应用于数字城市、GIS、点云可视化等领域。其基于LOD和空间索引的技术优势使其能够处理大规模数据,并支持实时交互和高性能渲染。尽管存在一定的复杂性和生成成本,但随着技术的不断发展,3D Tiles 格式的应用前景将更加广阔。