物理引擎

物理引擎:
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/
Fisix Engine  收费的
http://www.fisixengine.com/default.asp
PopShapes
http://lab.andre-michelle.com/physics-engine/

Box2d 复杂,无api
http://box2dflash.sourceforge.net/        c++版
http://sourceforge.net/projects/box2d/    as版
http://wiki.slembcke.net/main/published/Chipmunk  基于box2d的c版,比box2d性能高
基于Box2d的游戏:
魔笔,只能在线玩(as)
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()模拟计算 

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);  //重力  
          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);  
              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);  
                  }  
              }  
          }  
            
            
      }  
}

 

 原文地址:http://71mao.com/article/64.htm

 

时间: 2024-08-02 17:01:45

物理引擎的相关文章

实例介绍Cocos2d-x中Box2D物理引擎:使用关节

下面我们将使用Box2D物理引擎技术进行重构.使得关节能够掌握如何在Box2D使用关节约束.HelloWorldScene.cpp中与使用关节的相关代码如下 void HelloWorld::addNewSpriteAtPosition(Vec2 p) { log("Add sprite %0.2f x %02.f",p.x,p.y); //创建物理引擎精灵对象A auto spriteA = Sprite::create("BoxA2.png"); ① sprit

实例介绍Cocos2d-x物理引擎:HelloPhysicsWorld

我们通过一个实例介绍一下在Cocos2d-x 3.x中使用物理引擎的开发过程熟悉这些API的使用.这个实例的运行后的场景当场景启动后玩家可以触摸点击屏幕每次触摸时候就会在触摸点生成一个新的精灵精灵的运行是自由落体运动. HelloPhysicsWorld实例 使用物理引擎的一般步骤如下图所示. 这个过程与上帝创建世界的过程类似上帝首先创建了世界然后为世界指定了边界否则万物就会掉到世界之外的混沌里去了最后上帝创建了万物.当然这只是一个最基本的步骤有的时候还需要碰撞检测和使用关节等处理.下面我们就按

实例介绍Cocos2d-x物理引擎:碰撞检测

碰撞检测是使用物理引擎的一个重要目的使用物理引擎可以进行精确的碰撞检测而且执行的效率也很高.在Cocos2d-x 3.x中使用事件派发机制管理碰撞事件EventListenerPhysicsContact是碰撞事件监听器.碰撞检测相关的API我们在前面一节介绍过了下面通过一个实例介绍碰撞检测的实现.这个实例的运行后的场景如图所示当场景启动后玩家可以触摸点击屏幕每次触摸时候就会在触摸点生成一个新的精灵精灵的运行是自由落体运动.当这些精灵之间发生接触时候它们的颜色被设置为黄色分离后颜色又恢复到原来状

实例介绍Cocos2d-x中Box2D物理引擎:HelloBox2D

我们通过一个实例介绍一下在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程熟悉这些API的使用.这个实例运行后的场景如图所示当场景启动后玩家可以触摸点击屏幕每次触摸时候就会在触摸点生成一个新的精灵精灵的运行自由落体运动.   HelloBox2D实例使用Box2D引擎进行开发过程如图12-15所示.下面我们就按照这个步骤介绍一下代码部分.首先看一下看HelloWorldScene.h文件它的代码如下 #ifndef __HELLOWORLD_SCENE_H__ #define __H

三个物理引擎(转)

介绍三个物理引擎以及讨论  物理引擎在3D的领域中是较年轻的,而且难度也比较高, 先製作这篇文章,是想让大家有个先行印象,了解这是什么. 別担心,最终这些教学终將连结成为一体,我只是让大家的概念先推前一下. 当成看杂誌一般的心情即可,如果你有研究,会使用SDK,也可以马上开始. 关於物理 牛顿归纳出了地心引力的通则,並且开始以数学方法描述物理现象, 这已经是很久前的事情了,但是並不只是东西往下掉而已,虽然简单讲是这样. 球会滚动.羽毛会飘落.摩擦力......等等,都是自然界常见的力学现象. 关

《Unity 4 3D开发实战详解》一6.7 物理引擎综合案例

6.7 物理引擎综合案例 Unity 4 3D开发实战详解 前面已经详细介绍了Unity中物理引擎的基础知识,同时,通过一些小案例来具体介绍了物理引擎的相关应用.本小节将通过一个综合案例,使读者对Unity中的物理引擎有进一步的理解. 1.案例的构思 开发案例首先要有一个明确的思路,倘若思路混乱,就会导致案例的整体不协调.接下来介绍一下本案例的设计思路. (1)首先要明确案例要达到的目的.本案例是为了演示物理引擎模拟现实的特性. (2)接着要明确案例场景的周边环境,要确定场景的天气.本案例中,为

小神之Newton物理引擎教程(一) Newton物理引擎教程

第一节 Getting started   这个例程将告诉你如何把 newton 物理引擎和你的图形引擎结合起来. 如果你没有解过 SDK 包,先解开包. 打开 Visual studio 找到包里的 Tutorials.dsw 后双击.   选择子项目 Tutorial 1 getting started 并使它活动起来.   选择 Tutorial.cpp 文件并双击在编辑框中打开.   在文件的开始你将发现 include 部分.   看下面几行(注意黑体):   #include "ne

java-jbox2d物理引擎问题,Android物理引擎

问题描述 jbox2d物理引擎问题,Android物理引擎 最近想学一个物理引擎,在网上找了找,想学jbox2d,是用java写的,但有人说他的运行效率低,好慢,我该不该学呢,有谁用过这个引擎吗,给点建议,或者还有什么好的物理 引擎,谢谢! 解决方案 学吧,如果不懂,先学些基础的没错. 物理世界,精灵,刚体,碰撞等都是类似的,引擎原理都差不多. 解决方案二: 为什么不学呢?有些基础了你再挑啊,那时候你就知道自己该干什么了

实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测

在Box2D中碰撞事件通过实现b2ContactListener类函数实现b2ContactListener是Box2D提供的抽象类它的抽象函数virtual void BeginContact(b2Contact* contact).两个物体开始接触时会响应但只调用一次.virtual void EndContact(b2Contact* contact).分离时响应.但只调用一次.virtual void PreSolve(b2Contact* contact, const b2Manifo

如何在物理引擎的碰撞计算中得到碰撞作用线?

问题描述 如何在物理引擎的碰撞计算中得到碰撞作用线?初次接触制作物理引擎,看了一本叫做<游戏开发物理学>的书,这本书关于公式给的很好但是要知道碰撞作用线,就是碰撞时撞击的边的垂线,苦思不知道怎么求,希望能给出算法步骤或原理,谢了. 解决方案 解决方案二:没做过碰撞处理,帮你顶解决方案三:顶求帮助啊...有急用.解决方案四:碰撞边的过碰撞点的中垂线,和物体碰撞速度方向夹角的另一边的相同夹角的逆向方向,复杂一点要计算能量损失和摩擦损失的角度,以及碰撞边的非平滑情况还有运动物体的角度,但是基本来说,