碰撞检测 小结

Sweep and Prune:
1.将物体的AABB分离到三个坐标轴上。得到若干个区间。
2.根据区间的终点坐标由小到大排序。
3.逐个遍历排序结果,当遇到一个区间的起始点的时候,就将这个区间放到一个列表中;当遇到一个区间的终点时,就将这个区间从列表中清除。
当在列表中存在区间,而又遇到一个新区间的起始点时,则遇到的区间与列表中的所有区间重叠。
4.如果一对物体在三个坐标轴上的区间都重叠,那么他们的AABB相叠。

Mid-phase碰撞检测

碰撞检测树就是将要碰撞的网格分离成多个部分,并将这些部分按树的结构组织起来。
我的碰撞检测树就是一BVH树,和标准的AABB碰撞检测树相比,AABB树是2叉树,我的树的节点数是不定的。
两种建树过程如下:


AABB:

1.计算三角形集合的AABB包围体
2.找出一个平面,这平面能最大限度的分割三角形集合(一般在中心即可),这个平面必须与坐标平面平行(因为包围体是AABB)
3.穿过这个平面的三角形按中点分配到平面一侧,如果中点还在平面上,随便分配
4.将分出的这两部分作为子节点继续分割(步骤1),直到分出的部分只有一个三角形 

       我的碰撞检测树:
1.计算三角形集合的包围体
2.计算三角形集合的几何重心,将几何重心视为原点,按三个坐标平面将三角形集合分成8部分
3.穿过这个坐标平面的三角形按中点分配到平面一侧,如果中点还在平面上,随便分配
4.如果有的部分中没三角形,那么去掉它。如果只有一部分且这部分包含多个三角形,强行随便的将这部分分成多部分(防止死递归)。
5.将分出的n部分作为子节点继续分割(步骤1),直到分出的部分只有一个三角形

我的树可能不如AABB树平衡,可能性能稍差。

包围体有:

包围球
AABB
OBB
……

注:
 碰撞检测树一般在物体定坐标系下建立出来
 可以根据情况,为不同节点选择不同类型的包围体,使得包围体包围得最紧凑

碰撞检测:
一个几何图形vs树
  按深度优先或广度优先遍历树,对于非最末级节点,判断几何图形是否和节点包围体相交,如果相交那么继续遍历它的子节点。对于最末级节点,还要进行几何图形和最末节点所对应的三角形求交。这样,遍历完一次即可找到所有碰撞。

注:
 1.碰撞检测需检测出碰撞点,碰撞法向量,和刺穿深度
 2.球和三角形碰撞:
  以下过程按顺序执行,一旦相交就return,停止和这个三角形继续检测:
   (1).判断球心与三角面垂直且过三边的平面的位置关系,如果被包围,那么直接判断球心到三角面所在平面距离是否<=半径
   (2).根据(1)的结果,如果球心在哪条边外,那么试着和那条线段求交
   (3).判断球心到三角形某顶点距离<=半径
 3.球和棱、点碰撞,碰撞法向量为那个面在碰撞点的切平面的法向量
 4.通过更精确的包围体测试,会遍历更少节点,但更精确的包围体测试一般会花更多时间。

树vs树
  对于一对节点,判断两个节点的包围体是否相交。如果相交,那么测试它们的子节点包围体是否相交。
如果有一个节点是最末级节点,它对应着一个三角形,另一个是一个非最末级节点,那么问题转化为上面“一个几何图形vs树”。
如果两个节点都是最末级节点,那么进行三角形求交。

注:
 对于刚体,它们会转动,转动了的AABB可以用AABB加上一个刚体变换矩阵表示。也可懒一些,直接把树放入全局坐标系下,更新树。

树的更新:
  如果物体不是刚体,可能会形变,这就需要更新树。一般自下而上的更新树。先根据最末级节点对应的三角形,更新最末级节点。然后一级一级更新上面的节点,使它们的包围体包住子节点。

以后安排(先把想法记下来)
物体破裂 :
将物体网格表示成一张无向图(不用邻接矩阵表示),在压强足够大的地方细化网格,细化出的部分作为图的一部分,然后从压强足够大的几个顶点遍历图。遍历时根据物体物理材质选择图的边(第一条边应选择最和切向量正交的),将其并入断裂线,必要时就细化网格,直到这条线首尾封闭。这样做是因为不同材质的物体,其断裂口有的光滑,有的粗糙,甚至有尖刺。这样应该能生成一条满意的断裂线。然后取出子图,成为分裂出的物体的网格的一部分。不过断口的填充就暂无想法了……

脚本:
设想了一种托管脚本。先写好脚本,经过编译器将其编译为自定的较低级中间语言,或者直接IL代码。运行前加载时,对其进行JIT编译,除了.Net的JIT以外,还有自己的一些,当然肯定是自己先处理后再交给.Net……这样脚本最终就是本机代码,执行速度比解释型的快,而且异常也不用一下一下的考虑。
一开始编译为直接IL代码时,不能直接转为它的字节码,而是自己规定的字节码,但其指令还是一一对应的(就是把IL代码用2进制形式表示了一下)。这主要是因为代码中有一些东西,还不能直接转为标准的IL字节码

