当前位置: 首页 > 知识库问答 >
问题:

多个夹具的Box2D原点

湛鸿
2023-03-14

我认为当你对一个物体施加力时,它会施加在物体的原点(可能是质心)。现在我正尝试创建类似俄罗斯方块的块,并通过应用如下所示的linearPulse来使它们跳跃:

body.applyLinearImpulse(0, 5f, this.body.getPosition().x, this.body.getPosition().y, true);

这工作很好,如果你只有一个盒子的夹具作为身体,但当你创建多个夹具的原点被放错了,我不能把它放在夹具的中心。

下面是我的意思:

int array[][]= {{0,0,0,0,0},
        {0,0,1,0,0},
        {0,1,1,1,0},
        {0,0,0,0,0},
        {0,0,0,0,0}};
public void setBody(int[][] blocks){
        BodyDef def = new BodyDef();
        def.type = BodyType.DynamicBody;
        def.position.set(new Vector2(100 * WORLD_TO_BOX, 100 * WORLD_TO_BOX));
        Body body = world.createBody(def);
        body.setTransform(150*WORLD_TO_BOX, 200*WORLD_TO_BOX, -90*MathUtils.degreesToRadians);
        for (int x = 0; x < 5; x++) { // HARDCODED 5
            for (int y = 0; y < 5; y++) { // HARDCODED 5
                if(blocks[x][y] == 1){
                    PolygonShape poly = new PolygonShape();
                    Vector2 v = new Vector2((-5/2+x),(-5/2+y));
                    poly.setAsBox(size/2 * WORLD_TO_BOX, size/2 * WORLD_TO_BOX, v, 0);
                    body.createFixture(poly, 1);
                    poly.dispose();
                }
            }
        }
        this.body = body;
    }

共有1个答案

蓬野
2023-03-14

我不相信你可以设定物体的质心,它是由系统计算出来的。从手册:

可以访问局部和世界坐标中的质心位置。Box2D中的大部分内部模拟都使用质心。但是,您通常不需要访问它。取而代之的是,您通常会使用身体转换。例如,你可能有一个方形的身体。物体的原点可能是正方形的一个角,而质心则位于正方形的中心。

const b2Vec2& GetPosition() const;  
float32 GetAngle() const; 
const b2Vec2& GetWorldCenter() const;   
const b2Vec2& GetLocalCenter()

我相信您将使用GetWorldCenter()作为在世界坐标中应用线性脉冲(也根据手册):

 类似资料:
  • 如果我将这个圆形精灵的身体应用于AngularImush,它会沿着它的中心旋转,这就是我想要的。但是它的碰撞蒙版固定装置(绿色)沿着它自己的中心旋转,而不是精灵的中心。我如何让它也沿着精灵的中心旋转,这样碰撞蒙版和精灵就保持同步? 例如,在下面的图片中,当圆圈旋转,红色部分到达左上角时,我希望绿色碰撞蒙版在#3的位置。但是发生了#2。我知道为什么会发生这种情况,但是我如何才能实现我在这里试图实现的

  • 我想要两个SpriteBatch对象,一个用于实际的sprites,另一个用于HUD。我不知道如何让一个SpriteBatch保持相对屏幕的位置,但让另一个SpriteBatch以玩家的身体为中心移动。我有一个用于box2d身体的正交摄像头和一个用于精灵的正交摄像头。 我以为setProjingMatrix方法可以解决这个问题,但我可能用错了。 这给了我停留在左下角的“你好”,一个停留在中心并旋转

  • 我有一组身体,连接着一些关节(车轮关节、棱柱关节、旋转关节) 我试着用setTransform方法将这组身体移动到一个位置 我决定只移动一个身体到这个位置,其他身体应该跟随,因为关节。 我得到了一个奇怪的结果,尸体开始滚动,移动到任何地方,一个真正奇怪的结果,下面是一些图片来解释: 如何使用setTransform将多个连接有关节的实体移动到一个位置? 注:从A点到B点(移动)没有障碍物通过物体

  • 我的问题是,我的Box2D身体有另一个位置,而不是我想为该身体渲染的LibGDX精灵。在我的渲染循环中,对于每个实体,我将其精灵的位置设置为实体的位置,然后渲染它。创建圆以外的Box2D形状时,Box2D不会将其从原点移动,LibGDX精灵也不会移动。如果我现在移动或设置身体的位置,我的精灵将始终跟随它。但不幸的是,这在圆形图形中是不可能的:因为LibGDX的Sprite#设置位置没有考虑Spri

  • 为什么这工作正常: 这会产生运行时错误 错误: 这没有任何意义。第一个代码工作正常,三角形画好了,但第二个代码不行。有人能解释一下我做错了什么吗...

  • Box2D 是一个开源的 C++ 2D物理引擎。