Open Scene Gragh Binary是OSGB的全称
数据转换
正确的OSGB格式数据
- 倾斜摄影数据仅支持 smart3d 格式的 osgb 组织方式, 数据目录必须有一个
Data
目录的总入口,Data
目录同级放置一个 metadata.xml 文件用来记录模型的位置信息。 - 每个瓦片目录下,必须有个和目录名同名的 osgb 文件,否则无法识别根节点。
- 正确的目录结构如下:
–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..
直接使用下载编译好的程序
输入命令
3dtile.exe [FLAGS] [OPTIONS] --format <osgb,shape,gltf> --input <FILE> --output <FILE>
事例:
3dtile.exe -f osgb -i E:\Data\hgc -o E:\Data\hgc_test
3dtile.exe -f osgb -i E:\Data\dayanta -o E:\Data\dayanta_test -c "{\"offset\": 0}"
3dtile.exe -f shape -i E:\Data\aa.shp -o E:\Data\aa --height height
3dtile.exe -f gltf -i E:\Data\TT\001.osgb -o E:\Data\TT\001.glb
3dtile.exe -f gltf -i E:\Data\TT\001.obj -o E:\Data\TT\001.glb
3dtile.exe -f b3dm -i E:\Data\aa.b3dm -o E:\Data\aa.glb
OSGB元数据
制作好的3dtiles数据
加载
一般情况3dtiles自带坐标,可以直接使用如下代码进行加载:
var tileset = new Cesium.Cesium3DTileset({
url: './3d/tileset.json'
});
viewer.scene.primitives.add(tileset);
viewer.zoomTo(tileset);
如果坐标系有偏移,需要进行矩阵变换
//方法一:
var m = Cesium.Matrix4.fromArray([
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
x, y, z, 1.0
]);
//方法二:
var translation=Cesium.Cartesian3.fromArray([x, y, z]);
m= Cesium.Matrix4.fromTranslation(translation);
var tileset = new Cesium.Cesium3DTileset({
url: './3d/tileset.json', //数据路径
maximumScreenSpaceError: 2, //最大屏幕空间误差
maximumNumberOfLoadedTiles: 1000, //最大加载瓦片个数
modelMatrix: m //转移矩阵
});
注意该数值需要不断的调整来确定3D Tile和底图是否贴合,以及位置是否正确(为了便于确定每次修改后3D Tile改变的位置可以通过一段代码直接将视角锁定3D Tile的位置)
var boundingSphere = null;
function zoomToTileset() {
boundingSphere = tileset.boundingSphere;
viewer.camera.viewBoundingSphere(boundingSphere, new Cesium.HeadingPitchRange(0, -2.0, 0));
viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
}
tileset.readyPromise.then(zoomToTileset);
如上所示代码,在每次加载3D Tile的同时也会锁定其位置。