一种虚拟人实时绘制方法
技术领域
本发明涉及计算机图形学领域,特别涉及一种虚拟人的实时绘制方法。
背景技术
大规模(万人级)虚拟人的实时绘制技术,能够用来模拟大型体育场馆或地铁站的人群流动,对这些场所的疏散预案进行三维可视化预演;还能够用来生成成千上万的虚拟观众或者军队,从而降低影视制作的成本、提高游戏场景的视觉逼真性。因此,在安全预演、影视制作、游戏娱乐等虚拟现实相关领域具有广泛的应用前景。
在计算机生成空间中逼真地绘制大规模(万人级)虚拟人,由于其需要占用大量的内存、CPU和GPU资源,即使采用目前先进的点采样技术,绘制速度仍很难达到实时要求。为满足实时应用的需要,现有的解决方案采取折衷的策略,通过降低生成的图像质量或者牺牲虚拟人个体的运动独立性来达到实时绘制的目的。关于现有大规模虚拟人的点绘制方法可参考文献1:“M.Wand.Point-BasedMulti-Resolution Rendering.PhD thesis,University of Tübingen,Department ofComputer Science and Cognitive Science,2004.”
因此,研究大规模虚拟人实时绘制技术,在虚拟场景中实时绘制逼真的、个体可独立运动的、万人级大规模虚拟人,不仅有重大的理论意义,也具有广泛的应用领域以及重要的实用价值。
发明内容
本发明的目的是克服现有实时绘制方法需要通过降低图像质量或者牺牲虚拟人个体的运动独立性来达到实时绘制的缺陷,从而提供一种可在虚拟场景中实时绘制逼真的、个体具有独立性的、万人级大规模虚拟人绘制方法。
为了实现上述目的,本发明提供了一种虚拟人实时绘制方法,可用于大规模虚拟人的绘制,包含预处理和实时绘制两部分,其中,所述的预处理部分包含以下步骤:
步骤101)、确定虚拟人的所有可能姿态;
步骤102)、从虚拟人的可能姿态中选择一个,确定该虚拟人姿态模型的紧密八叉树包围盒;
步骤103)、对步骤102)中获得的紧密八叉树包围盒进行放大和平移;
步骤104)、利用点采样技术对步骤103)中放大、平移后的包围盒中的虚拟人姿态模型进行采样,生成由多边形和采样点混合表示的多分辨率模型,并将数据存储于以八叉树表示的数据结构中,得到八叉树结点;
步骤105)、对采样后生成的八叉树结点进行重组;
步骤106)、判断是否还有其他姿态没有处理,如没有,则执行下一步,否则选择一个没有处理过的虚拟人姿态,重新执行步骤102);
步骤107)、所有可能姿态处理完毕,结束对于虚拟人模型的预处理;
所述的实时绘制部分包含以下步骤:
步骤201)、在实时绘制大规模虚拟人前,在内存中建立多边形图元缓冲区和采样点图元缓冲区;
步骤202)、在所要绘制的场景中,选定一个虚拟人,确定虚拟人的当前运动姿态;
步骤203)、根据当前虚拟人的姿态,后序遍历步骤104)得到的八叉树多分辨率模型,求得有效绘制多边形图元和有效绘制采样点图元;对多边形图元执行下一步,对采样点图元执行步骤208);
步骤204)、将有效绘制多边形图元放入多边形图元缓冲区;
步骤205)、判断多边形图元缓冲区是否已满,如满,则执行下一步,否则,转入步骤213);
步骤206)、提交多边形图元到显卡进行绘制,并清空多边形图元缓冲区;
步骤207)、将剩余的有效绘制多边形图元放入多边形图元缓冲区内,执行步骤213);
步骤208)、将有效绘制采样点图元放入采样点图元缓冲区;
步骤209)、判断采样点图元缓冲区是否已满,如满,执行下一步,否则,执行步骤213);
步骤210)、清空采样点图元缓冲区;
步骤211)、提交采样点图元到显卡进行绘制,并清空采样点图元缓冲区;
步骤212)、将剩余的有效绘制采样点图元放入采样点图元缓冲区内;
步骤213):判断在所要绘制的场景中,是否还需要绘制其他虚拟人,如是,则跳转到步骤202),否则执行下一步;
步骤214):所有虚拟人个体绘制完毕。
上述技术方案中,在所述的步骤103)中,对所述的紧密八叉树包围盒进行放大时,放大的倍数根据实际应用中屏幕的分辨率,以及最粗糙模型在屏幕上的投影高度决定。
上述技术方案中,在所述的步骤105)中,所述的对八叉树结点进行重组是将每个结点压缩成32个字节的整数倍大小,然后将同一棵子树的所有结点按先序遍历的方式连续存储。
上述技术方案中,在所述的步骤203)中,所述的有效绘制多边形图元和有效绘制采样点图元是指:对当前视角下的三维虚拟人模型,通过对八叉树多分辨率模型进行遍历,得到的当前情况下能够代替表示原模型的最少图元。
本发明的优点在于:
1、在采样前,通过对紧密八叉树包围盒进行放大和平移,降低最粗糙模型(即八叉树根结点)的图元数目,从而有效的提高了系统可负载的虚拟人规模。
2、在采样后,对八叉树结点进行重组,减少实时绘制时,八叉树的遍历开销,一定程度上降低CPU开销。
3、在实时绘制过程中,对有效绘制图元进行缓冲管理,降低由于频繁地调用、切换绘制命令而带来的CPU、GPU和相应的传输开销。
附图说明
图1为对虚拟人的初始网格模型进行预处理的流程图;
图2为模型当前姿态下紧密八叉树包围盒的示意图;
图3为将紧密包围盒进行放大和平移后生成的最终包围盒的示意图;
图4为八叉树结点重组的示意图;
图5为实时绘制大规模虚拟人的流程图。
具体实施方式
下面结合附图和具体实施方式对本发明的虚拟人实时绘制方法作进一步的说明。
本发明的虚拟人实时绘制方法包括预处理和实时绘制两大部分,其中,所述的预处理部分包含以下步骤:
步骤101、确定虚拟人的所有可能姿态。所述的虚拟人的可能姿态包括站立、行走、卧躺等姿态。虚拟人姿态的确定与虚拟人所在的环境密切相关,在本实施例中,以站立姿态为例进行说明。
步骤102、选定一个姿态,确定虚拟人姿态模型的紧密八叉树包围盒。在本操作步骤中,利用虚拟人的姿态确定模型的紧密八叉树包围盒是一种成熟的现有技术,本领域的普通技术人员无需创造性劳动即可实现。图2就是虚拟人一个站立姿态下紧密八叉树包围盒的示意图。
步骤103、对紧密八叉树包围盒进行放大和平移。在对紧密八叉树包围盒进行放大时,放大的倍数可以根据实际应用中屏幕的分辨率,以及最粗糙模型在屏幕上的投影高度决定,一般情况下,可以对包围盒的边长放大两倍。此外,为节约步骤203中的后序遍历的开销,包围盒放大后还要进行合适平移,以减少采样后生成的结点个数。图3为图2中的紧密八叉树包围盒进行一种典型的放大、平移后的示意图。
步骤104、根据放大平移后的包围盒,再按照参考文献1中所描述的传统点采样技术,对姿态模型进行采样,生成由多边形和采样点混合表示的多分辨率模型,并将数据存储于以八叉树表示的数据结构中。
步骤105、对采样后生成的八叉树结点进行重组。对八叉树结点进行重组的具体实现方法是首先将每个结点压缩成32个字节的整数倍大小,然后将同一棵子树的所有结点按先序遍历的方式连续存储。如图4所示,为一棵八叉树结点重组的示意图。在该图中,(1)为八叉树中的结点在未重组前的存储顺序,在未重组前,结点按照创建的顺序存储,由于堆的复杂性,存储顺序基本是乱序的。这种存储方式不利于对数据的预取,更主要的是不利于对采样数据的存储管理,从而最终严重影响系统的效率。(2)为八叉树中的结点在重组后的存储顺序,重组后的结点按照八叉树中深度优先遍历的顺序存储。采用这种存储方式使得后续的实时绘制中,作为遍历结果的有效图元可以以更加贴近底层硬件的方式提交,从而降低CPU开销、降低数据传输,提高驱动效率。
步骤106、判断是否还有其他姿态没有处理,如没有,则执行下一步,否则选择一个没有处理过的姿态,执行步骤102;
步骤107、所有可能姿态处理完毕,结束对于虚拟人模型的预处理。
所述的实时绘制部分包含以下步骤:
步骤201、在实时绘制大规模虚拟人前,在内存中建立多边形图元缓冲区和采样点图元缓冲区;
步骤202、在所要绘制的场景中,选定一个虚拟人,确定虚拟人的当前运动姿态;在选择虚拟人时,应使得所要绘制场景中的每个虚拟人都被选中一次。
步骤203、根据当前虚拟人的姿态,后序遍历步骤104得到的八叉树多分辨率模型,求得有效绘制多边形图元和有效绘制采样点图元;对多边形图元执行下一步,对采样点图元执行步骤208。
其中,所述的有效图元是指:对当前视角下的三维虚拟人模型,通过对八叉树多分辨率模型进行遍历,得到的那些图元,它们是当前情况下能够代替表示原模型的最少图元,关于有效绘制多边形图元和有效绘制采样点图元的求取是成熟的现有技术,在参考文献1中有详细的描述。在附图4中,含阴影部分的结点就是有效图元,不含阴影的图元则为无效图元。
步骤204、将有效绘制多边形图元放入多边形图元缓冲区;
步骤205、判断多边形图元缓冲区是否已满,如满,则执行下一步,否则,转入步骤213;
步骤206、提交多边形图元到显卡进行绘制,并清空多边形图元缓冲区;
步骤207、将剩余的有效绘制多边形图元放入多边形图元缓冲区内,执行步骤213;
步骤208、将有效绘制采样点图元放入采样点图元缓冲区;
步骤209、判断采样点图元缓冲区是否已满,如满,执行下一步,否则,执行步骤213;
步骤210、清空采样点图元缓冲区;
步骤211、提交采样点图元到显卡进行绘制,并清空采样点图元缓冲区;
步骤212、将剩余的有效绘制采样点图元放入采样点图元缓冲区内;
步骤213:判断在所要绘制的场景中,是否还需要绘制其他虚拟人,如是,则跳转到步骤202,否则执行下一步;
步骤214:所有虚拟人个体绘制完毕。