文档章节

Box2D中ApplyForce( )和ApplyImpulse( ) 以及SetLinear...

童年伊梦
 童年伊梦
发布于 2012/09/25 12:41
字数 920
阅读 2424
收藏 0

先看API文档

  • ApplyForce()method

public function ApplyForce(force:b2Vec2, point:b2Vec2):void

Apply a force at a world point. If the force is not applied at the center of mass, it will generate a torque and affect the angular velocity.This wakes up the body.

Parameters
force:b2Vec2 — the world force vector, usually in Newtons (N).                 单位:牛顿
point:b2Vec2 — the world position of the point of application.

  • ApplyImpulse()method

public function ApplyImpulse(impulse:b2Vec2, point:b2Vec2):void

Apply an impulse at a point. This immediately modifies the velocity. It also modifies the angular velocity if the point of application is not at the center of mass.This wakes up the body.

Parameters
impulse:b2Vec2 — the world impulse vector, usually in N-seconds or kg-m/s.       单位:牛顿·秒    或者  千克·米/秒
point:b2Vec2 — the world position of the point of application.

  • SetLinearVelocity()method

public function SetLinearVelocity(v:b2Vec2):void

Set the linear velocity of the center of mass.

物体在休眠状态下,这个函数不起作用。因此先要唤醒物体,才能使用。

Parameters
v:b2Vec2 — the new linear velocity of the center of mass.

我该使用那个外力?

1.当物体静止不动的时候

这个静止不动包括了2种情况:一个是静止在地面 一个是上升到最高阶段即将下落的那一刻(速度为0)

2.当物体处于上升阶段的时候

3.当物体处于下降阶段的时候


源码:

