守望者--AIR技术交流

标题: 【AwayPhysics学习笔记】:Away3D物理引擎的简介与使用 [打印本页]

作者: 破晓    时间: 2015-6-3 16:58
标题: 【AwayPhysics学习笔记】:Away3D物理引擎的简介与使用
本帖最后由 破晓 于 2015-6-3 16:59 编辑

首先我们要了解的是AwayPhysics这个物理引擎并不是重头开始写的新物理引擎,而是使用Flascc技术把一个已经很成熟的Bullet物理引擎引入到了Flash中,同时为了让as3可以使用这个C++开发的物理引擎,AwayPhysics库编写了一些必要的AS3类使我们可以方便的使用它。


而为了方便区分和使用AwayPhysics里的所有类都使用了AWP作为类名前缀。



创建物理世界


要模拟一个物理世界,首先需要创建一个AWPDynamicsWorld的对象,该对象类似于Away3D中创建3D世界的View3D对象,同时每帧也需要类似View3D对象调用render方法一样调用AWPDynamicsWorld对象的step方法;

创建方法:

  1. <font color="rgb(51, 51, 51)"><font face="Georgia,"> //获取物理世界
  2. _physicsWorld = AWPDynamicsWorld.getInstance();
  3. //初始化, 主要包括初始化重力等
  4. _physicsWorld.initWithDbvtBroadphase();</font></font>
复制代码
step方法一般使用下面的参数:
  1. var _timeStep:Number = 1 / 60;//60表示帧率
  2. _physicsWorld.step(_timeStep, 1, _timeStep);
复制代码
关于该方法的更多信息可以参考这里

而正常来说应该是先调用step方法模拟了物理世界之后在调用View3D的render方法来渲染3D世界;

该类有添加和移除各种刚体的方法,可以方便的添加需要使用物理引擎模拟的对象;


输出调试图形

如果我们需要查看调试的物件信息(可以查看到添加到物理世界的刚体的坐标系和形状),可以使用AWPDebugDraw类:
  1. private var _debugDraw:AWPDebugDraw;

  2. //构造函数中创建
  3. _debugDraw = new AWPDebugDraw(_view, _physicsWorld);
  4. _debugDraw.debugMode |= AWPDebugDraw.DBG_DrawTransform;

  5. //帧事件方法中调用绘制
  6. _debugDraw.debugDrawWorld();
复制代码
需要注意的一点是,debugDrawWorld这个方法会严重拉低运行的帧率,当然作为调试工具,我们不需要高效的运行效率,需要调试时别忘了这个类哦。

基础使用简介

我们搭建好了物理世界后就可以向物理世界中添加对象了:


示例代码:
  1. //创建地面 Mesh
  2. var material:ColorMaterial = new ColorMaterial(0x252525);
  3. material.lightPicker = lightPicker;
  4. var mesh:Mesh = new Mesh(new PlaneGeometry(50000, 50000), material);
  5. mesh.mouseEnabled = true;
  6. mesh.addEventListener(MouseEvent3D.MOUSE_UP, onMouseUp);
  7. _view.scene.addChild(mesh);

  8. //创建地面形状和刚体
  9. var groundShape:AWPStaticPlaneShape = new AWPStaticPlaneShape(new Vector3D(0, 1, 0));
  10. var groundRigidbody:AWPRigidBody = new AWPRigidBody(groundShape, mesh, 0);
  11. //添加到物理世界
  12. _physicsWorld.addRigidBody(groundRigidbody);
复制代码

碰撞检测

要接收碰撞检测事件需要开启一下标志,这样就可以接收事件了:
  1. //开启碰撞侦听, AWPEvent.COLLISION_ADDED 事件被启用
  2. _physicsWorld.collisionCallbackOn = true;
复制代码
碰撞对象:

要使用碰撞检测我们就不用刚体对象(AWPRigidBody)了,要使用碰撞对象(AWPCollisionObject);

同时添加到物理世界时也要使用addCollisionObject方法;
碰撞对象可以添加多个射线,用于射线碰撞检测;

碰撞事件:

碰撞事件都被封装好了,有两个AWPEvent.COLLISION_ADDED和AWPEvent.RAY_CAST:
游戏应用

我们通过上面的代码可以模拟真实的物理世界,但这是不够的,更多的时候我们需要使用物理引擎来帮助我们实现游戏中的逻辑,而常见的需求是赛车游戏(车辆和地面与其它物体的碰撞)和全3D的RPG游戏(人物和高低不平的地面的碰撞)。
赛车:
AwayPhysics提供了两个关于赛车的Demo,点击查看源码:Demo1Demo2
由于AwayPhysics已经帮我们封装好了专门用来控制车辆的类,所以创建一个小赛车的游戏是十分简单的,下面说说会使用到的类:

车辆控制类:
地形生成类(直接加载模型作为地形):

地形生成类(使用高度图生成地形):


RPG:

AwayPhysics提供了一个关于行走的Demo,点击查看源码:Demo

地形生成同上,我们看看不一样的地方:


补充

除了我们谈到的几点外,大家还可以查看示例程序了解更多的使用技巧:

刚体碰撞过滤测试



重力测试



自定义形状的刚体测试



刚体约束测试






本文来自:http://www.cnblogs.com/hammerc/p/4184351.html






欢迎光临 守望者--AIR技术交流 (http://www.airmyth.com/)