四叉树,分为父节点,当前节点和四个子节点六个节点指针,根节点没有父节点,叶子节点没有子节点。
过程分为初始化,瓦片数据更新,和回收
1,初始化,
(1)设定初始位置,并根据给定坐标确定包围盒 ,如果是世界坐标,则转为经纬度,这样可以知道用的哪块瓦片数据(即序号第几行第几列),这个瓦片数据的行列和级别,可以组合成需要的瓦片名称,从而生成该四叉树节点需要的纹理。该节点给予有图像标志和可渲染标志
(2)与监控类指针进行关联,这个监控类同时也是渲染类,在异步渲染和要求节点所需数据时起到作用,同时也是生产者与消费者过程中的消费者部分(生产者为要求的瓦片名称,消费者是根据瓦片名称生成纹理)
(3)从根节点开始到子节点的顺序遍历。首先判断是否是根节点,如果没有父节点,则是根节点,则获取根节点的瓦片数据(通过监控类),
,如果不是根节点,也就是向下走了,则可以先从左上子节点进行遍历,依次获取数据。
(4)对四叉树节点记上标志,是否有数据,是否被剔除,是否可以被渲染,获取纹理的节点是可以被渲染的。
(5)用的是三维纹理,所以每个节点都要有相对于根节点的纹理坐标。根节点UV起始坐标是(0.0,0.0),终止UV坐标是(1.0,1.0);其他节点根据父节点的uv坐标和中心点的UV坐标,计算出该节点的UV坐标。递归
2,数据更新
(1)首先用摄像机六棱锥进行剔除不在可视范围内的节点,减少数据,具体方法就是判断节点的包围盒是否与六棱锥相交
(2)根据摄像机与各个节点的包围盒中心的距离确定级别以及是否可视。如果不可视则回收该节点的子节点。如果可视且没有子节点且有瓦片数据则裂分为4个子节点,否则 ,如果没子节点,则认为是叶子节点,给予该节点可渲染标志,否则递归更新子节点数据
3,瓦片数据的渲染
(1)对于所有的子节点,先通过递归查找带有可渲染标志的,放入可渲染四叉树节点集合中。
(2)通过节点集合查找相应的顶点数组
(3)根据三维纹理数组,进行渲染