先看效果,如下图:
其实加载 3dtiles模型 很简单,只需在earth文件中添加:
<ThreeDTiles name="THREED">
<url>./output_1/tileset.json</url>
</ThreeDTiles>
源码分析:
在earth中添加的layer ,开始处在这里:
有时候想打印信息:
打印信息可以用下面这个
OE_WARN << "zty_" << std::endl;
OE_WARN << LC << "zty_" << std::endl;
OE_WARN << LC << "zty_" << _options->url()->full() <<std::endl;
根json文件,正在被打开
其他子json的加载在下面(用的是子线程调用):
LoadTilesetOperation 的 loadTileSet函数 加载 子json文件 生产出
osg::ref_ptr<ThreeDTilesetContentNode> tilesetNode;
把根json在主线程加载完毕后;下一帧的时候,会调用
ThreeDTileNode::traverse(osg::NodeVisitor& nv)
在该函数内,会遍历它的孩子:
下面是上图的整个调用堆栈,省去了中间调用部分截图:
然后再走下去 ,会进入下面的函数:
异步子线程加载完节点后;在下一次遍历中会判断是否有返回值;有返回就进行addChild;添加加载好的节点;如下图是添加节点处:
ThreeDTilesetNode
并没有一直遍历的接口;它创建的对象,是放在ThreeDTilesLayer;如下图:
通过打印相关节点对象;对比发现 b3dm文件代表一个ThreeDTileNode
ThreeDTilesetContentNode
代表每个文件夹下的主json;
解释:
刚开始会创建一个根ThreeDTileNode(它的_content是空的);然后根据根json 上的children的个数, 再创建 N个 ThreeDTileNode(它的_content挂的是ThreeDTilesetContentNode);这个N个ThreeDTileNode 可以理解为 就是子文件夹的个数;他的_content可以理解为 子文件夹上的主json
那b3dm的解析呢?
还是调用
void ThreeDTileNode::traverse(osg::NodeVisitor& nv)