实时虚拟场景中圆柱碰撞体与凸体碰撞探测的方法和系统的制作方法_3

文档序号:9751049阅读:来源:国知局
体可为有向盒或凸多面体,有向盒是指长方体或正方体等。凸多面体可 为多边形棱柱等。
[0073 ]步骤710,将该凸体的各个边方向与该预设多边形的边方向和棱柱的棱的边方向 分别做向量积。
[0074] 具体地,将凸体的每个边方向分别与预设多边形的边方向做向量积,凸体的每个 边方向分别与棱柱的棱的边方向做向量积。
[0075] 步骤712,将该预设多边形棱柱各个面的法向、凸体的各个面的法向及该向量积中 一种或多种作为测试轴。
[0076] 具体地,测试轴可包括预设多边形棱柱的各个面的法向、凸体的各个面的法向、凸 体的各个边方向与预设多边形的边方向的向量积、凸体的各个边方向与预设多边形棱柱的 棱的边方向的向量积中一种或多种。也就是,测试轴可选用预设多边形棱柱的各个面的法 向,或者选择凸体的各个面的法向,或者选择凸体的各个边方向与预设多边形的边方向的 向量积,或者选择凸体的各个边方向与预设多边形棱柱的棱的边方向的向量积,或者选择 它们中的几种组合等。测试轴的选取若太少,可能会把不相交误报为相交,选得过多,则可 能影响性能。
[0077] 步骤714,根据各测试轴及预设多边形棱柱在凸体的局部坐标系下的位置得到圆 柱碰撞体在测试轴上的投影长度及投影位置,并获取凸体在各测试轴上的投影。
[0078] 本实施例中,当圆柱碰撞体转换的预设多边形棱柱变换到凸体的局部坐标系后不 为圆柱碰撞体,则对预设多边形棱柱在凸体的局部坐标系下的各个顶点进行投影,取极值 做差得到圆柱碰撞体的投影长度。
[0079] 具体地,以十六多边形棱柱为例,对在凸体的局部坐标系下的十六多边形棱柱的 三十二个顶点进行投影,取极值,得到最大极值顶点和最小极值顶点,求取最大极值顶点和 最小极值顶点投影后的差值的绝对值作为圆柱碰撞体的投影长度。
[0080] 当圆柱碰撞体转换的预设多边形棱柱变换到凸体的局部坐标系后仍为圆柱碰撞 体,则获取圆柱碰撞体的半径、半高、圆柱碰撞体的XYZ三个轴的基向量变换到凸体的局部 坐标系下对应的坐标基向量以及测试轴在圆柱碰撞体的局部坐标系下的测试轴方向计算 圆柱碰撞体的投影长度。
[0081] 具体地,圆柱碰撞体在与圆柱的竖直轴平行的面上没有经过非等比缩放,也没有 经过错切变换,即圆柱碰撞体经过变换之后还是圆柱碰撞体,则采用6^_ ExtentOnAxisForRealCylinder()函数计算投影长度。
[0082] FArbitraryAxisCylinder: :GetExtentOnAxis()函数中,对于变换之后还是圆柱 体,GetExtent0nAxis()会调用GetExtent0nAxisForRealCylinderO计算投影长度。以M表 示把圆柱从圆柱的局部坐标系变换到凸体Element的局部坐标系的矩阵,则if 1就是从凸体 Element的局部坐标系变换到圆柱局部坐标系的矩阵。传入的测试轴InAxis是凸体Element 的局部坐标系下的,所以令LiInAxiMiT1,则L为测试轴在圆柱的局部坐标系下的测试轴方 向。以CT表示圆柱碰撞体的三个基向量变换到凸体Element局部坐标系之后的坐标基向量 (有三个成员X、Y、Z),则算法如式(1):
[0083]
[0084] 式(1)中,R表不圆柱碰撞体的半径,L.x表不L的X分量,L.y表不L的y分量,|L.z I表 示L的z分量的绝对值,|CT.f|表示CT的X基向量的长度,|CT.f|表示CT的Y基向量的长度, CTi|表示CT的Z基向量的长度,Η表示圆柱碰撞体的半高(即高度的一半)。
[0085]当圆柱碰撞体转换的预设多边形棱柱变换到凸体的局部坐标系后仍为圆柱碰撞 体,圆柱碰撞体的投影长度可通过如下过程计算得到:取圆柱碰撞体的三个基向量变换到 凸体Element局部坐标系的坐标基向量的X基向量的长度和Υ基向量的长度中大值,再乘以 圆柱碰撞体的半径,再乘以测试轴在圆柱的局部坐标系下的测试轴方向的X分量和y分量的 平方根,得到第一乘积值;将圆柱碰撞体的三个基向量变换到凸体Element局部坐标系的坐 标基向量的Z基向量的长度乘以圆柱碰撞体的半高,再乘以测试轴在圆柱的局部坐标系下 的测试轴方向的Z分量的绝对值,得到第二乘积值;求取第一乘积值和第二乘积值的和,将 该和作为圆柱碰撞体的投影长度。
[0086] 进一步的,当测试轴平行于圆柱碰撞体的竖直轴,则获取圆柱碰撞体的XYZ三个轴 的基向量变换到凸体的局部坐标系下对应的坐标基向量的Z轴基向量的长度与半高的乘积 作为圆柱碰撞体的投影长度。
[0087] 具体地,将作为圆柱碰撞体的投影长度。
[0088]进一步的,当测试轴垂直于圆柱碰撞体的竖直轴,则获取圆柱碰撞体的XYZ三个轴 的基向量变换到凸体的局部坐标系下对应的坐标基向量的X、Y轴基向量的长度中较大的一 个,再与圆柱碰撞体半径的乘积作为圆柱碰撞体的投影长度。
[0089] 具体地,将max(|CT.文|, |CT. ?|) *及作为圆柱碰撞体的投影长度。理论上_'、滔和 cr.f|相等,但实际计算中可能存在矩阵运算的精度误差,为保证碰撞探测结果不出现 false negative,一般取两者的较大值。
[0090] 步骤716,若该圆柱碰撞体和凸体在各测试轴上投影均相交,则判定圆柱碰撞体与 凸体之间有碰撞。
[0091 ]具体地,若圆柱碰撞体和凸体在各个测试轴上投影都相交,则判定圆柱碰撞体与 凸体之间有碰撞,若存在测试轴,使得圆柱碰撞体与凸体的投影不相交,则可判定圆柱碰撞 体与凸体之间没有碰撞。
[0092]上述实时虚拟场景中圆柱碰撞体与凸体之间碰撞探测的方法,将实时虚拟场景中 的虚拟对象作为圆柱碰撞体与凸体进行碰撞探测,碰撞探测是为了避免碰撞体碰撞,代替 了原来的轴对齐包围盒与凸体进行碰撞探测,圆柱碰撞体在凸体处只需移动较短距离,因 缩短了移动距离,故提高了移动效率,也提高了操作的流畅度,将圆柱碰撞体转化为预设多 边形棱柱,可得到圆柱碰撞体的面的法向和边方向,便于选取测试轴,通过测试轴的合理选 择,以及圆柱碰撞体和凸体在测试轴上的投影相交情况判断圆柱碰撞体和凸体之间的碰撞 情况,提高了判断的准确性。
[0093]在一个实施例中,该预设多边形为内接圆柱碰撞体底面的正多边形。
[0094] 具体地,正多边形边的条数可为5、6、7、8、9、16、32等,不限于此。正多边形边的条 数为2的指数时便于计算机处理,如8边形、16边形、32边形、64边形等。正多边形可简化计 算,节省计算资源。
[0095]进一步的,该正多边形为偶数条边的正多边形,则获取该预设多边形的边方向时, 从预设多边形棱柱的上下底面的两个预设多边形中的一个预设多边形选取基于中心不对 称的边方向,该获取棱柱的棱的边方向时选一条棱的边方向。
[0096]例如,以预设多边形棱柱为正十六边形棱柱为例,正十六边形棱柱的棱均平行,则 只要选一条棱边,获取该棱的边方向。正十六边形棱柱的上底面和下底面平行,则只要选择 一个底面中的边方向。对于每个底面来说,十六边形也是中心对称的,只要取八条边即可。 [0097]图12为采用圆柱碰撞体碰撞探测使用传统的算法效果和理论结果示意图。如图12 所示,左图为采用圆柱碰撞体按照传统的算法进行碰撞探测,其仍然需要将圆柱碰撞体移 出整个身体然后才能沿着黑色碰撞体底边移动,右图为采用圆柱碰撞体采用上述实时虚拟 场景中碰撞体之间碰撞的方法后所能达到的理论结果,圆柱碰撞体在移动过程中移动的距 离较短,移动效率高,且操作流畅。
[0098]下面结合具体的应用场景说明实时虚拟场景中碰撞体之间碰撞探测的方法的实 现过程,以实时游戏场景为例,圆柱碰撞体为虚拟角色,凸体为墙体,结合图12,其中圆形为 圆柱体的二维投影,黑体为凸体的二维投影。碰撞探测的过程包括:
[0099 ] (1)将虚拟场景中虚拟对象所对应的圆柱碰撞体转化为与圆柱碰撞体同中心点的 预设多边形棱柱;
[0100] (2)将预设多边形棱柱变换到凸体的局部坐标系,得到预设多边形棱柱在凸体的 局部坐标系下的位置;
[0101] (3)根据预设多边形棱柱在凸体的局部坐标系下的位置获取预设多边形棱柱各个 面的法向、预设多边形的边方向和棱柱的棱的边方向;
[0102] (4)获取凸体的各个面的法向和各个边方向;
[0103] (5)将凸体的各个边方向与预设多边形的边方向和棱柱的棱的边方向分别做向量 积;
[0104] (6)将预设多边形棱柱各个面的法向、凸体的各个面的法向及所述向量积中一种 或多种作为测试轴;
[0105] (7)根据各测试轴及预设多边形棱柱在凸体的局部坐标系下的位置得到圆柱碰撞 体在测试轴上的投影长度及投影位置,并获取凸体在各测试轴上的投影;
[0106] (8)若圆柱碰撞体和凸体在各测试轴上投影均相交,则判定圆柱碰撞体与凸体之 间有碰撞。
[0107] 圆柱碰撞体投影的圆形与凸体进行碰撞探测,即得到圆柱碰撞体的移动路线,如 图12所示。
[0108] 图13为一个实施例中实时虚拟场景中圆柱碰撞体与凸体之间碰撞探测的装置的 结构框图。如图13所示,一种实时虚拟场景中圆柱碰撞体与凸体之间碰撞探测的装置,包括 转化模块1302、变换模块1304、第一获取模块1306、第二获取模块1308、向量积获取模块 1310、测试轴获取模块1312、投影模块1314、判定模块1316。其中:
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1