Open Scene Gragh Binary是OSGB的全称

数据转换

OSGB->3dtiles

正确的OSGB格式数据

  1. 倾斜摄影数据仅支持 smart3d 格式的 osgb 组织方式, 数据目录必须有一个Data 目录的总入口, Data目录同级放置一个 metadata.xml 文件用来记录模型的位置信息。
  2. 每个瓦片目录下,必须有个和目录名同名的 osgb 文件,否则无法识别根节点。
  3. 正确的目录结构如下:

–metadata.xml
–Data\Tile_000_000\Tile_000_000.osgb

工具:

The fastest tools for 3dtiles convert in the world! include these tools: osgb => 3dtile , convert huge of osgb file to 3dtiles. shapefile => 3dtile, convert shape file to 3dtiles. fbx => 3dtile, convert fbx file to 3dtile, include auto_lod\texture convert etc..

直接使用下载编译好的程序
image.png

输入命令

  1. 3dtile.exe [FLAGS] [OPTIONS] --format <osgb,shape,gltf> --input <FILE> --output <FILE>

事例:

  1. 3dtile.exe -f osgb -i E:\Data\hgc -o E:\Data\hgc_test
  2. 3dtile.exe -f osgb -i E:\Data\dayanta -o E:\Data\dayanta_test -c "{\"offset\": 0}"
  3. 3dtile.exe -f shape -i E:\Data\aa.shp -o E:\Data\aa --height height
  4. 3dtile.exe -f gltf -i E:\Data\TT\001.osgb -o E:\Data\TT\001.glb
  5. 3dtile.exe -f gltf -i E:\Data\TT\001.obj -o E:\Data\TT\001.glb
  6. 3dtile.exe -f b3dm -i E:\Data\aa.b3dm -o E:\Data\aa.glb

image.png

OSGB元数据

image.png
image.png

制作好的3dtiles数据

image.png
image.png

加载

一般情况3dtiles自带坐标,可以直接使用如下代码进行加载:

  1. var tileset = new Cesium.Cesium3DTileset({
  2. url: './3d/tileset.json'
  3. });
  4. viewer.scene.primitives.add(tileset);
  5. viewer.zoomTo(tileset);

如果坐标系有偏移,需要进行矩阵变换

  1. //方法一:
  2. var m = Cesium.Matrix4.fromArray([
  3. 1.0, 0.0, 0.0, 0.0,
  4. 0.0, 1.0, 0.0, 0.0,
  5. 0.0, 0.0, 1.0, 0.0,
  6. x, y, z, 1.0
  7. ]);
  8. //方法二:
  9. var translation=Cesium.Cartesian3.fromArray([x, y, z]);
  10. m= Cesium.Matrix4.fromTranslation(translation);
  11. var tileset = new Cesium.Cesium3DTileset({
  12. url: './3d/tileset.json', //数据路径
  13. maximumScreenSpaceError: 2, //最大屏幕空间误差
  14. maximumNumberOfLoadedTiles: 1000, //最大加载瓦片个数
  15. modelMatrix: m //转移矩阵
  16. });

注意该数值需要不断的调整来确定3D Tile和底图是否贴合,以及位置是否正确(为了便于确定每次修改后3D Tile改变的位置可以通过一段代码直接将视角锁定3D Tile的位置)

  1. var boundingSphere = null;
  2. function zoomToTileset() {
  3. boundingSphere = tileset.boundingSphere;
  4. viewer.camera.viewBoundingSphere(boundingSphere, new Cesium.HeadingPitchRange(0, -2.0, 0));
  5. viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
  6. }
  7. tileset.readyPromise.then(zoomToTileset);

如上所示代码,在每次加载3D Tile的同时也会锁定其位置。