很久都没写文章了,最近实在是太忙了,向各位关注我的小伙伴致个歉!
最近没事儿写了个模型树和模型关联的功能,处理工具是用的cesiumlab。
说明一下为什么要用cesiumlab:
网上现在有很多的模型转换工具,如obj23dtiles等均可以对非3dtiles的模型进行处理,为何非得用cesiumlab呢?!主要是因为此功能想实现构件的详细展示,即点击节点实时展示对应的构件,故试用cesiumlab可以生成构件的节点树,即scenetree.json!
这样在模型加载的时候,在ajax这个树节点的json文件,即可加载对应的节点了!
模型处理过程:
1、试用cesiumlab将rvt2018的模型文件转为clm(clm为cesiumlab的自定义的格式),如果你的文件不是revit2018的,那么你得先将模型升级到2018。
2、处理clm格式的模型文件,对模型文件进行切片,转为cesium支持的3dtiles文件,在转换的过程中,如果你对加载速度有要求,请选择纹理和顶点压缩。
3、将3dtiles模型文件进行发布。(发布过程参考我前面的文章)。
以上及完成了模型的转换及发布,但是转换过程中遇到了几个坑,就不一一赘述了。
部分代码解析(一下借鉴了火星科技的模型,如有侵权请告知修改!):
先大致说下实现了的功能:
1、加载了bim模型及添加了左侧模型树,将树节点和模型关联:双击树节点可以定位到模型中具体的位置,树节点勾选显示,不勾选隐藏!
2、添加了属性弹窗,点击模型时,会弹出模型的详细信息!
主要是实现了这两个功能,下面说下难点:
a):模型添加后,将模型定位到正确的位置,以下是定位的方法,此方法值能够进行定位,对模型进行旋转,并未用到,所以没加:
Cesium.Transforms.eastNorthUpToFixedFrame(position);
b):模型树和模型构件的关联,此处即实现了点击模型树定位到具体构件的功能
var center = new Cesium.Cartesian3(nodesphere[0], nodesphere[1], nodesphere[2]);
if (orginMatrixInverse && tileset._root.transform) {
var mat = Cesium.Matrix4.multiply(tileset._root.transform, orginMatrixInverse, new Cesium.Matrix4());
center = Cesium.Matrix4.multiplyByPoint(mat, center, new Cesium.Cartesian3());
}
var sphere = new Cesium.BoundingSphere(center, nodesphere[3]);
注:当你移动了模型位置后,此处定位有偏差,故得进行位置转换(此处也是此功能最精华的地方!);当然如果你有不懂的地方也可以私信我。