Small Word:物理引擎框架

来源:互联网 发布:单页seo 编辑:程序博客网 时间:2024/06/08 19:50


第五章 他山之石可以攻玉


有了物理学基础,和一些初始的类和库,现在到了需要给系统设计框架的时候了,物理系统主要包括构成物理世界的实体和操作实体的系统库构成,应用程序通过调用不同库的函数和类构建和仿真物理世界。框架中给出了主要流程中出现的一些类和功能库。




有了框架还要定义系统的主要工作流程,参考《A Unified Framework for Rigid Body Dynamics》和《Stable Robust and Versatile Multibody Animation》两篇文章(推荐),分析了仿真流程各个部分之间的交互如下:



然后参考Havok 4的框架和基本工作流程,删掉了一些暂时用不到的部分(基本不变),主要参考了博客http://blog.csdn.net/pizi0475/article/details/7722791上的内容,给出了物理系统的仿真主要流程(省略了错误分析,各个约束计算等,主要给出感性的处理流程)。




1. 导入配置文件

根据配置文件初始化物理系统的数据和一些动力学参数

2. 初始化物理系统

加载应用程序定义的实体,系统的线程池等

3. 更新模拟区域

实体管理器将实体划分为合适的区域,这样可以更好的便于任务管理器的管理,每一个对象都有一个失效器,通过查询自己的状态,它可以告诉系统,是否可以安全的使自己失效。再循环中应用程序可能会不断加入实体,要可以实时更新划分。

4. 施加作用
通过施加作用,你可以在模拟的过程中控制物体的状态。如接受外力等。每一个模拟步骤,系统都会调用你向物理世界中添加的每一个作用的。接受完外界的作用,要更新实体的内部状态,如力矩等。
 
5. 解决器处理
根据约束关系,解决器检查是否出现违例,如碰撞检测,如果出现,就是一个错误。为了避免这样的错误,需要进行一定的操作,如移动一下物体。而解决器的职责就是计算避免这个错误所需要的移动量,并把这个信息传递给下一个步骤,整合。

 
5.1 建立约束
利用约束管理器对系统中的约束进行管理。如接触约束,它可以防止两个物体相互穿插。你也可以在物体之间指定特定的约束类型,比如,铰链或者球状关。也可以创建自定义的约束。


6. 整合
 整合器计算新的运动状态(初始和终了的位置的旋转,速度,加速度等等),对每个模拟的对象,会考虑解决器提供的信息。然后对象新的位置和旋转就可以传递给游戏,更新游戏对象。

7 碰撞检测
在碰撞检测器中,先粗略计算某区域是否发生碰撞,然后根据各个物体的AABB包围盒等简单形状信息两两进行粗略的判定,如果发生交叉,根据物体的形状判定物体是否怎的发生碰撞,如果发生碰撞,根据碰撞信息建立碰撞代理和碰撞接触点提供给下一次仿真循环。
 

针对于系统中某个实体的仿真循环流程既是,检测是否有效,施加作用,计算物体可能的下一位置,检测物体的碰撞和约束,给出解决违例的办法,计算物体的实际位置,进行碰撞检测将碰撞信息和接触点保存供下次使用。其中所有实体每一步的仿真都是同步的。


这样第一章给出的类图关系就改进为:





原创粉丝点击