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

文档序号:9751049阅读:来源:国知局
员在服务器上测试单机游戏等。
[0044] 为了便于探测碰撞体之间碰撞,在实时虚拟场景中,表示玩家控制的虚拟角色和 其他一些移动物体(如手雷、摄像机等)都是Actor类及其子类的对象,为此采用轴对齐进行 碰撞探测。为了改变虚拟角色的碰撞体,修改Actor类,让虚拟角色使用圆柱碰撞体,非角色 Actor使用轴对齐包围盒进行碰撞探测。在实时虚拟场景中,场景对象主要有两种,即包括 BSP场景对象和Component场景对象。按照不同的场景对象分类存储,即将对象分为BSP或 Component。在碰撞探测时,米用碰撞探测的入口函数UworId: :MoveActor()按照场景对象 分类做粗裁剪,判断该分类哪些对象可能会和传入的Actor对象碰撞体发生碰撞,然后再做 精细碰撞探测并获得返回结果。其中,粗裁剪是指做粗碰撞。精细碰撞是指按照下面所述的 实时虚拟场景中圆柱碰撞体与凸体之间碰撞探测的方法实现圆柱碰撞体与凸体(即 Component场景对象)之间进行精细碰撞探测,碰撞探测结束后,采用Check系列函数将碰撞 探测结果汇总给1^〇1'1(1 ::1〇¥64〇1:〇1'(),由其进一步汇总后用于后续计算,如状态改变、伤 害计算等。在Component场景对象,以圆柱取代轴对齐包围盒作为传入MoveActor()的碰撞 体。实时虚拟场景可包括游戏场景、动漫场景等,也可应用于实时游戏场景中,不限于此。
[0045] 每个Component场景对象包含若干Element类的对象,Element有FKBoxElem、 FKSphereElem、FKSphylElem和FKConvexElem,分别表不有向盒、球体、胶囊体和凸多面体, 如图4所示,Component类包含的Element类对象。Element是Component对象里的碰撞体,都 是凸体,采用分离轴测试算法(Separating Axis Test)计算圆柱碰撞体与凸体之间碰撞探 测的情况。分离轴测试算法的理论依据是,若两个凸体没有相交,则一定可以找出一个轴, 使得两个凸体在这个轴上的投影也不相交,如图5所示,两个凸体投影在同一轴上且没有相 交。
[0046]增加 Actor类用来存储圆柱碰撞体的成员变量。在这种情况下,假设Actor的圆柱 碰撞体是(世界坐标系的)竖直圆柱,采用Cyl inder类表示。图6为一个实施例中圆柱碰撞体 的示意图。如图6所示,采用Cylinder类表示竖直圆柱,在Cylinder类里,采用横线62表示 Radius(半径),竖线64表示Height,取值为半高(即圆柱碰撞体高度值的一半)。
[0047]图7为一个实施例中实时虚拟场景中圆柱碰撞体与凸体之间碰撞探测的方法的流 程图。如图7所示,一种实时虚拟场景中圆柱碰撞体与凸体之间碰撞探测的方法,运行于图2 中应用环境中,包括以下步骤:
[0048]步骤702,将虚拟场景中虚拟对象所对应的圆柱碰撞体转化为与圆柱碰撞体同中 心点的预设多边形棱柱。
[0049] 具体地,虚拟对象可为实时虚拟场景中可以动态运行的人物或物体等。将虚拟对 象配置为圆柱碰撞体。碰撞体是用于计算物体之间是否碰撞的物体,即实际参与碰撞算法 计算的物体。
[0050] 将圆柱碰撞体转化为预设多边形棱柱时,预设多边形棱柱与圆柱碰撞体的竖直方 向的中心轴相同。预设多边形棱柱的中心与圆柱碰撞体的中心点相同,且预设多边形棱柱 的上下底面和圆柱碰撞体的上下底面的中心相同。
[0051 ] 预设多边形可为正多边形。正多边形边的条数可为5、6、7、8、9、16、32等,不限于 此。正多边形边的条数为2的指数时便于计算机处理,如8边形、16边形、32边形、64边形等。 [0052]实时虚拟场景是指实时游戏场景或实时动漫场景等。实时游戏场景表示正在运行 的游戏中的场景。实时动漫场景表示正在运行的动漫中的场景。碰撞探测是指探测碰撞体 之间是否发生碰撞。碰撞发生后产生碰撞响应,即一碰撞体与另一碰撞体碰撞后无法沿原 来的移动方向继续移动调整一碰撞体的移动方向以绕过另一碰撞体或一碰撞体击中另一 碰撞体产生击中响应等。本实施例中,碰撞探测主要是指一碰撞体避免与另一碰撞体碰撞, 调整一碰撞体的移动方向以绕过另一碰撞体。
[0053] 碰撞体的大小可根据虚拟场景中虚拟对象的大小设置,例如虚拟对象为球体,则 虚拟对象对应的圆柱碰撞体的高可设置球体的直径,圆柱体的半径可设置略大于球体的半 径大小。
[0054]图8为正八棱柱俯视示意图。如图8所示,将圆柱碰撞体的圆柱体转化为八边形棱 柱后,八边形棱柱的俯视示意图。外面的矩阵为圆柱碰撞体的AABB(Axis Aligned Bounding Box,轴对齐包围盒)。
[0055]步骤704,将该预设多边形棱柱变换到凸体的局部坐标系,得到预设多边形棱柱在 凸体的局部坐标系下的位置。
[0056]本实施例中,将圆柱体变换到凸体Element的局部坐标系,实际上市将原有的X、Y、 Ζ三个轴变换到凸体的局部坐标系,同时也将中心点变换到凸体的局部坐标系,再根据X、Υ、 Ζ三个轴变换的结果,重建圆柱碰撞体在凸体的局部坐标系下的位置,即预设多边形棱柱变 换到凸体的局部坐标系,得到预设多边形棱柱在凸体的局部坐标系下的位置。预设多边形 棱柱以十六边形棱柱为例,则根据X、Υ、ζ三个轴、中心点在凸体的局部坐标系下的对应向 量,计算出十六棱柱对应的三十二个顶点的坐标,根据三十二个顶点组成十八个面四十八 条边。
[0057] 通过六1'13;[1:瓜15^1丨8071;[11(161'类处理坐标系变换,在41'13;[1:抑15^1丨8071;[11(161'类增 加用于变换到凸体Element局部坐标系的变换矩阵成员变量,以及变换过的圆柱碰撞体原 本的X、Y、Z轴单位向量在凸体局部坐标系下的向量,用于快速判断圆柱碰撞体是否经过旋 转、平移、伸缩等变换。在ArbitraryAxisCylinder类中,记录有Radius(半径),Height,新的 X、Y、Z轴,中心点的位移。通过三个轴的变换结果可以判断圆柱碰撞体经过了怎样的变换, 用于加速投影计算。中心点的位移可以计算投影的位置。
[0058] 图9为一个实施例中将该预设多边形棱柱变换到凸体的局部坐标系,得到预设多 边形棱柱在凸体的局部坐标系下的位置步骤的具体流程图。如图9所示,将该预设多边形棱 柱变换到凸体的局部坐标系,得到预设多边形棱柱在凸体的局部坐标系下的位置包括:
[0059] 步骤902,将预设多边形棱柱的X轴、Υ轴、Ζ轴及中心点变换到凸体的局部坐标系, 得到预设多边形棱柱的X轴、Υ轴、Ζ轴的单位向量在凸体的局部坐标系下对应的向量,并用Ζ 轴在凸体的局部坐标系下向量乘以圆柱碰撞体的正负半高值,得到预设多边形棱柱的上下 两个底面的中点坐标。
[0060] 具体地,圆柱碰撞体的半高采用Height表示。
[0061 ]步骤904,获取圆柱碰撞体的半径,根据圆柱碰撞体的半径、X轴、Y轴在凸体的局部 坐标系下对应的向量得到预设多边形棱柱的各顶点相对所在底面的中点的偏移量,将偏移 量与中点坐标求和得到对应顶点的坐标。
[0062]具体地,圆柱碰撞体的半径采用R表示。采用三角函数、圆柱碰撞体的半径R、X轴、Υ 轴在凸体的局部坐标系下对应的向量相乘,得到十六边形棱柱的上下底面的十六边形的各 个顶点相对于所对应中点坐标的偏移量,也就是上底面的十六个顶点相对于上底面的中点 坐标的偏移量,下底面的十六个顶点相对于下底面的中点坐标的偏移量。将偏移量加上对 应的中点坐标可得到对应的顶点坐标。
[0063]图10为获取八多边形棱柱的顶点示意图。如图10所示,1002为一个底面的中心点, 1004为该底面的其中一个顶点。
[0064]步骤906,根据各个顶点的坐标在凸体的局部坐标系下重建预设多边形棱柱。
[0065] 具体地,各个顶点的坐标求出后,上底面的各个顶点依次相连组成上底面,下底面 的各个顶点依次相连组成下底面,上底面和下底面中对应的顶点相连形成棱柱的一条棱。 如此,将三十二个顶点组成了十八个面四十八条边。
[0066] 通过将圆柱碰撞体的X、Υ、Ζ轴变换到凸体的局部坐标系下,以及圆柱碰撞体的中 心点变换到凸体的局部坐标系下,根据圆柱碰撞体的X、Υ、Ζ轴在凸体的局部坐标系下对应 的向量、中心点坐标及圆柱碰撞体的半径及半高等计算得出圆柱碰撞体转化的预设多边形 棱柱在凸体的局部坐标系下的位置,计算简单,计算量小,性能高。
[0067]需要说明的是,圆柱碰撞体若经过了错切变换,则需要将预设多边形棱柱的所有 顶点在圆柱碰撞体的局部坐标系计算后,用矩阵运算变换到凸体的局部坐标系。错切变换 是指使图形产生一个扭变。
[0068] 步骤706,根据该预设多边形棱柱在凸体的局部坐标系下的位置获取预设多边形 棱柱各个面的法向、预设多边形的边方向和棱柱的棱的边方向。
[0069] 具体地,面的法向是指垂直于面的法向量。边方向是指边的两端延伸方向,方向可 作为相同。将预设多边形的边方向和棱柱的棱的边方向做向量积可得到对应面的法向。
[0070] 图11为八边形棱柱的法向获取示意图。如图11所示,根据得到的顶点1102和顶点 1104的坐标可算出对应的边1106,再获取边1106的边方向,边方向是指该边两端延伸,任意 延伸的方向即为该边的边方向。
[0071] 步骤708,获取该凸体的各个面的法向和各个边方向。
[0072] 具体地,凸
当前第2页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1