发明名称 一种三维虚拟场景的植被实时动态绘制方法
摘要 本发明提供一种三维虚拟场景的植被实时动态绘制方法,其以四叉树(Q-Tree)对地形场景进行空间分割,在二维平面上把场景划分为层次化的空间节点,在此基础上,以块(Chunk)为单位,根据植被的体型大小与视点距离Chunk的大小的比值,对植被生成的区域和种类进行控制,确保只在植被分布图对应的区域生成视觉可察觉的植被。本发明可以适用于不同的地形生成算法,能够实现多种类、大面积植被的可控生成和实时绘制,在大面积植被绘制的真实感和实时性之间获得了较好的均衡。
申请公布号 CN104700413A 申请公布日期 2015.06.10
申请号 CN201510126037.3 申请日期 2015.03.20
申请人 中国人民解放军装甲兵工程学院 发明人 梁强;王青海;杜君
分类号 G06T7/00(2006.01)I;G06T17/00(2006.01)I 主分类号 G06T7/00(2006.01)I
代理机构 北京中誉威圣知识产权代理有限公司 11279 代理人 龚镇雄
主权项 一种三维虚拟场景的植被实时动态绘制方法,其特征在于,包括:步骤1:根据三维虚拟场景中植被的分布形成植被分布灰度图,并以一个层对应一种植被类型的方式利用层的形式对所述植被的分布进行标记,同时建立所述植被与所述植被分布灰度图中像素值字节位的对应关系;步骤2:以三维虚拟场景中整个地形场景为根节点,逐级进行分割,直到树的底层叶节点的大小达到指定的最小分割地形块Chunk的大小,建立三维虚拟场景的四叉树分割结构;并为每个底层叶节点表示的Chunk添加一个数组VegFlag[n],其中n为所述植被分布灰度图中像素颜色对应的字节数;所述VegFlag[i]表示当前Chunk内第i种植被的植被实例生成状态,植被实例为某类植被的所有个体集合,具体的:VegFlag[i]=0表示当前Chunk内第i种植被的植被实例尚未生成;VegFlag[i]=1表示当前Chunk内第i种植被的植被实例已经生成,处于活动状态;VegFlag[i]=2表示当前Chunk内第i种植被的植被实例处于内存缓冲状态,暂时储存在内存中;VegFlag[i]=3表示当前Chunk内第i种植被的植被实例处于外存缓冲状态,所述外存缓冲状态指在当前Chunk中第i种植被的植被实例已从内存中清空,但是植被实例的相关信息已经保存在外部临时文件,需要时可直接加载外部临时文件重新生成当前Chunk中第i种植被的植被实例;步骤3:对所有的Chunk进行遍历,以Chunk为单位,根据所述植被分布灰度图实时动态生成对应类型的植被实例:步骤31:对所述三维虚拟场景的四叉树结构进行自顶向下的遍历,判断所有Chunk的有效性,所谓有效性是指Chunk位于三维场景相机的视野范围内:进入视野范围的Chunk具备有效性,执行步骤32;退出视野范围的Chunk无有效性,并根据VegFlag[i]的值判断第i种植被的植被实例是否已生成,如果VegFlag[i]=1,设置VegFlag[i]=2,执行步骤33;如果VegFlag[i]=2,直接执行步骤33;如果VegFlag[i]=0,无需操作;如果VegFlag[i]=3,无需操作;步骤32:对所有的Chunk进行遍历操作,以Chunk为单位进行植被实例的动态生成:步骤321,对于第j个Chunk,根据其四个顶点的空间坐标按照<maths num="0001" id="cmaths0001"><math><![CDATA[<mfenced open='' close=''><mtable><mtr><mtd><mi>w</mi><mo>=</mo><mi>&alpha;</mi><mo>&times;</mo><mrow><mo>(</mo><mi>x</mi><mo>-</mo><msub><mi>x</mi><mn>0</mn></msub><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mi>h</mi><mo>=</mo><mi>&alpha;</mi><mo>&times;</mo><mrow><mo>(</mo><msub><mrow><mi>y</mi><mo>-</mo><mi>y</mi></mrow><mn>0</mn></msub><mo>)</mo></mrow></mtd></mtr></mtable></mfenced>]]></math><img file="FDA0000685687750000021.GIF" wi="302" he="124" /></maths>将空间坐标转换为像素坐标,根据像素坐标获得所述植被分布灰度图中第j个Chunk相应的区域灰度图;其中x<sub>0</sub>为第j个Chunk在世界坐标系x方向上最小值,y<sub>0</sub>为第j个Chunk在世界坐标系y方向上最小值,α为标记精度,表示能够识别植被分布的最小单位,(w,h)为植被分布灰度图的像素坐标;步骤322,对该区域灰度图进行逐像素遍历,对于第i字节位,如果第j个Chunk存在值为1的像素,则说明第i种植被在第j个Chunk中存在,执行步骤323;如果不存在值为1的像素,则说明第i种植被在第j个Chunk中不存在,无需处理;步骤323:对于在第j个Chunk中存在的第i种植被,根据β<sub>i</sub>=h<sub>i</sub>/D计算比值β<sub>i</sub>,h<sub>i</sub>为第i种植被的高度,D为第j个Chunk与视点之间的距离,并进行判断:如果β<sub>i</sub>大于指定阈值,则说明第i种植被在第j个Chunk中存在且可见,执行步骤324;如果β<sub>i</sub>小于指定的阈值,则说明第i种植被在第j个Chunk中存在但不可见,执行步骤325;步骤324:对于第j个Chunk存在且可见的第i种植被,根据VegFlag[i]的值判断第i种植被的植被实例是否已在第j个Chunk中生成,如果VegFlag[i]=1,则无需处理;如果VegFlag[i]=2,则激活内存中第j个Chunk中第i种植被的所有植被实例,设置VegFlag[i]=1;如果VegFlag[i]=3,则加载外部临时文件重新生成第j个Chunk中第i种植被的所有植被实例,并设置VegFlag[i]=1;如果VegFlag[i]=0,则执行第i种植被的植被实例在第j个Chunk动态生成操作;通过以上处理,第j个Chunk中第i种植被的植被实例动态生成完毕;步骤325:对于在第j个Chunk中存在且不可见的第i种植被,根据VegFlag[i]的值判断第i种植被的植被实例是否已在第j个Chunk中生成,如果VegFlag[i]=1,设置VegFlag[i]=2,并设置缓冲时间为0,执行步骤33;如果VegFlag[i]=2,直接执行步骤33;如果VegFlag[i]=0,无需操作;如果VegFlag[i]=3,无需操作;步骤33,在第j个Chunk中对于VegFlag[i]=2即处于内缓冲状态的第i种植被的植被实例进行缓冲时间累加计算,如果在内缓冲状态下的缓冲时间大于给定阈值,在外部临时文件中查找是否存在第j个Chunk中关于第i种植被的缓冲文件,如果存在,则直接将第j个Chunk内第i种植被的所有植被实例进行删除;如果不存在,则将第j个Chunk中第i种植被的所有植被实例的数量、空间坐标、方向、大小写入缓冲文件,然后进行删除,并设置VegFlag[i]=3;步骤4:植被的绘制:对所有的Chunk进行遍历,以Chunk为单位逐个判断VegFlag[i]的值,其中i=0,2…n‑1,如果VegFlag[i]=0或VegFlag[i]=3,说明植被实例不存在,不需要处理;如果VegFlag[i]=2,将第i种植被的植被实例直接设置为不可见;如果VegFlag[i]=1,对第i种植被的植被实例进行可见性冗余处理,所谓可见性冗余处理是将部分位于可见范围边界的本来可见的植被实例强制设置为不可见,并在植被实例绘制时,将植被实例的可见距离减小一个Chunk的对角线长度,在植被实例生成和绘制之间产生至少一个Chunk的过渡带,对于过渡带以外的Chunk,直接以Chunk为单位将第i种植被的所有植被实例设置为可见;对于过渡带中的Chunk,以单个植被实例为对象调用图形API应用程序编程接口进行可见性判断,根据判断的结果对于可见的植被实例进行绘制,对于不可见的植被实例不进行绘制。
地址 100072 北京市丰台区杜家坎21号院