最终应该可以构建复杂的物体,比如一个人,由Joint、刚体(骨骼和关节)和柔体(头发和肥膘)组成。他做个什么动作要是碰到了什么倒是自然能模拟出来。不过他的行走,怎么维持重心不好说,我的想法是对已做好的动画解析,将其数值微分,最后算出各部分的作用力……维持重心不管他用那些肌肉,维持重心的力 应该包括在里面……
以前有外国人拟做过类似的东西,第六届全国中小学电脑制作活动上还有即将得一得奖的抄过——botz,一个2D质点弹簧系统模拟程序,它的欧拉法积分不严密(或者说就不是),碰撞检测就和边界检查了一下,但是要注意他的“肌肉”思想,质点弹簧系统组成机器人,然后肌肉伸缩运动,我这个应该和那个在这一点有着类似之处。更接近一点的东西就是Dr.Jan Bender的那些机器人了。
当然稍微遥远的东西别想得太多,毕竟还有不少东西未完成……

时间: 2024-12-02 14:37:41

碰撞检测 小结的相关文章

《Cocos2D权威指南》——2.7 本章小结

2.7 本章小结 本章以一个垂直射击游戏为主线,循序渐进地介绍该游戏的制作过程和方法.在完成本章后,大家应该对使用Cocos2D制作游戏有一个大致的了解,比如什么是sprite.label.HUD.game loop,以及如何做碰撞检测(collision detection).在之后学习本书的过程中,我们不仅要关注具体的技术实现细节,更应该基本掌握这些核心概念以及核心类,这样在编写新游戏时,才能够独立思考.第3章开始介绍Cocos2D中的核心类,这些类几乎每一个游戏都要使用到,对这些类的进一步

【SpringMVC框架】小结+视图解析器配置前缀和后缀

1.入门程序小结 通过入门程序理解springmvc前端控制器.处理器映射器.处理器适配器.视图解析器用法. 前端控制器配置: 第一种:*.action,访问以.action结尾 由DispatcherServlet进行解析 第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析   使用此种方式可以实现 RESTful风格的url 处理器映射器: 非注解处理器映射器(了解) 注解的处理器映射器(掌握)对

Maven项目错误解决小结

Maven项目错误解决小结 注:整理错误,不喜欢为了一个小问题,占篇幅,所以请Ctrl+F自己查看,定位问题,愿为解决. 注:网络上的错误解决经验,只是作者在特定的条件下发生,或者适合你不适合你,请勿责怪,若无解决答案,请你请教他人或耐心解决,可以记录之后分享,我们爱分享,一起开始吧! 问题1: -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable an

Python 错误和异常小结[转]

原文链接    http://blog.csdn.net/sinchb/article/details/8392827      事先说明哦,这不是一篇关于Python异常的全面介绍的文章,这只是在学习Python异常后的一篇笔记式的记录和小结性质的文章.什么?你还不知道什么是异常,额... 1.Python异常类     Python是面向对象语言,所以程序抛出的异常也是类.常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你

源码-c#像素鸟代码问题,碰撞检测

问题描述 c#像素鸟代码问题,碰撞检测 项目源码链接:http://pan.baidu.com/s/1dEpefAx 密码:wi87 小鸟与管道的碰撞检测问题 1.小鸟与下管道GDDown碰撞有反应,但与GDUp管道碰撞没有反应 2.小鸟与地面picturebox1.Height接触时,提示发生碰撞确实在上管道以上的位置,与地面接触却没有提示 解决方案 http://www.narkii.com/club/thread-266478-1.html

mongodb测试小结-tina

                         mongodb测试小结  一.基础配置 1)硬件 双核  8G  100G硬盘 2)集群 1 台mongos.config服务器:3台分片:1台独立mongod存放count_temp统计表  二.测试结果 1)中间数据的处理: 3台分片机上 分别跑3个进程,共9个进程,约为430w/h,5000w的数据大概需要11.6h 3台分片机上 分别跑5个进程,共15个进程,约为840w/h,5000w的数据大概需要6h (5个进程会比3个进程分得更平均

用AJAX编写用户注册实例及技术小结

ajax|用户注册 我所举的这个例子是一个企业用户注册时的一个应用,当用户注册时检查用户名和企业名是否可用,以前的做法是在旁边加一个按钮,点击"检查",就向服务器发出请求,然后等待--服务器返回信息,继续操作.如果我们用Ajax技术来实现以上的操作则不必等待服务器返回信息,用户输入用户名或企业名称的时候,当输入文本框失去焦点的时候,则会自动向服务器发出请求,用户继续做下面的操作,不必点击"检查",也不必等待服务器返回信息,检查与用户操作是异步的,可同时进行.当服务器

搜搜慧眼设计小结:Superpower!

前一段时间参与了搜搜慧眼1.0项目的设计工作,从创意到实施,整个历程就是一个愉快的体验. 这里是关于设计理念.设计过程的一点小结,与同事们分享.

拥抱开放—Q+2.0项目小结

主题小结"> Q+之前,桌面电脑用户仍然是本地应用程序和浏览器构成的在线体验.随着1.0的试用,2.0的发布,Q+将是一个让人随时可以参与不同深度和层次的互联网生活平台. 1.0版本发布后,从产品交流页面和微博等渠道收到了大量的用户反馈,并进行了针对Q+的可用性测试.用户对Q+面板,Q+桌面和Q+应用,提出了以下反馈意见: 分析:透过体验缺陷看清问题本质 1.Q+面板在windows桌面承载了所有Q+全屏环境的功能. 2.Q+全屏可供用户掌控的功能太局限,包括拖放图标,管理不同桌面. 定位