c++ - Box2D:将图像转换为物理体

标签 c++ opengl 2d box2d game-physics

我想将我的图像(.bmp 文件)转换为物理体。我试过了,但它不起作用,即我没有得到想要的结果。我已经在谷歌上搜索了很多,最后请大家帮助我,因为我是新手。另外我想知道是否真的有一种方法可以将图像转换为 box2D 主体,或者我们不能简单地做到这一点?我尝试了以下代码:

我的 addBrick 函数

b2Body* addBrick(int x,int y,int w,int h,bool dyn=true)
{

    b2BodyDef bodydef;  
    bodydef.position.Set(x*P2M,y*P2M);   //Setting body position
    if(dyn)
    {
            bodydef.type=b2_dynamicBody;  // dynamic body means body will move

    }

    b2Body* body=world->CreateBody(&bodydef);        //Creating box2D body

    b2PolygonShape shape;            //Creating shape object
    shape.SetAsBox(P2M*w,P2M*h);

    ////////////// Adding Fixtures(mass, density etc) //////////////

    b2FixtureDef fixturedef;
    fixturedef.shape=&shape;
    fixturedef.density=1.0;
    fixturedef.restitution = 0.7;
    body->CreateFixture(&fixturedef);
    return body;
}

drawbrick 逻辑:

void drawbrick()
{
    pix[0].readBMPFile("brick.bmp");
    pix[0].mDraw();


}

声明为b2Body

b2Body* myBrick;

调用函数:

myBrick = addBrick(100,0,10,10);
drawbrick();

我哪里错了?有人可以发现我的错误吗??

最佳答案

我发现将任何类型的图像转换为 Box2D 实体的最有效方法是使用 PhysicsEditor 工具 (link)。我不隶属于他们,我是一名独立的软件开发人员。

编辑器允许您导入图像,然后自动创建多边形,您可以将这些多边形导入“形状缓存”,然后在创建它们时加载到主体中。

Shape Cache API(您也可以从他们的站点获取)如下所示:

class Box2DShapeCache
   {
    public:
        // Static interface
        static Box2DShapeCache& instance(void);

    public:
        bool init();
        void addShapesWithFile(const std::string &plist);
      b2Fixture* addHullFixtureToBody(b2Body *body, const std::string &shape);

      /* Shapes created in the physics editor are in pixel dimensions.  When they are loaded
       * they are normalized to the size of maximum of the width/height.
       *
       */
        void addFixturesToBody(b2Body *body, const std::string &shape, float32 scaleMeters);
        CCPoint anchorPointForShape(const string& shape);
      CCSize imageSizeForShape(const string& shape);
      const std::vector<b2Vec2>& hullPointsForShape(const std::string &shape);
        void reset();
        float getPtmRatio() { return ptmRatio; }
        ~Box2DShapeCache() {}

    private:
        std::map<std::string, BodyDef *> shapeObjects;
        Box2DShapeCache(void) {}
        float ptmRatio;
    };

注意 1 - 我在 Cocos2d-x 中非常有效地使用了它。在此处的视频 (link) 中,它用于创建蜘蛛行走的小行星。

注意 2 - 原始类称为 GB2ShapeCache。它是用 objective-c 编写的,并已移植 ( here ) 到 C++。如果您需要另一个 C++ 版本,请告诉我(我的版本稍作修改以从该工具导入凸包),我可以提供帮助。

这有帮助吗?

关于c++ - Box2D:将图像转换为物理体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20021696/

相关文章:

c++ - C++ 中的上下文选择功能

c++ - cin.eof() 功能

c - 从二维数组打印字符时出现颠倒的问号

java - 具有输入值的二维 boolean 数组

C++ 继承不起作用

c++ - 使用字符串流时如何停止 double 转换为科学计数法

c++ - 如何从 gluUnProject 重新定位近平面和远平面以考虑相机位置和角度?

c++ - 与基本逻辑代码相比,OpenGL glDrawElements() 调用有多繁重?

c++ - 如何知道单位的平面尺寸?

algorithm - 自相交多边形的面积