`

物理模拟引擎box2D-1

阅读更多
几个常用的概念
rigid body
shape 
constraint 
contact constraint
joint 
joint limit 
joint motor
world 
Hello Box2D
Creating a World

var worldAABB:b2AABB = new b2AABB();  
worldAABB.lowerBound.Set(-100.0, -100.0);  
worldAABB.upperBound.Set(100.0, 100.0);




Caution
The world AABB should always be bigger then the region where your bodies are located. It is better to make the world AABB too big than too small. If a body reaches the boundary of the world AABB it will be frozen and will stop simulating.
and b2 allow object to sleep.

var gravity:b2Vec2 = new b2Vec2 (0.0, -10.0);  
var doSleep:Boolean = true; 


now  we create world object.

var world:b2World = new b2World(worldAABB, gravity, doSleep);



we can following the steps as
Creating a World--Creating a Ground Box--Creating a Dynamic Body--
Simulating the World (of Box2D). the following is source code and the attacted is flash.

package{   
       
    import flash.display.Sprite;   
    import flash.events.Event;   
    // Classes used in this example   
    import Box2D.Dynamics.*;   
    import Box2D.Collision.*;   
    import Box2D.Collision.Shapes.*;   
    import Box2D.Common.Math.*;   
  
    [SWF(width="640", height="360", backgroundColor="#000000", frameRate="30")]    
           
    public class HelloWorld extends Sprite{   
           
        [Embed(source='assets/PhysBox.swf')]      
        public var PhysBox:Class;      
        //public var FGmc:MovieClip = new FG as MovieClip;    
           
        [Embed(source='assets/PhysCircle.swf')]      
        public var PhysCircle:Class;    
           
        [Embed(source='assets/PhysGround.swf')]      
        public var PhysGround:Class;    
           
        public function HelloWorld(){   
               
               
               
            // Add event for main loop   
            addEventListener(Event.ENTER_FRAME, Update, false, 0, true);   
               
               
               
            // Creat world AABB   
            var worldAABB:b2AABB = new b2AABB();   
            worldAABB.lowerBound.Set(-100.0, -100.0);   
            worldAABB.upperBound.Set(100.0, 100.0);   
               
            // Define the gravity vector   
            var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);   
               
            // Allow bodies to sleep   
            var doSleep:Boolean = true;   
               
            // Construct a world object   
            m_world = new b2World(worldAABB, gravity, doSleep);   
               
            // set debug draw   
            /*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;  
            m_world.SetDebugDraw(dbgDraw);*/  
               
               
               
            // Vars used to create bodies   
            var body:b2Body;   
            var bodyDef:b2BodyDef;   
            var boxDef:b2PolygonDef;   
            var circleDef:b2CircleDef;   
               
               
               
            // Add ground body   
            bodyDef = new b2BodyDef();   
            //bodyDef.position.Set(15, 19);   
            bodyDef.position.Set(10, 12);   
            //bodyDef.angle = 0.1;   
            boxDef = new b2PolygonDef();   
            boxDef.SetAsBox(30, 3);   
            boxDef.friction = 0.3;   
            boxDef.density = 0; // static bodies require zero density   
            /*circleDef = new b2CircleDef();  
            circleDef.radius = 10;  
            circleDef.restitution = 0.2*/  
            // Add sprite to body userData   
            bodyDef.userData = new PhysGround();   
            //bodyDef.userData = new PhysCircle();   
            bodyDef.userData.width = 30 * 2 * 30;    
            bodyDef.userData.height = 30 * 2 * 3;    
            addChild(bodyDef.userData);   
            body = m_world.CreateBody(bodyDef);   
            body.CreateShape(boxDef);   
            //body.CreateShape(circleDef);   
            body.SetMassFromShapes();   
               
            // Add some objects   
            for (var i:int = 1; i < 10; i++){   
                bodyDef = new b2BodyDef();   
                bodyDef.position.x = Math.random() * 15 + 5;   
                bodyDef.position.y = Math.random() * 10;   
                var rX:Number = Math.random() + 0.5;   
                var rY:Number = Math.random() + 0.5;   
                // Box   
                if (Math.random() < 0.5){   
                    boxDef = new b2PolygonDef();   
                    boxDef.SetAsBox(rX, rY);   
                    boxDef.density = 1.0;   
                    boxDef.friction = 0.5;   
                    boxDef.restitution = 0.2;   
                    bodyDef.userData = new PhysBox();   
                    bodyDef.userData.width = rX * 2 * 30;    
                    bodyDef.userData.height = rY * 2 * 30;    
                    body = m_world.CreateBody(bodyDef);   
                    body.CreateShape(boxDef);   
                }    
                // Circle   
                else {   
                    circleDef = new b2CircleDef();   
                    circleDef.radius = rX;   
                    circleDef.density = 1.0;   
                    circleDef.friction = 0.5;   
                    circleDef.restitution = 0.2  
                    bodyDef.userData = new PhysCircle();   
                    bodyDef.userData.width = rX * 2 * 30;    
                    bodyDef.userData.height = rX * 2 * 30;    
                    body = m_world.CreateBody(bodyDef);   
                    body.CreateShape(circleDef);   
                }   
                body.SetMassFromShapes();   
                addChild(bodyDef.userData);   
            }   
               
        }   
           
        public function Update(e:Event):void{   
               
            m_world.Step(m_timeStep, m_iterations);   
               
            // Go through body list and update sprite positions/rotations   
            for (var bb:b2Body = m_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);   
                }   
            }   
               
        }   
           
        public var m_world:b2World;   
        public var m_iterations:int = 10;   
        public var m_timeStep:Number = 1.0/30.0;   
           
    }   
  
} 
分享到:
评论

相关推荐

    物理模拟引擎box2D-2

    NULL 博文链接:https://ottoliu.iteye.com/blog/1159979

    box2d-wasm:Box2D物理引擎已编译为WebAssembly。 支持TypeScript和ES模块

    box2d-wasm Box2D编译为WebAssembly。 展示柜 展示自定义重力 使用释放 高性能主回路 WebGL渲染 用法 安装 npm i box2d-wasm 然后查看。 替代发行 有关其他功能: 流体模拟 粒子模拟 软体碰撞 您可以从分支进行...

    BOX2D 物理游戏编程初学者指南 陈文登(高清,带目录)

    高清带目录《Box2D物理游戏... 《Box2D物理游戏编程初学者指南》最后,通过大量的游戏效果模拟,直截了当地介绍相关知识点的实际应用,这些游戏包括《愤怒的小鸟》《叫醒盒子》《跨越重力》《星星大盗》《割绳子》等

    Box2D.go-Box2D的Go端口-游戏的2D物理引擎。-Golang开发

    这是Box2D(https://github.com/erincatto/Box2D)的端口,Box2D是Erin Catto用C ++编写的用于游戏的2D物理引擎。 该端口是完整的,并且基于截至201 Box2D.go的最新Box2D提交。这是什么? 这是Box2D...

    【基于 Gym-CarRacing 的自动驾驶项目】Box2D CarRacing lane-dection 项目模板

    多伦多大学自动驾驶专业的项目模板(提供...它是流行的 Box2D 物理引擎的一个版本,经过修改以支持模拟汽车在赛道上行驶的物理过程。模块化组件 (Modular Pipeline) 分为 低层次感知与场景解析、路径训练 和车辆控制。

    OPhone平台2D游戏引擎实现——物理引擎

    这里只是我们对Box2d的一个简单介绍,让大家明白其用处,关于更多详细信息,大家可以参考其官方网站http://www.box2d.org/,图12-1则是cocs2d中演示的Box2d物理引擎效果,学完这部分内容,你也可以很轻松将其运行在...

    Cocos2D-X游戏开发技术精解

    第1章 Cocos2D-X引擎的介绍 1 1.1 何为游戏引擎 1 1.1.1 游戏的核心—引擎 1 1.1.2 引擎的特点 2 1.1.3 知名的引擎介绍 4 1.1.4 引擎的分类 5 1.2 Cocos2D-X引擎的来历 8 1.3 引擎的版本 9 1.4 下载与安装 10 1.5 ...

    box2d 实例说明

    简单的box2D 环境搭配 世界 -全局-(模拟物理系统) 世界坐标系-上限 下限(同上) 重力加速度 g 是否沉溺 boolean 初始化 世界坐标系(模型物理) 刚体-物理引擎 刚体定义-userData- movieclip的处理 用世界去创建- ...

    Cocos2d-x 3.0 开发(九)使用Physicals代替Box2D和chipmunk

    模拟真实的世界是个比较麻烦的事情 通常这种事情都是交给物理引擎来做 但它们使用的过程中有个令人讨厌的地方 参数太多了 为了初始化一个简单的场景要写很多代码 在cocos2d x 3 0版本中 出现了一个新类族 physicals ...

    Box2D_Lite.rar_Box2D Lite e_Box2D_Lite_box2D

    BOX2D 物理2D引擎。 模拟2D世界物理环境。 WinDows版本

    Box2D_v2.2.1

    Box2D集成了大量的物理力学和运动学的计算,并将物理模拟过程封装到类对象中,将对物体的操作,以简单友好的接口提供给开发者。我们只需要调用引擎中相应的对象或函数,就可以模拟现实生活中的加速、减速、抛物线...

    box2d中文教程

    Box2D是一个用于模拟2D刚体物体的C++引擎。作者为Erin Catto。Box2D使用zlib许可。zlib许可是一个自由软件授权协议,但并非copyleft。 它已被用于蜡笔物理学、愤怒的小鸟、Rolando、Fantastic Contraption、...

    box2d融合Accelerometer加速度计

    让你轻松学会box2d中的使用,以及指导物理模拟中使用手机传感器的应用,比如本文的加速度计的使用

    Box2D物理游戏编程基础

    Box2Dweb物理游戏编程基础,试读版。用浅显易懂的语言讲述物理世界的模拟。

    Android Box2d 例子

    Android Box2d 例子,物理模拟效果很好,唯一的缺点是运行速度有些慢。

    IOS 开发源码:cocos2dx+box2d的库和演示实例

    IOS 开发源码:cocos2dx+box2d的库和演示实例.包含cocos2d-x的库和box2d的库,实现模拟物理碰撞、弹跳的源码

Global site tag (gtag.js) - Google Analytics