【AwayPhysics学习笔记】:Away3D物理引擎的简介与使用
首先我们要了解的是AwayPhysics这个物理引擎并不是重头开始写的新物理引擎,而是使用Flascc技术把一个已经很成熟的Bullet物理引擎引入到了Flash中,同时为了让as3可以使用这个C++开发的物理引擎,AwayPhysics库编写了一些必要的AS3类使我们可以方便的使用它。
而为了方便区分和使用AwayPhysics里的所有类都使用了AWP作为类名前缀。
创建物理世界
要模拟一个物理世界,首先需要创建一个AWPDynamicsWorld的对象,该对象类似于Away3D中创建3D世界的View3D对象,同时每帧也需要类似View3D对象调用render方法一样调用AWPDynamicsWorld对象的step方法;
创建方法:
//获取物理世界
_physicsWorld = AWPDynamicsWorld.getInstance();
//初始化, 主要包括初始化重力等
_physicsWorld.initWithDbvtBroadphase();
step方法一般使用下面的参数:
var _timeStep:Number = 1 / 60;//60表示帧率
_physicsWorld.step(_timeStep, 1, _timeStep);
关于该方法的更多信息可以参考这里;
而正常来说应该是先调用step方法模拟了物理世界之后在调用View3D的render方法来渲染3D世界;
该类有添加和移除各种刚体的方法,可以方便的添加需要使用物理引擎模拟的对象;
输出调试图形
如果我们需要查看调试的物件信息(可以查看到添加到物理世界的刚体的坐标系和形状),可以使用AWPDebugDraw类:
private var _debugDraw:AWPDebugDraw; //构造函数中创建
_debugDraw = new AWPDebugDraw(_view, _physicsWorld);
_debugDraw.debugMode |= AWPDebugDraw.DBG_DrawTransform; //帧事件方法中调用绘制
_debugDraw.debugDrawWorld();
需要注意的一点是,debugDrawWorld这个方法会严重拉低运行的帧率,当然作为调试工具,我们不需要高效的运行效率,需要调试时别忘了这个类哦。
基础使用简介
我们搭建好了物理世界后就可以向物理世界中添加对象了:
- 首先,AwayPhysics提供了可以用来进行碰撞检测的多种3D形状,存放在awayphysics.collision.shapes包中,我们可以根据需要创建适合的碰撞形状;
- 然后,我们需要添加一个刚体(AWPRigidBody),将我们的碰撞形状和3D显示对象进行绑定;
- 最后,我们可以调整刚体的各种属性(如果调整刚体的坐标旋转等信息会实时同步到该刚体绑定的3D对象中),添加到物理世界中即可,当我们的刚体添加到物理世界后他的格子状态就都由物理引擎来模拟了;
示例代码:
//创建地面 Mesh
var material:ColorMaterial = new ColorMaterial(0x252525);
material.lightPicker = lightPicker;
var mesh:Mesh = new Mesh(new PlaneGeometry(50000, 50000), material);
mesh.mouseEnabled = true;
mesh.addEventListener(MouseEvent3D.MOUSE_UP, onMouseUp);
_view.scene.addChild(mesh); //创建地面形状和刚体
var groundShape:AWPStaticPlaneShape = new AWPStaticPlaneShape(new Vector3D(0, 1, 0));
var groundRigidbody:AWPRigidBody = new AWPRigidBody(groundShape, mesh, 0);
//添加到物理世界
_physicsWorld.addRigidBody(groundRigidbody);
碰撞检测
要接收碰撞检测事件需要开启一下标志,这样就可以接收事件了:
//开启碰撞侦听, AWPEvent.COLLISION_ADDED 事件被启用
_physicsWorld.collisionCallbackOn = true;
碰撞对象:
要使用碰撞检测我们就不用刚体对象(AWPRigidBody)了,要使用碰撞对象(AWPCollisionObject);
同时添加到物理世界时也要使用addCollisionObject方法;
碰撞对象可以添加多个射线,用于射线碰撞检测;
碰撞事件:
碰撞事件都被封装好了,有两个AWPEvent.COLLISION_ADDED和AWPEvent.RAY_CAST:
- COLLISION_ADDED:当有另一个碰撞物体和自己发生碰撞时会抛出该事件,注意并没有COLLISION_REMOVED等表示碰撞结束的事件,这是由于每次调用step方法模拟时都会重新运算碰撞,所以如果存在碰撞就会一直抛出该事件。
- RAY_CAST:如果添加过射线,那么射线和其它碰撞对象碰撞时也会受到该事件。
游戏应用
我们通过上面的代码可以模拟真实的物理世界,但这是不够的,更多的时候我们需要使用物理引擎来帮助我们实现游戏中的逻辑,而常见的需求是赛车游戏(车辆和地面与其它物体的碰撞)和全3D的RPG游戏(人物和高低不平的地面的碰撞)。
赛车:
AwayPhysics提供了两个关于赛车的Demo,点击查看源码:Demo1、Demo2
由于AwayPhysics已经帮我们封装好了专门用来控制车辆的类,所以创建一个小赛车的游戏是十分简单的,下面说说会使用到的类:
车辆控制类:
- AWPCompoundShape:这个类可以添加多个基础的形状来达到组合成一个复杂形状的目的,小车使用该类组合了两个长方体;
- AWPVehicleTuning:这个类用来设置车辆的调节属性;
- AWPRaycastVehicle:将AWPVehicleTuning和小车刚体进行绑定的类,并且最终会调用_physicsWorld.addVehicle方法添加到物理世界中;
- AWPRaycastVehicle.addWheel:该方法可以对指定的轮子对象进行绑定;
- AWPRaycastVehicle.getWheelInfo:该方法可以微调每个轮子的属性;
- AWPRaycastVehicle.applyEngineForce:该方法可以控制指定的轮子的引擎力,即踩油门,设置为负值可以倒车;
- AWPRaycastVehicle.setBrake:该方法可以控制指定的轮子的刹车;
- AWPRaycastVehicle.setSteeringValue:该方法可以控制指定的轮子的转向,即转弯;
地形生成类(直接加载模型作为地形):
- AWPBvhTriangleMeshShape:我们将加载好的Mesh的geometry属性赋值到该对象后,就创建了一个和Mesh对象一致的刚体形状,再将该对象添加到刚体中即可作为自定义的地形使用。
地形生成类(使用高度图生成地形):
- AWPTerrain:该对象是一个可视对象,是由一个高度位图创建的Mesh对象。
- AWPHeightfieldTerrainShape:将我们的AWPTerrain对象赋值到该对象后,就创建了一个和Mesh对象一致的刚体形状,再将该对象添加到刚体中即可作为自定义的地形使用。
RPG:
AwayPhysics提供了一个关于行走的Demo,点击查看源码:Demo
地形生成同上,我们看看不一样的地方:
- AWPGhostObject:该类用来连接一个形状对象和一个显示对象;
- AWPKinematicCharacterController:角色控制类,可以设置一个AWPGhostObject对象作为其控制的对象;
- AWPKinematicCharacterController.setWalkDirection:该方法接收一个3D向量作为移动的距离;
- AWPKinematicCharacterController.jump:该方法可以用来进行跳跃;
补充
除了我们谈到的几点外,大家还可以查看示例程序了解更多的使用技巧:
【AwayPhysics学习笔记】:Away3D物理引擎的简介与使用的更多相关文章
- [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Apache OFBiz 学习笔记 之 服务引擎 二
加载服务定义文件 ofbiz-component.xml:所有的服务定义文件在每个组件的ofbi-component.xml文件中 加载服务定义 例:framework/common/ofbi ...
- Shiro 学习笔记(一)——shiro简介
Apache Shiro 是一个安全框架.说白了,就是进行一下 权限校验,判断下这个用户是否登录了,是否有权限去做这件事情. Shiro 可以帮助我们完成:认证.授权.加密.会话管理.与web 集成. ...
- Redis学习笔记(1)——Redis简介
一.Redis是什么? Remote Dictionary Server(Redis) 是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value ...
- Unity3D笔记三 物理引擎
一.物理引擎 1.物理引擎就是模拟真实世界中物体碰撞.跌落等反应,通过Ballance.愤怒的小鸟来理解什么是物理引擎.Unity的物理引擎使用的是NviDIA的PhysX.2.选中一个游戏对象,主菜 ...
- MOGRE学习笔记(1) - OGRE简介及在vs2010下配置
由于工作需要,花费了一段时间研究OGRE,但是研究的目的是要在vs2010平台下用c#进行MOGRE的开发,不得已才转到MGRE,步骤是首选熟悉MOGRE的一些基础知识,做到在winform下能用MO ...
- COCOS2DX学习之Box2d物理引擎使用之------动态物体的创建
1.创建一个物理世界 首先要引入一个头文件#include "Box2D\Box2D.h" 之后利用b2word创建一个对象,而且指定这个物理世界中的加速度方向. word = n ...
- TDD学习笔记【二】---单元测试简介
大纲 Testing 的第一个切入点:单元测试. 本篇文章将针对单元测试进行简介,主要内容包含了5W: Why What Where Who When 而How 的部分,属于实现部分,将于下一篇文章介 ...
- 学习笔记(二)--Lucene简介
Lucene简介 最受欢迎的java开源全文搜索引擎开发工具包.提供了完整的查询引擎和索引引擎,部分文本分词引擎(英文与德文两种西方语言).Lucene的目的是为软件开发人员提供一个简单易用的工具包, ...
随机推荐
- Hibernate逍遥游记-第1章-JDBC访问数据库
1. package mypack; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.sw ...
- photoshop:模仿-广告放射背景
模仿对象:图片大小960*400 过程: 1.新建文档,大小为:960*800 2.选择渐变工具,黑白从上往下渐变 3.滤镜->扭曲->波浪,参考设置 4.滤镜->扭曲->极坐 ...
- perl next和last
跳出控制结构:next和last next 和last 操作符运维你在循环中改变程序执行的方向,你可能经常会遇到一些的特殊情况, 碰到这种情况时你希望跳过它,或者像退出循环. 比如当你处理Unix 账 ...
- 细说javascript 中的 window.open() 参数设置
今天遇到一个问题,就是要用javascript中的window.open()打开一个新的网页,而且新打开的网页要在原来网页的基础之上,在查了一些资料之后,找到里一下方法:(其中,url 为链接的地址) ...
- VS2005工程由Pocket PC 2003 SDK转为WINCE6.0 SDK的问题
把VS2005工程有采用的Pocket PC 2003 SDK改为WINCE6.0 SDK,具体操作见链接 http://blog.csdn.net/loongembedded/article/det ...
- [转]Linux下Nagios的安装与配置
转自:http://blog.chinaunix.net/uid-29539073-id-4149856.html 月色书香 一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有 ...
- bzoj1934 bzoj2768
最小割的经典模型,体现出最小割的基本定义,把两个集合划分的最小代价 把一开始同意的人连源点,不同意的连汇点,有关系的人之间连边,流量都为1 不难发现,割两点(人)间的边就相当于朋友之间发生冲突 割到连 ...
- JSOI2008 最小生成树计数
题解: 最小生成树的两个性质: 1.边权相等的边的个数一定. 2.做完边权为w的所有边时,图的连通性相同. 证明: 1.边权相等的边的个数不一样的话就不会都同时是最小生成树了. 2.假设每种方法的做完 ...
- UEFI GPT
其实关于UEFI的几篇文章很早就写下了,只是自己读了一遍感觉很不满意,就决定重写.目的是想用最简单直白的语言把内容写出来,让每个人都能轻松读懂.当然,如果你已经对这些内容有了很深的理解的话,这篇文章除 ...
- 【spring-boot】快速构建spring-boot微框架
spring-boot是一个快速构建环境的一套框架,其设计理念是尽可能的减少xml的配置,用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义 ...