package
{
    import Box2D.Collision.Shapes.b2PolygonShape;
    import Box2D.Common.Math.b2Vec2;
    import Box2D.Dynamics.b2Body;
    import Box2D.Dynamics.b2BodyDef;
    import Box2D.Dynamics.b2DebugDraw;
    import Box2D.Dynamics.b2Fixture;
    import Box2D.Dynamics.b2FixtureDef;
    import Box2D.Dynamics.b2World;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
    /**
     * ...
     * @author Childhood
     */
    public class Main extends Sprite 
    {
        private var world:b2World = new b2World(new b2Vec2(0, 10), true);
        private var worldScale:uint = 30;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
        public function Main():void
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            getStarted();
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
        private function getStarted():void
        {
            debugDraw();
            drawBox(0,800,1600,100,false,"ground");
            drawBox(100,500,100,100,true,"left");
            drawBox(400,500,10,10,true,"middle");
            drawBox(700,500,10,10,true,"right");
            addEventListener(Event.ENTER_FRAME, update);
            stage.addEventListener(MouseEvent.CLICK, applyForces);
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
        private function drawBox(px:Number,py:Number,width:Number,height:Number,d:Boolean,userData:*):void
        {
            var boxBodyDef:b2BodyDef = new b2BodyDef();
            boxBodyDef.position.Set(px / worldScale, py / worldScale);
            if (d) {
                boxBodyDef.type = b2Body.b2_dynamicBody;
            }
            var boxBody:b2Body = world.CreateBody(boxBodyDef);
            boxBody.SetUserData(userData);
            var boxShape:b2PolygonShape = new b2PolygonShape();
            boxShape.SetAsBox(width / 2 / worldScale, height / 2 / worldScale);
            var boxFixtureDef:b2FixtureDef = new b2FixtureDef();
            boxFixtureDef.shape = boxShape;
            var boxFixture:b2Fixture = boxBody.CreateFixture(boxFixtureDef);
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
        private function applyForces(e:MouseEvent):void
        {
            var force:b2Vec2;
            //Makes a for loop scanning all the bodys in the World
            for (var worldBody:b2Body = world.GetBodyList(); worldBody; worldBody = worldBody.GetNext()) {
                switch(worldBody.GetUserData()) {
                case "left":
                    force = new b2Vec2(0, -480);
                    //worldBody.ApplyForce(force, worldBody.GetWorldCenter());
                    worldBody.ApplyForce(force, worldBody.GetLocalPoint(new b2Vec2(15,15)));
                    break;
                case "middle":
                    force = new b2Vec2(0, -16);
                    worldBody.ApplyImpulse(force, worldBody.GetWorldCenter());
                    break;
                case "right":
                    force = new b2Vec2(0, -16);
                    worldBody.SetAwake(true);
                    worldBody.SetLinearVelocity(force);
                    break;
                }
            }
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
        private function update(e:Event):void
        {
            world.Step(1 / 30, 10, 10);
            world.ClearForces();
            world.DrawDebugData();
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
        private function debugDraw():void
        {
            var debugDraw:b2DebugDraw = new b2DebugDraw();
            var debugSprite:Sprite = new Sprite();
            addChild(debugSprite);
            debugDraw.SetSprite(debugSprite);
            debugDraw.SetDrawScale(worldScale);
            debugDraw.SetFillAlpha(0.8);
            debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);
            world.SetDebugDraw(debugDraw);
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
}

源码及其效果下载:

http://115.com/file/an83qkmw#ApplyForce&ApplyImpulse.rar

大家可以在以上3种情况下点击舞台,体会下3者的不同之处。

这里的ApplyForce()中的-480 和ApplyImpulse()中的-16是什么关系呢?

为什么这样子左边的箱子和中间的箱子分别给定这数值后运动保持一致呢?

  • 大家记得物理中的p=F*t 吧,动量=力*施加的时间,world的时间步是1/30s,-480*(1/30)=-16,-480是力,单位是牛顿,-16是动量,单位是牛顿*秒。所以左箱子和中间的箱子其实给定的冲量是一样的。不妨把时间步改成1/40,那么-480*(1/40)=-12,那我敢肯定当点击舞台的时候,左边的箱子给定的冲量12小于中间的箱子的冲量16(负号仅代表向上),左边的箱子没有中间的箱子蹦的高。

  • ApplyImpulse可以立即改变物体的速度,而ApplyForce施加的力需要world的时间步来改变物体的速度。(不知道这么理解对不对?)

  • SetLinearVelocity()每次使用的时候会把原来的动量清0然后加上给定的冲量。ApplyForce和ApplyImpulse会在原来的动量上进行加减运算。

以上看法可能有些出入,如果有误,希望朋友留言勘误。非常感谢!(童年) 

© 著作权归作者所有

童年伊梦
粉丝 1
博文 29
码字总数 21736
作品 0
浦东
私信 提问
Visual Studio 2012下Box2D开发环境设置

Cocos2d-x 3.x默认情况下采用的物理引擎是Chipmunk,如果我们要使用Box2D引擎,需要进行一些设置和调整,而且不同的开发平台下这些设置也有所不同。由于本书在此之前介绍的都是基于微软的Vis...

智捷课堂
2014/10/07
0
0
【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法

上一节讲述了粒子的相关问题,当然啦,不示弱,今天继续将物理系统给大家进行简单的介绍和讲述; 首先先介绍,如何在cocos2d中加入box2d开发lib包,因为一般使用cocos2d引擎进行开发游戏时,...

junwong
2012/03/02
1K
0
开源的物理引擎

物理引擎 是一种仿真程序,可用来创建一种虚拟环境,在其中集成来自物理世界的规律。在这个虚拟的环境中包括的物体,除了物体之间的相互作用(比如碰撞)外,还包括施加到它们身上的力(比如...

小卒过河
2011/09/07
2.1K
0
基于HT for Web 3D呈现Box2DJS物理引擎

上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是二维的平面碰撞物理引擎,但同样通过3...

xhload3d
2014/11/25
0
0
使用Doxygen来生成Box2d的API文档

对于Doxygen以前只听别人说过,而现在使用它也是一个偶然,缘分吧。前两天看box2d的官方sdk中,发现他有用户手册却没有说明,只是留下了一个Doxygen的文件。事情告一段落,然后今天在看box2d...

阳666
2015/11/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

日志相关---日志配置和过滤器

一、log4j日志简介 1.1、 Loggers 级别和介绍 Loggers组件在此系统中被分为八个级别:ALL、TRANCE、DEBUG、INFO、WARN、ERROR和FATAL、OFF。这八个级别是有顺序的, ##off表示关闭ALL < T...

spinachgit
16分钟前
1
0
六个面试题层层剖析——LongAddr原子类

并发编程面试题 (1)LongAddr的结构是怎样的? (2)当前线程应该访问Cell数组里面的哪一个Cell元素? (3)如何初始化Cell数组? (4)Cell数组如何扩容? (5)线程访问分配的Cell元素有冲...

须臾之余
18分钟前
4
0
MySQL-入门(二)

本部分主要是MySQL的常用函数和高级用法。 一、MySQL排序 排序关键字:order by 排序字段。后面写上要排序字段,排序字段可以有多个,多个采用逗号间隔,order by默认采用升序(asc)排序,可...

潜行-L
29分钟前
1
0
BAM转VCF的方法对比

1 使用GATK HaplotypeCaller #java -jar gatk.jar HaplotypeCaller --native-pair-hmm-threads 4 -R xx.fa -I xx.bam -O xx.vcf --native-pair-hmm-threads用来设置多线程,默认为4线程 2 sa......

悲催的古灵武士
37分钟前
0
0
软件架构设计原则之“KISS”的总结使用

今天聊一聊软件架构设计中的 KISS 原则。 对! 就是亲嘴的那个 “KISS”! 一定要多练习。 ... ... ... ... 作为一个程序员我是推荐理解为“亲嘴”的,可以很好的解决单身问题,但作为一个架...

Owen_Jia
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部