通过使用共享单元(SharedCellElement)导入了很多的轨枕模型到一个车站工程当中,如图:
但是,由于导入的数量较为庞大(超过1万个),使得浏览模型的时候卡顿比较严重。
现在想要实现一个简单的层次细节模型(LOD),意思就是根据模型的远近展示不同的层次细节。
现在有两个问题:
1、如何判断一个轨枕模型到ORD浏览视角的距离?(也就是判断从我们看这个模型的视点到模型的距离)
2、对于导入的共享单元模型,能否遍历这个模型的所有面片并进行修改?(意思是简化一个模型的面片使得浏览更加流畅)
DGN格式中除了实景模型(Reality Model,3SM格式的外部文件)外,不支持LOD技术,因为它毕竟不是GIS方面的软件而是设计软件。
回答您这两个问题不难,但解决了这两个问题也不能实现LOD的。MS软件后台的显示机制非常复杂,必须从根本上去修改才可能支持LOD的。
在Bentley的Map软件中采用了一个技术,其原理是将大模型划分成多个小的DGN文件,在用户视图变化过程中不断地以参考文件的形式装载或卸载这些小文件从而实现较快的浏览。
当然,您也可以事先创建多个不同LOD的DGN,当用户视角距离对象较远时,切换打开简化的DGN文件。
另外,如果仅仅是浏览模型的话,推荐尝试一下Bentley的iTwin技术,发布成iModel2.0后用iModel Viewer来浏览。
我们想要实现的不仅仅是浏览,后续还想要开发相应的设计功能。
如果浏览比较卡顿的话会十分影响用户体验。
另外,我注意到了ORD在显示大型模型的时候其实也应该是有一个优先加载机制的(尤其是在进行鼠标滚轮缩放的时候)。不知道是否有相应的API能够对模型的加载进行调整。
没有。这些底层的功能没有对我们的二次开发者开放。
--那如果说,我预先按照付老师您说的创建好多个不同精度的dgn,可以实现在另一个dgn里面去动态加载这些不同精度的模型吗?
IViewManager::AddViewMonitor可以添加一个监听器,视图发生变化时,会回调这个监听器的函数。在这个函数里边,通过参数Viewport您可以获取到视图的各种属性,其中有一些名字中带有Camera成员函数,获取相机属性去判断离元素的距离。进而在这个函数里边去更改参考的显示状态。