我有一个与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);
答案 0 :(得分:11)
您可以使用以下方法:
cone.setContactFilter( categoryBits , groupIndex , maskBits );
其中,cone是 ConeLight 类型的对象。现在,这种光将忽略具有的身体 指定的categoryBits,groupIndex和maskBits。
您可以通过主体的夹具设置categoryBits,groupIndex和maskBits 以下方式 -
fixture.filter.categoryBits =您的值;
(categoryBits:碰撞类别位。通常你只需设置一位。)
fixture.filter.groupIndex =您的值;
(groupIndex:碰撞组允许某组对象永远不会碰撞(负)或总是碰撞(正)。零意味着 没有碰撞组。非零组过滤总是胜过掩码位。)
fixture.filter.maskBits =您的值
(maskBits:碰撞掩码位。这表示此形状可以接受碰撞的类别。)
如果您希望某些机构忽略所有灯光,那么您可以使用以下内容 光 .setContactFilter(categoryBits,groupIndex,maskBits)
答案 1 :(得分:0)
我相信接触过滤器只能使用Box2D Lights应用于所有灯光。我尝试使用aug13引用的setContactFilter方法设置它们,但这是一个从Light继承而且无法从对象调用的静态方法。我不知道在过去的某个时候它是否可以。
来自文档:
public static void setContactFilter(short categoryBits,
short groupIndex,
short maskBits)
使用参数
为所有灯光创建新的联系人过滤器