1.总体思路
初始化时加载最大场景,当相机靠近的时候,向服务器发出申请,下载相机可视区域的构件素材,当某一区间由可见变为不可见的时候,将该区域清空,并将该部分的构件存储到本地。利用相机可视区域,物体遮挡来确定场景树,从而减少需要渲染的构件,利用本地构件缓存来优化加载速度。
2.流程图
3.具体实现
3.1构件素材的的处理
在threejs中,每个物体都是由材质和几何体构成的,在建筑模型中,往往有一些构件的信息备注。于是,将素材分为三类:geometries,meterials,userDate,将这三类素材存放在服务器端。
3.2自适应森林的数据结构
自适应多叉树是一种根据改进的八叉树,只有当三维场景的包围盒长宽高比例近似于1:1:1的时候,才按八叉树进行划分。如果有一边相对于另外两边过长,则按照二叉树进行划分,如果有一边相对于另外两边过短,则按照四叉树进行划分。也就是自适应多叉树的非叶子节点分为八叉、四叉和二叉三种情况,这样能保证最终得到的叶子结点的包围盒趋近于正方体。包围盒趋近于正方体的好处是包围盒内三维场景的包围球中场景密度最高,计算视野范围内是否存在包围球的效果最好。
3.3视域剔除
首先将计算出物体包裹球的半径和坐标,因为相机是可移动的,所以我们先通过坐标变换将相机移到原点,我们只需要根据相机和物体 位置即可以判断出该物体是否在视野中,如果在视野中就添加到场景树中。如果物体由可见变为不可见,我们将改物体的信息存在本地的缓存当中,以便后续的使用。
3.4遮挡剔除
在渲染大规模场景中,假设视野中有一堵墙将后面的物体都挡住了,这时候只需要渲染这一堵墙,而不渲染后面的物体,这样可以加快渲染的速度。在实现这一功能时,需要先判断视野和物体是否在遮挡物的两侧,然后判断物体是否在视线和遮挡面构成的空间(与视野相隔的空间)中,若在则不可见,否则为可见。
3.5LOD层次细节算法(目前没实现)
我的理解是:
一,不在照相机视景体内的网格部分将不会被绘制。
二,距离相机视点远的地方网格以低分辨率来绘制,近的地方以高分辨率来绘制。
三,粗糙的部分以高分辨率绘制,平坦的部分以较低的分辨率来绘制。