box2d_box2dweb - CSDN
精华内容
参与话题
  • box2d中文教程

    2020-07-30 23:32:25
    Box2D 是一个用于游戏的 2D 刚体仿真库 程序员可以在他们的游戏里使用它 它可以使物体的运动 更加可信 让世界看起来更具交互性 从游戏的视角来看 物理引擎就是一个程序性动画 procedural animation 的系统 而不是由...
  • box2d学习2,添加鼠标关节MouseJoint控制物体,box2d一些基础概念
  • 使用Box2d做碰撞检测

    千次阅读 2017-09-14 15:46:13
    cocos2dx3.0+vs2012编译通过。 主要是通过body->SetTransform来设置body的位置和角度,然后自己写个ContactListener来监听碰撞事件 ...#include "HelloWorldScene.h" #include "VisibleRect.h" ...

    cocos2dx3.0+vs2012编译通过。

    主要是通过body->SetTransform来设置body的位置和角度,然后自己写个ContactListener来监听碰撞事件

    复制代码
    #include "HelloWorldScene.h"
    #include "VisibleRect.h"
    #include "GLES-Render.h"
    #include "cocos-ext.h"
    
    USING_NS_CC;
    USING_NS_CC_EXT;
    
    #define PTM_RATIO 32
    
    Scene* HelloWorld::createScene()
    {
        // 'scene' is an autorelease object
        auto scene = Scene::create();
        
        // 'layer' is an autorelease object
        auto layer = HelloWorld::create();
    
        // add layer as a child to scene
        scene->addChild(layer);
    
        // return the scene
        return scene;
    }
    
    // on "init" you need to initialize your instance
    bool HelloWorld::init()
    {
        //
        // 1. super init first
        if ( !Layer::init() )
        {
            return false;
        }
        setTouchEnabled( true );
        Size visibleSize = Director::getInstance()->getVisibleSize();
        Point origin = Director::getInstance()->getVisibleOrigin();
    
        /////
        // 2. add a menu item with "X" image, which is clicked to quit the program
        //    you may modify it.
    
        // add a "close" icon to exit the progress. it's an autorelease object
        auto closeItem = MenuItemImage::create(
                                               "CloseNormal.png",
                                               "CloseSelected.png",
                                               CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
        
        closeItem->setPosition(Point(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
                                    origin.y + closeItem->getContentSize().height/2));
    
        // create menu, it's an autorelease object
        auto menu = Menu::create(closeItem, NULL);
        menu->setPosition(Point::ZERO);
        this->addChild(menu, 1);
    
        /////
        // 3. add your codes below...
    
        // add a label shows "Hello World"
        // create and initialize a label
        
        auto label = LabelTTF::create("Hello World", "Arial", 24);
        
        // position the label on the center of the screen
        label->setPosition(Point(origin.x + visibleSize.width/2,
                                origin.y + visibleSize.height - label->getContentSize().height));
    
        // add the label as a child to this layer
        this->addChild(label, 1);
    
        // add "HelloWorld" splash screen"
        auto sprite = Sprite::create("HelloWorld.png");
    
        // position the sprite on the center of the screen
        sprite->setPosition(Point(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
    
        // add the sprite as a child to this layer
        //this->addChild(sprite, 0);
        
        initPhysics();
    
        Point p(200,200);
        b2BodyDef bodyDef;
        bodyDef.type = b2_dynamicBody;
        bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
    
        body = world->CreateBody(&bodyDef);
        
        // Define another box shape for our dynamic body.
        b2PolygonShape dynamicBox;
        dynamicBox.SetAsBox(.5f, .5f);//These are mid points for our 1m box
        
        // Define the dynamic body fixture.
        b2FixtureDef fixtureDef;
        fixtureDef.shape = &dynamicBox;    
        fixtureDef.density = 1.0f;
        fixtureDef.friction = 0.3f;
        body->CreateFixture(&fixtureDef);    
    
        scheduleUpdate();
    
        //UILayer* pUiLayer = UILayer::create();
        //addChild(pUiLayer);
            
        //Layout* pWidget = dynamic_cast<Layout*>(CCUIHELPER->createWidgetFromJsonFile("cocoStudio/DemoShop.ExportJson"));
        //pUiLayer->addWidget(pWidget);
    
    
    
        return true;
    }
    
    
    void HelloWorld::menuCloseCallback(Object* pSender)
    {
        Director::getInstance()->end();
    
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        exit(0);
    #endif
    }
    
    void HelloWorld::initPhysics()
    {
        b2Vec2 gravity;
        gravity.Set(0.0f, -10.0f);
        world = new b2World(gravity);
    
        // Do we want to let bodies sleep?
        world->SetAllowSleeping(true);
    
        world->SetContinuousPhysics(true);
    
         _debugDraw = new GLESDebugDraw( PTM_RATIO );
         world->SetDebugDraw(_debugDraw);
    
        uint32 flags = 0;
        flags += b2Draw::e_shapeBit;
                flags += b2Draw::e_jointBit;
                flags += b2Draw::e_aabbBit;
               flags += b2Draw::e_pairBit;
                flags += b2Draw::e_centerOfMassBit;
        _debugDraw->SetFlags(flags);
    
    
        // Define the ground body.
        b2BodyDef groundBodyDef;
        groundBodyDef.position.Set(0, 0); // bottom-left corner
    
        // Call the body factory which allocates memory for the ground body
        // from a pool and creates the ground box shape (also from a pool).
        // The body is also added to the world.
        b2Body* groundBody = world->CreateBody(&groundBodyDef);
    
        // Define the ground box shape.
        b2EdgeShape groundBox;
    
        // bottom
        groundBox.Set(b2Vec2(VisibleRect::leftBottom().x/PTM_RATIO,VisibleRect::leftBottom().y/PTM_RATIO), b2Vec2(VisibleRect::rightBottom().x/PTM_RATIO,VisibleRect::rightBottom().y/PTM_RATIO));
        groundBody->CreateFixture(&groundBox,0);
    
        // top
        groundBox.Set(b2Vec2(VisibleRect::leftTop().x/PTM_RATIO,VisibleRect::leftTop().y/PTM_RATIO), b2Vec2(VisibleRect::rightTop().x/PTM_RATIO,VisibleRect::rightTop().y/PTM_RATIO));
        groundBody->CreateFixture(&groundBox,0);
    
        // left
        groundBox.Set(b2Vec2(VisibleRect::leftTop().x/PTM_RATIO,VisibleRect::leftTop().y/PTM_RATIO), b2Vec2(VisibleRect::leftBottom().x/PTM_RATIO,VisibleRect::leftBottom().y/PTM_RATIO));
        groundBody->CreateFixture(&groundBox,0);
    
        // right
        groundBox.Set(b2Vec2(VisibleRect::rightBottom().x/PTM_RATIO,VisibleRect::rightBottom().y/PTM_RATIO), b2Vec2(VisibleRect::rightTop().x/PTM_RATIO,VisibleRect::rightTop().y/PTM_RATIO));
        groundBody->CreateFixture(&groundBox,0);
    
        class TestListener : public b2ContactListener
        {
            virtual void BeginContact(b2Contact* contact) 
            {
                //contact->GetFixtureA();
                //contact->GetFixtureB();
            }
            virtual void EndContact(b2Contact* contact) 
            { 
                //contact->GetFixtureA();
                //contact->GetFixtureB();
            }
        };
        pListener = new TestListener(); //don't forget to delete it
        world->SetContactListener(pListener);
    
        //groundBody->SetTransform
    }
    
    void HelloWorld::draw()
    {
        //
        // IMPORTANT:
        // This is only for debug purposes
        // It is recommend to disable it
        //
        CCLayer::draw();
    
    
        GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION );
    
        kmGLPushMatrix();
    
        world->DrawDebugData();
    
        kmGLPopMatrix();
    
    }
    
    void HelloWorld::update(float dt)
    {
        //It is recommended that a fixed time step is used with Box2D for stability
        //of the simulation, however, we are using a variable time step here.
        //You need to make an informed choice, the following URL is useful
        //http://gafferongames.com/game-physics/fix-your-timestep/
        
        int velocityIterations = 8;
        int positionIterations = 1;
    
        // Instruct the world to perform a single step of simulation. It is
        // generally best to keep the time step and iterations fixed.
        world->Step(dt, velocityIterations, positionIterations);
    }
    
    
    void HelloWorld::onTouchesEnded(const std::vector<Touch*>& touches, Event* event)
    {
        //Add a new body/atlas sprite at the touched location
        
        for (auto& touch : touches)
        {
            if(!touch)
                break;
    
            auto location = touch->getLocation();
            body->SetTransform(b2Vec2(location.x/PTM_RATIO,location.y/PTM_RATIO),0);
            body->SetAwake(true);//防止静止之后就再也不动了
            //addNewSpriteAtPosition( location );
        }
        
    }
    展开全文
  • Box2D例子——Demo3自行车

    千次阅读 2014-09-16 17:16:24
    Box2D例子——Demo3自行车
    package com.cvte.game;
    
    import com.badlogic.gdx.ApplicationAdapter;
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.Input.Keys;
    import com.badlogic.gdx.InputProcessor;
    import com.badlogic.gdx.graphics.GL20;
    import com.badlogic.gdx.graphics.OrthographicCamera;
    import com.badlogic.gdx.math.Vector2;
    import com.badlogic.gdx.physics.box2d.Body;
    import com.badlogic.gdx.physics.box2d.BodyDef;
    import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
    import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
    import com.badlogic.gdx.physics.box2d.CircleShape;
    import com.badlogic.gdx.physics.box2d.EdgeShape;
    import com.badlogic.gdx.physics.box2d.FixtureDef;
    import com.badlogic.gdx.physics.box2d.World;
    import com.badlogic.gdx.physics.box2d.joints.DistanceJoint;
    import com.badlogic.gdx.physics.box2d.joints.DistanceJointDef;
    
    public class Demo3 extends ApplicationAdapter implements InputProcessor {
    	
        private static final float PXTM = 80;
    	
    	protected OrthographicCamera mCamera;
    	private Box2DDebugRenderer mRenderer;
    	
    	private World mWorld;
    	
    	private Body mBodyA;
    	private Body mBodyB;
    	private DistanceJoint mDistanceJoint;
    	
    	@Override
    	public void create() {
            float cameraWidth = Gdx.graphics.getWidth() / PXTM;
            float cameraHeight = Gdx.graphics.getHeight() / PXTM;
    		mCamera = new OrthographicCamera(cameraWidth, cameraHeight);
    		mCamera.position.set(cameraWidth / 2, cameraHeight / 2, 0);
    		mCamera.update();
    		
    		mRenderer = new Box2DDebugRenderer();
    		
    		mWorld = new World(new Vector2(0, -10), true);
    		
    //		//ground
    //		{
    //			BodyDef bd = new BodyDef();
    //			bd.type = BodyType.StaticBody;
    //			bd.position.set(toWorldSize(0), toWorldSize(20));
    //
    //			EdgeShape edgeShape = new EdgeShape();
    //			edgeShape.set(new Vector2(toWorldSize(0), toWorldSize(0)), new Vector2(toWorldSize(Gdx.graphics.getWidth()), toWorldSize(0)));
    //
    //			FixtureDef fd = new FixtureDef();
    //			fd.shape = edgeShape;
    //
    //			Body ground = mWorld.createBody(bd);
    //			ground.createFixture(fd);
    //		}
    		
    		// wall
    		{
    			BodyDef bd = new BodyDef();
    			bd.type = BodyType.StaticBody;
    
    			EdgeShape edgeShape = new EdgeShape();
    
    			FixtureDef fd = new FixtureDef();
    			fd.shape = edgeShape;
    
    			Body box = mWorld.createBody(bd);
    			edgeShape.set(new Vector2(toWorldSize(0), toWorldSize(0)), new Vector2(toWorldSize(Gdx.graphics.getWidth()), toWorldSize(0)));
    			box.createFixture(fd);
    			edgeShape.set(new Vector2(toWorldSize(Gdx.graphics.getWidth()), toWorldSize(0)), new Vector2(toWorldSize(Gdx.graphics.getWidth()),
    					toWorldSize(Gdx.graphics.getHeight())));
    			box.createFixture(fd);
    			edgeShape.set(new Vector2(toWorldSize(Gdx.graphics.getWidth()), toWorldSize(Gdx.graphics.getHeight())), new Vector2(0, toWorldSize(Gdx.graphics.getHeight())));
    			box.createFixture(fd);
    			edgeShape.set(new Vector2(toWorldSize(0), toWorldSize(Gdx.graphics.getHeight())), new Vector2(0, toWorldSize(0)));
    			box.createFixture(fd);
    		}
    		
    		//ball
    		{
    			BodyDef bd = new BodyDef();
    			bd.type = BodyType.DynamicBody;
    			bd.position.set(toWorldSize(400), toWorldSize(800));
    			
    			CircleShape circleShape = new CircleShape();
    			circleShape.setRadius(toWorldSize(20));
    			
    			FixtureDef fd = new FixtureDef();
    			fd.shape = circleShape;
    			fd.density = 1;
    			fd.restitution = 1;
    			
    			Body ball = mWorld.createBody(bd);
    			ball.createFixture(fd);
    		}
    		
    		createBodies();
    		createDistanceJoint();
    		
    		Gdx.input.setInputProcessor(this);
    	}
    
    	@Override
    	public void dispose() {
    		mRenderer.dispose();
    		
    		mWorld.dispose();
    		
    		mCamera = null;
    	}
    
    	@Override
    	public void render() {
    		Gdx.gl.glClearColor(1, 1, 1, 1);
    		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    		
    		mWorld.step(Gdx.app.getGraphics().getDeltaTime(), 6, 2);
    		
    		mRenderer.render(mWorld, mCamera.combined);
    	}
    
    	private float toWorldSize(float pos) {
    		return (pos / PXTM);
    	}
    	
    	/**
    	 * 创建关节连接的两个刚体
    	 */
    	private void createBodies() {
    		Vector2 posA = new Vector2(toWorldSize(100), toWorldSize(100));
    		Vector2 posB = new Vector2(toWorldSize(200), toWorldSize(100));
    		
    		{
    			BodyDef bd = new BodyDef();
    			bd.type = BodyType.DynamicBody;
    			bd.position.set(posA.x, posA.y);
    			
    			CircleShape circleShape = new CircleShape();
    			circleShape.setRadius(toWorldSize(30));
    			
    			FixtureDef fd = new FixtureDef();
    			fd.shape = circleShape;
    			fd.density = 1;
    			fd.friction = 0.5f;
    			fd.restitution = 0;
    			
    			mBodyA = mWorld.createBody(bd);
    			mBodyA.createFixture(fd);
    		}
    		
    		{
    			BodyDef bd = new BodyDef();
    			bd.type = BodyType.DynamicBody;
    			bd.position.set(posB.x, posB.y);
    			
    			CircleShape circleShape = new CircleShape();
    			circleShape.setRadius(toWorldSize(15));
    			
    			FixtureDef fd = new FixtureDef();
    			fd.shape = circleShape;
    			fd.density = 1;
    			fd.friction = 0.5f;
    			fd.restitution = 0;
    			
    			mBodyB = mWorld.createBody(bd);
    			mBodyB.createFixture(fd);
    		}
    	}
    	
    	/**
    	 * 创建距离关节
    	 */
    	private void createDistanceJoint() {
    		DistanceJointDef djd = new DistanceJointDef();
    		djd.initialize(mBodyA, mBodyB, mBodyA.getPosition(), mBodyB.getPosition());
    		djd.collideConnected = true;
    		
    		mDistanceJoint = (DistanceJoint)mWorld.createJoint(djd);
    	}
    
    	@Override
    	public boolean keyDown(int keycode) {
    		if (keycode == Keys.LEFT) {
    			mBodyA.setAngularVelocity(2f);
    		}
    		else if (keycode == Keys.RIGHT) {
    			mBodyA.setAngularVelocity(-2f);
    		}
    		
    		return false;
    	}
    
    	@Override
    	public boolean keyUp(int keycode) {
    		return false;
    	}
    
    	@Override
    	public boolean keyTyped(char character) {
    		return false;
    	}
    
    	@Override
    	public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    		return false;
    	}
    
    	@Override
    	public boolean touchUp(int screenX, int screenY, int pointer, int button) {
    		return false;
    	}
    
    	@Override
    	public boolean touchDragged(int screenX, int screenY, int pointer) {
    		return false;
    	}
    
    	@Override
    	public boolean mouseMoved(int screenX, int screenY) {
    		return false;
    	}
    
    	@Override
    	public boolean scrolled(int amount) {
    		return false;
    	}
    	
    }

    展开全文
  • Box2D例子——弹球

    千次阅读 2014-09-08 19:19:18
    Box2D的世界里,无非要干以下几件事情: 首先创建一个body定义结构体,用以指定body的初始属性,比如位置或者速度。创建好body结构体后,你就可以调用world对象来创建一个body对象了。然后,你为body对象定义一...

    一、直接切入主题,经过上篇的HelloBox2D,大家应该有点概念了。在Box2D的世界里,无非要干以下几件事情:

    • 首先创建一个body定义结构体,用以指定body的初始属性,比如位置或者速度。
    • 创建好body结构体后,你就可以调用world对象来创建一个body对象了。
    • 然后,你为body对象定义一个shape,用以指定你想要仿真的物体的几何形状
    • 接着创建一个fixture定义,同时设置之前创建好的shape为fixture的一个属性,并且设置其它的属性,比如质量或者摩擦力。本篇重点
    • 最后,你可以使用body对象来创建fixture对象,通过传入一个fixture的定义结构就可以了。
    • 你可以往单个body对象里面添加很多个fixture对象。这个功能在你创建特别复杂的对象的时候非常有用。比如自行车,你可能要创建2个轮子,车身等等,这些fixture可以用关节连接起来。

     

    二、开始写代码吧,和上次框架一样,这里只说明一下主要的舞台类

    world = new World(new Vector2(0, -30f), true);

    首先创建一个物理世界,这里将加速度设置为30,使得下落效果明显点,你也可以自己调整看效果。

            BodyDef bd = new BodyDef();
            bd.position.set(2, 2);
            Body groundBody = world.createBody(bd);        
            EdgeShape edge = new EdgeShape();
            edge.set(new Vector2(0f, 0f), new Vector2(48f, 0f));
            FixtureDef boxShapeDef = new FixtureDef();
            boxShapeDef.shape = edge;
            groundBody.createFixture(boxShapeDef);

    再来定义和生成一个图形——边,大家可以参照上述的步骤。

            BodyDef ballBodyDef = new BodyDef();
            ballBodyDef.type = BodyType.DynamicBody;
            ballBodyDef.position.set(24f, 60f);
            body = world.createBody(ballBodyDef);
            body.setUserData("ball");
            CircleShape circle = new CircleShape();
            circle.setRadius(2f);
            FixtureDef ballShapeDef = new FixtureDef();
            ballShapeDef.shape = circle;
            ballShapeDef.density = 1.0f;
            ballShapeDef.friction = 0.2f;
            ballShapeDef.restitution = 0.8f;
            body.createFixture(ballShapeDef);

    再来一个图形——圆,大家可以看到红色部分为关键,球弹不弹就这里了。

    • Density 就是单位体积的质量(密度)。因此,一个对象的密度越大,那么它就有更多的质量,当然就会越难以移动。
    • Friction 就是摩擦力。它的范围是0~1.0, 0意味着没有摩擦,1代表最大摩擦,几乎移不动的摩擦。
    • Restitution 回复力。它的范围也是0到1.0. 0意味着对象碰撞之后不会反弹,1意味着是完全弹性碰撞,会以同样的速度反弹。

     

    三、libgdx与Box2D的结合,定义一个纹理

    private Texture ball;

    绑定一张图片

    ball = new Texture(Gdx.files.internal("Ball.jpg"));

    我们不再使用测试绘制器,而是使用常用的SpriteBatch,将纹理与物体同步刷新绘制

        @Override
        public void draw() {
            Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
            world.step(Gdx.app.getGraphics().getDeltaTime(), 6, 2);
            batch.begin();
            batch.draw(ball, body.getPosition().x, body.getPosition().y, 5f, 5f);
            batch.end();
            super.draw();
        }

     

    四、程序效果

    源码:https://github.com/dwintercode/Box2D

    展开全文
  • box2d源码解析 一

    千次阅读 2017-04-15 22:01:15
    标题:box2d源码解析 一 为什么写这篇博文: 前一段时间一直在花时间看box2d源码,真可谓废了九牛二虎之力,四处扒资料,皇天不负有心人你,最终还是将源码看完了,可以长舒一口气了.不过会想起我在学习过程中遇到的没有...

    排版问题,新文地址,谢谢


    为什么写这篇博文:

    前一段时间一直在花时间看box2d源码,真可谓废了九牛二虎之力,四处扒资料,皇天不负有心人,最终还是将源码看完了,可以长舒一口气了.不过会想起我在学习过程中遇到的没有资料之苦,是绝不能让后来人再次承受,因为这非但不是对毅力的历练,反而是对时间的浪费。

    网上的资料实在少得可怜,有关于box2d的,也是box2d的用法,根本就不是源码的解析。所以决定将我的学习历程分享给大家,帮助后来人,共勉。

    还想说一些关于学习要深入到精髓源码中去,而不是浮在表面学习一下别人写的东西的api之类的话,想着我等无名小辈,人微言轻,怕被喷,还是算了,还是算了。

    Box2d介绍:

    我就不从维基百科上复制了,自己说下了.这个东西对游戏开发者来说是再熟悉不过了,就是一个物理引擎,通过输入(刚体的位置,速度,角速度,用户的操作)通过一定的计算,给出输出(刚体新的位置,速度,角速度).如果不是特别了解的朋友,回忆下愤怒的小鸟,其中的物理效果就是靠Box2d来实现的~

     

    为什么会去看box2d源码:

             去看源码真心的出于兴趣,就是感觉box2d这个东西那是相当的神奇啊,怎么就能通过运算模拟出了物体(主要是刚体)的运动,还有各种约束。更重要的一点是我能找到源码,这就要感谢box2d的作者开放了源代码

     

    博文计划:

             第一篇博文主要是一个概述,说下我看了那些资料,还有一些看源码的时候的难以理解的点(通过看box2d作者写的文章到最后也不能理解的点) ,对于出来找资料准备自己研究源码的人来说,看第一篇博文足够用了,这里面会有必要资料,对box2d的概述.

             后面的博文会陆陆续续的出,主要是对一些具体的点的解析,还有就是一些外文网站的翻译,看源码的时候有哪里看不懂的可以回来看看.

    基本上废话就这么多,让我们直奔主题:

    学习历程:刚开始拿到源码的时候,想着一天看一个类不出一个月也能看完。可是后来发现,如果不知道一个类的用途,想去看懂其中的逻辑真心的费事。所以还是来csdn搜索了一下,发现了扭曲45 的文章,跟着他写的几篇文章的思路一直坚持,一直到他的最后一篇关于box2d的博文(真心感谢扭曲45 如果没有您,我不会坚持到最后,但是您的几篇文章都是将源码粘上去加上注释也是真心难看懂啊╭(╯3╰)╮)。但是后面的约束并没有涉及,也就是说看完他的文章如果都理解的话也只是知道了如何检测刚体之间发生了碰撞,得到碰撞的信息(后面的William的文章中也有说举得例子更详细~),至于如果判断刚体的进一步运动,如果合理约束,还是需要自己研究。然后通过,扭曲45的推荐找到了http://www.codezealot.org/这个网站,上面讲了很多关于约束的东西,然后通过codezealot的博主William的推荐找到了box2d的作者ErinCatto存放资料的地方https://code.google.com/p/box2d/downloads/list,里面有每年ErinCatto在WDC上的演讲的东西,其中的2005年 2006年的演讲资料,以及一个box2_Lite(box2d简化版)对看懂box2d源码意义重大。总结来说扭曲45 的博文主要是基础部分和碰撞部分,William的博文主要是详细的碰撞方法部分,和约束部分,ErinCatto的演讲资料,就是总结,所以看ErinCatto资料之前一定要对box2d有个基本的了解,这样看才会有收获才会发现精髓原来在这里,要不然指定是更加的迷糊一头雾水。还有最重要的就是自己的思考和不懈地坚持。通过这么多博文资料 自己的努力 足够看懂源码的了

    类解析:概要的介绍这里也不可能说的太详细,box2d中的很多函数都是全局函数,很多很多。还有一点不得不说,box2d中每个刚体都有着两套坐标,一套本地坐标,直接保存在属性中,还有一套世界坐标通过transform计算出来,两套坐标的好处,game-physics-engine-development-the-morgan-kaufmann-series-in-interactive-3d-technology.pdf中有讲,有中文版。

    一、Common文件夹下:此文件夹下最重要的莫过于对象池的实现了,其余的都是一些小函数,定义,and so on。

    1.      b2BlockAllocator:使用栈内存的小对象分配器,说白了其实就是自己先向系统申请一块较大的内存,然后自己掌控这块内存的分配回收,最后返回给系统。

    2.      b2StackAllocator:使用堆内存的小对象分配器。堆内存就是最后系统会自动回收,栈内存就是new alloc 申请的最后要释放的 那种内存。(应该没记错)

    3.      b2Draw:因为不懂OpenGl 所以看不懂写的什么,不过反正知道就是在黑窗口的时候画出一些图形,关节,碰撞点等等。

    4.      后面的就不写了很简单 源码自带的注释非常详细。

    二、Collision/Shapes文件夹下:各种形状的定义,都是继承自b2Shape

    三、Collision文件夹:

    1.      B2Distance:通过输入两个刚体(各种上面Shapes文件夹中定义的形状的),transform(刚体在世界坐标系中的位置,旋转角度),得出刚体的距离,return出去。

    2.      B2Collision:碰撞的常用函数实现。    RayCast()用来判断射线和刚体相交的位置,b2ClipSegmentToLine()在后面的分离轴处使用,b2TestOverlap()调用的b2Distance中的b2Distance()函数得到距离看是否重叠(碰撞)。

    3.      B2DynamicTree:动态AABB树,其实就是树,里面存的对象是AABB。AABB就是碰撞包围盒, 包裹在刚体周围的,一对边和x轴平行,另一对边和x轴垂直的矩形,详细的在game-physics-engine-development-the-morgan-kaufmann-series-in-interactive-3d-technology.pdf中有讲,有中文版.

    4.      B2BroadPhase:中有一个b2DynamicTree对象,也就是说b2BroadPhase是为了操作b2DynamicTree而生,在检测碰撞初期先用AABB进行粗略的碰撞检测,只有AABB碰撞的一对刚体才真的可能发生了碰撞,如果AABB都没有碰撞,说明这对刚体没有碰撞,引入AABB的意义在于,加快碰撞的检测,因为判断AABB是否碰撞远比判断具体的形状之间是否发生了碰撞代价小。

    5. b2CollideCircle。Cpp 这个家伙连个头文件都没有,其中的函数直接就是全局函数,用于计算圆形和圆形的碰撞。通过输入(constb2PolygonShape* polygonA,constb2Transform&xfA,

    constb2CircleShape* circleB,constb2Transform&xfB),计算出碰撞点的位置,个数,类型,放在输出(b2Manifold* manifold)中。

    6.      b2CollideEdge中的b2CollideEdgeAndCircle用于计算线段和圆形,b2EPCollider结构体用于计算线段和多边形。

    7.      b2CollidePolygon用于计算多边形和多变性,具体后面翻译的外文博客中有讲。

    四、Dynamic/Contacts文件夹

    1.      各种碰撞的定义都是继承自b2Contact,其中的得到碰撞信息都是调用的三、5.6。中的东西。

    五、Dynamic/Joint文件夹:

    1.      各种关节,都是继承于b2Joint,具体的东西,后面翻译的外文网站中有。

    六、Dynamic文件夹:这里面的东西,基本上就是相当于人类的大脑,操控全局,调用其它的类,函数。很多熟悉的就不多说了,很好理解。

    1.      b2Island:这个东西主要是b2word在处理碰撞的时候需要计算时,将各种东西塞进b2Island中进行计算,也就是说这个类存在的意义就是计算。

    2.      b2ConatactManager:同样也是为b2Word服务,用来管理碰撞。

     

    box2d源码解析 一  到这里基本上就结束了,全是一些概述。不过不急,谁也不可能一口吃成大胖子,慢慢来,一步一步展开。

    后面先翻译几篇外文,将必备知识储备完善,之后再说其他.

    展开全文
  • 安装Box2D

    千次阅读 2018-02-05 11:50:32
    $brew install swig, then: $git clone https://github.com/pybox2d/pybox2d pybox2d_dev $cd pybox2d_dev $python setup.py build $python setup.py install
  • Box2DJS入门教程

    千次阅读 2011-04-09 13:36:00
    <br />本文的主要目的是给大家介绍如何使用Box2DJS库在浏览器中创建一个物理世界,本文为基本入门教程,如果你想更深入的了解Box2D的功能,请看本文结尾“相关资源”中的“Box2D v2.0.1 用户手册”一、主函数...
  • Box2D物理引擎模拟炸弹爆炸效果

    万次阅读 2016-02-18 21:59:19
    在实现这个效果的时候,我想到了两种方案。 方案一:在炸弹刚体爆炸时,由炸弹刚体为起点,向四周喷散小刚体,这些小刚体会被喷射到附近的刚体上,对附近的刚体施加力,然后力是物体运动状态改变的原因(摘自高中...
  • Box2D物理引擎入门

    千次阅读 2017-07-18 16:56:07
    Box2D集成了大量的物理力学和运动学的计算,并将物理模拟过程封装到类对象中,将对物体的操作,以简单友好的接口提供给开发者。我们只需要调用引擎中相应的对象或函数,就可以模拟现实生活中的加速、减速、抛物线...
  • 使用Cocos2D和Box2D制作《Jetpack Joyride》(1) 发布时间:2012-03-13 09:47:12 Tags:LevelHelper,SpriteHelper,Xcode项目,《Jetpack Joyride》 作者:Bogdan Vladu 在本系列教程中,我们将...
  • unity3d 代码动态添加,修改BoxCollider2D

    万次阅读 2014-06-12 11:41:56
    tempQie2.AddComponent();  tempQie2.GetComponent().center =new Vector2(0f,0f);  tempQie2.GetComponent().size = new Vector2(0.32f, 0.32f);
  • Box2D C++ 教程-开发环境设置(iPhone) DEC 31posted in box2d-tutorials Box2D C++ 教程-连接器-平移 DEC 28posted in box2d-tutorials Box2D C++ 教程-连接器-旋转 DEC 26posted in box2d-...
  • 这个问题解决方案找死我了。。先是说swig的问题,搞了半天应该不是;...pip3 install box2d box2d-kengz 链接:https://stackoverflow.com/questions/50037674/attributeerror-module-box2d-h...
  • unity的博客好久都没有更新了,今天带了的绝对是劲爆的干货。。。 大家使用unity开发游戏估计有一大部分...Box2D是一款免费的开源二维物理引擎,由Erin Catto使用C++编写,在zlib授权下发布。它已被用于蜡笔物理学、
  • QT5.3 + vs2012 + box2d环境配置

    千次阅读 2019-05-27 15:32:14
    安装vs 和 qt 下载vs 2012,傻瓜式安装,但安装时间可能比较长。(其中一定选择“Visual C++”选项) 下载Qt 5.3,选择适合自己电脑的版本下载安装,我选的是qt-opensource-windows-x86-msvc2012_opengl-5.3.0....
  • 物理引擎比较:Box2D 对比 Chipmunk

    千次阅读 2014-08-29 22:04:01
    Cocos2d 自带了两套物理引擎:Box2D 和 Chipmunk。那么我们应该选择哪一个呢? 很多情况下,这个选择取决于个人口味。很多游戏开发者对这两个物理引擎的 争论集中于它们所用的编程语言:Box2D 是用 C++写的,而 Chipmunk...
  • Qt第三方库QML-Box2D——安装测试

    千次阅读 2014-03-17 23:24:55
    Box2D是一个用于模拟2D刚体物体的C++引擎。一般用于游戏制作。 这是源码地址:https://gitorious.org/qml-box2d 下载个与Qt版本相同的源码:这是Qt5的点击打开链接,其它版本的自己找吧。  这是官方给出的build...
  • cocos2d-x中的box2d(1)-testbed基本结构

    千次阅读 2012-02-13 22:17:13
    Cocos2d-x中自带了box2d引擎,cocos2d-x中也有cocos2d-x的示例,从本篇起,为了更好的研究box2d,从本篇起讲讲解示例,并进一步研究box2d 首先文件结构如下图所示 Test中是所有示例的.h文件,
  • 1.前段时间学习一个使用box2d的cocos2d-x游戏开发,反正写程序是没遇到问题,结果一编译,就傻眼了,各种无法解析的外部符,都直接指向box2d中的类,由于已经解决了,百度了张差不多的错误提示图片如下。2.大概很多...
1 2 3 4 5 ... 20
收藏数 42,243
精华内容 16,897
关键字:

box2d