4

我有一个使用 Box2d 和 Box2d Lights 的 libgdx 游戏。

我的问题是如何让 Bodys / Bodydefs 忽略来自 Box2d Light 的光源而不投射阴影?

谢谢。

  PolygonShape groundBox = new PolygonShape();
  groundBox.setAsBox(2f, 2f);

  FixtureDef gridBox = new FixtureDef();
  gridBox.shape = groundBox;
  gridBox.density = 1.0f;

  gridBox.filter.groupIndex = GRID_GROUP;
  gridBox.filter.categoryBits = GRID_CAT;
  gridBox.filter.maskBits = GRID_MASK;

  bodyDefs[i][j] = new BodyDef();       
  bodyDefs[i][j].position.set(j*factor + factor, i*factor + factor);
  bodyDefs[i][j].fixedRotation = true;
  bodyDefs[i][j].type = BodyDef.BodyType.DynamicBody;

  bodies[i][j] = world.createBody(bodyDefs[i][j]);
  bodies[i][j].createFixture(gridBox);

  handler = new RayHandler(world);
  handler.setCombinedMatrix(camera.combined);
  Filter filter = new Filter();
  filter.groupIndex = GRID_GROUP; // GRID_GROUP = 1
  filter.categoryBits = GRID_CAT; // GRID_CAT = 0x0001;
  filter.maskBits = GRID_MASK;    // GRID_MASK = 1;

  new PointLight(handler, 1000, Color.RED, 2000, 0, height);

  PointLight.setContactFilter(filter);
4

2 回答 2

13

您可以使用以下方法:

cone.setContactFilter( categoryBits , groupIndex , maskBits );

其中 cone 是ConeLight类型的对象。现在这个灯将忽略具有指定 categoryBits、groupIndex 和 maskBits 的物体。

您可以通过以下方式通过 body 的夹具设置 categoryBits、groupIndex 和 maskBits-

fixture.filter.categoryBits = 你的价值;

(categoryBits :碰撞类别位。通常您只需设置一位。)

fixture.filter.groupIndex = 你的价值;

( groupIndex :碰撞组允许某组对象从不碰撞(负)或总是碰撞(正)。零表示没有碰撞组。非零组过滤总是胜过掩码位。)

fixture.filter.maskBits = 你的价值

(maskBits:碰撞掩码位。这说明了此形状将接受碰撞的类别。)

如果您希望某些机构忽略所有 LIGHTS。那么您可以使用以下 Light .setContactFilter(categoryBits, groupIndex, maskBits)

于 2013-09-01T18:28:15.677 回答
0

我相信接触过滤器只能使用 Box2D Lights 应用于 ALL LIGHTS。我尝试使用 aug13 引用的 setContactFilter 方法设置它们,但这是从 Light 继承的静态方法,不能从对象调用。我不知道它是否可以在过去的某个时候。

从文档:

public static void setContactFilter(short categoryBits,
                    short groupIndex,
                    short maskBits)

使用给定参数为所有灯创建新的联系人过滤器

于 2014-05-17T03:19:55.447 回答