box2d 圆形边界的创建

本片文章是android仿摩拜贴纸碰撞|气泡碰撞的补充。
好多同学私信问我,圆形边界如何创建,今天就写篇文章一起学习下。

演示.gif

android仿摩拜贴纸碰撞|气泡碰撞中的评论中,给大家提供了一种思路,就是通过绘制正多边形的方式,近似看做圆形,实际上当边足够多时,就是一个圆。

image.png

image.png

现在需要做的就是确定正多边形的每一个顶点的坐标(x,y)以及正多边形边的长度和角度。

/**
     * 根据半径获取多边形每个点的坐标位置
     *
     * @param n 多边形边数
     * @param r 半径
     * @return
     */
    public ArrayList polygon2(int n, int r) {
        float segmentlength = Double.valueOf(r * Math.sin(Math.PI / n)).floatValue();  // 计算边长
        ArrayList<float[]> doubles = new ArrayList<>();
        double theta = 2 * Math.PI / n; // 角度
        for (int i = 0; i < n + 1; i++) {
            float x, y = 0f;
            x = Double.valueOf(r * Math.cos(theta * i)).floatValue();
            y = Double.valueOf(r * Math.sin(theta * i)).floatValue();
            float[] xy = new float[4];
            xy[0] = x + r;
            xy[1] = y + r;
            xy[2] = segmentlength;
            xy[3] = Double.valueOf(theta * i).floatValue();
            doubles.add(xy);
        }
        return doubles;
    }

生成圆形边界,这里使用polygonShape.setAsBox(height, width, new Vec2(x,y), angle)绘制每一条边,具体看下面代码。(这里重点需要关注物理单位和像素单位的区别,创建物理模型需要使用物理单位,绘制到屏幕上时,需要使用像素单位)

/**
     * 设置世界边界 圆形
     */
    private void initCircleWorldBounds(Canvas canvas) {
        // 绘制圆形边框
        canvas.drawCircle(pWidth / 2, pHeight / 2, pHeight / 2, paint);
        if (isInitWorld) {
            return;
        }
        BodyDef bodyDef = new BodyDef();
        bodyDef.type = BodyType.STATIC;//设置零重力,零速度
        bodyDef.position.set(0, 0);
        Body bodyTop = world.createBody(bodyDef);//世界中创建刚体
        FixtureDef fixtureDef = new FixtureDef();
        fixtureDef.density = 1f;//物质密度
        fixtureDef.friction = 0.3f;//摩擦系数
        fixtureDef.restitution = 0.5f;//恢复系数


        //设置圆形刚体边界
        ArrayList positions = polygon2(36, Double.valueOf(pHeight / 2).intValue());
        for (int i = 0; i < positions.size(); i++) {
            float[] xy = (float[]) positions.get(i);
            float x = xy[0];
            float y = xy[1];
            float segmentlength = xy[2];
            float angle = xy[3];
            PolygonShape polygonShape = new PolygonShape();
            // 设置具有方向的shape
            polygonShape.setAsBox(0, pixelsToMeters(segmentlength), new Vec2(pixelsToMeters(x), pixelsToMeters(y)), angle);
            fixtureDef.shape = polygonShape;
            bodyTop.createFixture(fixtureDef);//刚体添加夹具
        }
        isInitWorld = true;
    }

项目地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

truemi.73

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值