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)
}