Skip to content

3dtiles数据规范

一份 3dTiles数据集包含 入口文件是 tileset.json各级瓦片用文件夹(目录)来组织,其中tile可以是.b3dm、.i3dm、.pnts、.vctr和.cmpt中的任一种格式文件,tileset.json是一个 json 文件,描述了整个三维瓦片数据集。官方链接 https://docs.ogc.org/cs/18-053r2/18-053r2.html

{
  "asset": {
    "version": "1.0"
  },
  "geometricError": 500,
  "root": {
    "boundingVolume": {
      "region": [
        2.029807563723424,
        0.7010983149176563,
        2.029841429126092,
        0.7011168091002963,
        0,
        6.08364
      ]
    },
    "geometricError": 500,
    "refine": "ADD",
    "children": [
      {
        "boundingVolume": {
          "region": [
            2.0298137551820834,
            0.7010983149176563,
            2.0298387086366807,
            0.7011152320769704,
            0,
            6.08364
          ]
        },
        "geometricError": 0,
        "content": {
          "uri": "RjuJzV8h.b3dm"
        },
        "properties": {
          "code": "RjuJzV8h",
          "height": 6.08364
        }
      }
    ],
    "transform": [
      -0.8660254037844388,-0.4999999999999999, 0, 0,
      0.38302222155948895, -0.6634139481689385, -0.6427876096865394,0,
      0.3213938048432696, -0.5566703992264195, 0.7660444431189781,0,
      -2162445.111079245, 4375302.7564566415,4092470.3198229605,1
    ]
  }
}

1.1、顶级属性:asset、root、geometricError

  • asset:有关整个tileset的元数据,应用于特定程序的数据有glTF版本号,生成工具等。
  • root:3D Tiles tileset中的根切片。
  • geometricError:几何误差,表示简化后的切片/瓦片(tile)与原始几何图形的差异(米为单位)。

1.2、其他属性:children、refine、content、boundingVolume、transform、viewerRequestVolume

  • children 子切片内容都由其父切片的边界范围框完全包围,并且通常具有小于其父切片的几何误差。
  • refine (细化):替换 (“REPLACE”),则子图块将代替父图块进行渲染,即不再呈现父图块,附加 (“ADD”),除了父平铺之外,还会渲染子平铺。
  • boundingVolume (边界范围框):作用:1、告诉渲染引擎“瓦片在什么空间范围内存在”,用于快速判断是否需要加载或渲染该瓦片。2、结合 geometricError做LOD 控制,有box、region、sphere 三种模式
    • box(Center(x,y,z), X-axis(x,y,z), Y-axis(x,y,z), Z-axis(x,y,z)) 在WGS椭球对应的地心笛卡尔坐标系下
    • region(west, south, east, north, minHeight, maxHeight) 经纬度坐标系转换为弧度,高度单位为米
    • sphere(Center(x,y,z), radius) 地心笛卡尔坐标系,半径为米
  • viewerRequestVolume 根据 视点(摄像机)的位置或范围 动态决定是否请求和显示特定瓦片,可以更好优化加载效率,和动态 LOD 切换,展示细节。
  • transform 模型的具体坐标位置通常由模型内部数据或transform矩阵决定,正常我们从obj或者gltf转过来的数据,内部坐标在原点,需要用到transform

1.3、transform 矩阵

"transform": [
  1, 0, 0, 0,     
  0, 1, 0, 0,
  0, 0, 1, 0,
  X, Y, Z, 1     
]
  • 左上 3x3 部分 控制线性变换(旋转、缩放)
  • 左下 X, Y, Z控制平移,用笛卡尔坐标系表示

用法:

// tx: 经度,ty: 纬度,tz: 高度
// rx: 俯仰(pitch),机头上下摇摆
// ry: 滚转(roll),机身绕中轴线旋转
// rz:偏航(heading),即机头朝左右摇摆
// scales放大系数

function getTransform(tx, ty, tz, rx, ry, rz, scales) {

    let mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(rx));
    let my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(ry));
    let mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(rz));
    let rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
    let rotationY = Cesium.Matrix4.fromRotationTranslation(my);
    let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);

    //平移
    let position = Cesium.Cartesian3.fromDegrees(tx, ty, tz);
    let m = Cesium.Transforms.eastNorthUpToFixedFrame(position);

    let scale = Cesium.Matrix4.fromUniformScale(scales);

    // //缩放
    Cesium.Matrix4.multiply(m, scale, m);

    //旋转、平移矩阵相乘
    Cesium.Matrix4.multiply(m, rotationX, m);
    Cesium.Matrix4.multiply(m, rotationY, m);
    Cesium.Matrix4.multiply(m, rotationZ, m);

    console.log(m)
}