物理引擎

物理引擎:
motor2 基于Box2d的AS3(Player 10)刚体引擎
作者主页:http://lab.polygonal.de/motor_physics/
APE  最简单
http://www.cove.org/ape/
FOAM - 2D Rigid Body Physics Engine
http://code.google.com/p/foam-as3
glaze - 2D Rigid Body Dynamics & Game Engine for Actionsctipt 3
http://code.google.com/p/glaze/
demo:http://home.planet.nl/~borst595/glaze.html
Fisix Engine  
http://www.fisixengine.com/default.asp
PopShapes
http://lab.andre-michelle.com/physics-engine/

Box2d 复杂
http://box2dflash.sourceforge.net/        as版 无api
http://sourceforge.net/projects/box2d/   c++版 有详细文档
http://sourceforge.net/projects/jbox2d/   java版 运行方式applet 有详细文档
http://box2d-js.sourceforge.net/index2.html  日本人基于prototype改的javascript版,速度很慢
http://wiki.slembcke.net/main/published/Chipmunk  c版,比box2d性能高
就差一个c#版了.............


基于Box2d的游戏:
魔笔,下载后出现pay on.....右键播放即可玩(as)
http://www.miniclip.com/games/magic-pen/cn/
http://www.miniclip.com/games/magic-pen/cn/magicpen.swf

怪物卡车,可下载玩,且有3d版的(as)
http://www.miniclip.com/games/monster-trucks-nitro/cn/

蜡笔物理学 (c++)
http://www.crayonphysics.com/
下载地址:http://www.kloonigames.com/blog/games/crayon
作者:http://www.kloonigames.com/blog/



       box2d的碰撞检测采用AABB(axially aligned bounding box)(Box2D.Collision.b2AABB类)这种最简单的方式,采用一个描述用的立方体或者球形体包裹住物体对象的整体(或者是主要部分),之后根据包装盒的距离、位置等信息来计算是否发生碰撞.
      2D游戏中有许多图片都是方方正正的,所以我们不必把碰撞的范围画成一个圆的,而是画成一个方的。这个正方形,或者说是一个四边形和坐标轴是对齐的,所以运用数学上的一些方法,比如距离计算等还是比较方便的。这个检测方法就叫AABB碰撞检测,
       游戏中已经运用的非常广泛了,因为其速度快,效率高,计算起来非常方便,精确度也是可以忍受的。  做到这一步,许多游戏的需求都已经满足了。但是,总是有人希望近一步优化,而且方法也是非常陈旧的:继续对物体的各个部分进行细分,对每个部件做AABB的矩形,那这个优化以后的系统就叫做OBB系统(Box2D.Collision.b2OBB类)。

使用流程:
1.创建world
2.定义刚体,定义形状,添加到世界
3.world.step()模拟计算

Flash动画


package com.mop{
	import Box2D.Collision.Shapes.b2PolygonDef;
	import Box2D.Collision.b2AABB;
	import Box2D.Common.Math.b2Vec2;
	import Box2D.Dynamics.b2Body;
	import Box2D.Dynamics.b2BodyDef;
	import Box2D.Dynamics.b2DebugDraw;
	import Box2D.Dynamics.b2World;
	
	import flash.display.Sprite;
	import flash.events.Event;

	public class BoxTest extends Sprite {
		
		public var worldAABB:b2AABB = new b2AABB();
		public var gravity:b2Vec2 = new b2Vec2(0,10);  //重力加速度(300m/s^2) 
		public var doSleep:Boolean = true; //无互交的刚体(如静止的物体)不参与模拟计算提高性能
		public var world:b2World;
		
		private var pixelsToMeter:Number = 30;//box2d中 1m = 30px


		public function BoxTest() {
			//包围体定义,物理世界模拟的范围
			worldAABB.lowerBound.Set(-100,-100);
			worldAABB.upperBound.Set(100,100);
			//物理世界
			world = new b2World(worldAABB,gravity,doSleep);
			//刚体定义
			var bodyDef:b2BodyDef = new b2BodyDef();
			bodyDef.position.Set(8,11);//位置定义
			bodyDef.userData = new PhysGround();//地面
			var half_groudwidth:Number = 30;//物体的一半宽,单位m
			var half_grounheight:Number = 3;
			bodyDef.userData.width =  pixelsToMeter*half_groudwidth*2;
			bodyDef.userData.height = pixelsToMeter*half_grounheight*2;
			addChild(bodyDef.userData);
			//物理形定义
			var boxDef:b2PolygonDef = new b2PolygonDef();
			boxDef.SetAsBox(half_groudwidth,half_grounheight);
			boxDef.density = 0; //密度为0,可漂浮
			boxDef.friction = 0.3; //摩擦力
			//根据刚体定义创建刚体实体
			var body:b2Body = world.CreateBody(bodyDef);
			//根据物理形定义设置刚体
			body.CreateShape(boxDef);
			//依据形计算质量
			body.SetMassFromShapes();
			
			//调试模式绘制
			var dbgDraw:b2DebugDraw = new b2DebugDraw();
			var dbgSprite:Sprite = new Sprite();
			addChild(dbgSprite);
			dbgDraw.m_sprite = dbgSprite;
			dbgDraw.m_drawScale = 30.0;
			dbgDraw.m_fillAlpha = 0.0;
			dbgDraw.m_lineThickness = 1.0;
			dbgDraw.m_drawFlags = 0xFFFFFFFF;
			world.SetDebugDraw(dbgDraw);
			
			//同理添加物体
			for (var index:int = 0; index < 10; index++) {
				bodyDef = new b2BodyDef();
				bodyDef.position.x = Math.random() * 15 + 5;
				bodyDef.position.y = Math.random() * 10;
				var hW:Number = Math.random() + 0.5;
				var hH:Number = Math.random() + 0.5;

				boxDef = new b2PolygonDef();
				boxDef.SetAsBox(hW, hH);
				boxDef.density = 1.0;//密度
				boxDef.friction = 0.5;//摩擦力
				boxDef.restitution = 0.2; //弹力
				bodyDef.userData = new PhysBox();//方块
				bodyDef.userData.width = hW * 2 * pixelsToMeter;
				bodyDef.userData.height = hH * 2 * pixelsToMeter;
				body = world.CreateBody(bodyDef);
				body.CreateShape(boxDef);
				
				body.SetMassFromShapes();
				addChild(bodyDef.userData);
			}
			addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
		}
		
		public function Update(e:Event):void{
			world.Step(1/30, 10);//1/30时间步长,10积分次数
			for (var bb:b2Body = world.m_bodyList; bb; bb = bb.m_next){
				if (bb.m_userData is Sprite){
					bb.m_userData.x = bb.GetPosition().x * 30;
					bb.m_userData.y = bb.GetPosition().y * 30;
					bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
				}
			}
		}
		
		
	}
}





[本日志由 c 于 2009-01-05 06:38 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
评论: 3 | 引用: 0 | 查看次数: -
回复回复c[2009-01-12 09:09 AM | del]
已加了
回复回复qhwa[2009-01-09 08:55 PM | del]
好像我一放上链接就提示有被屏蔽的词汇。。
http://q.pnq.cc
回复回复qhwa[2009-01-09 08:53 PM | del]
不错,学习了!
我也在学习AS3,希望和楼主交换一个连接,不知可否?
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.