>

box2dlights를 사용하여 게임에 조명을 추가하려고하는데 box2d 바디로 그림자를 드리울 수없는 것 외에는 모든 것이 작동합니다. 또한 다양한 객체에 category/maskBits를 사용하여 충돌 작업을 수행하고 box2dlight 필터에 동일한 전략을 적용하려고합니다. 빛이 어떻게 몸을 통과했는지 볼 수 있습니다.

편집 : 라이트가 내 box2d 바디와 충돌하지 않는 이유를 발견했을 수도 있습니다. "실제"스케일 픽셀 좌표를 사용하여 바디 모양을 정의하면 조명이 그림자를 올바르게 투사하지만 바디가 내가 정의한 box2d 스케일과 달리 픽셀 스케일로 정의되므로 충돌이 없습니다. box2dlights가 실제 크기를 사용하는 이유를 아는 사람이 있습니까?

여기 내 RayHandler 설정이 있습니다

RayHandler.useDiffuseLight(false);
rayHandler = new RayHandler(world);
rayHandler.setAmbientLight(.5f, .5f, .2f, 1f);
rayHandler.setBlurNum(1);
rayHandler.setShadows(true);

화면 중앙에 위치한 PointLight가 있습니다.

PointLight pl = new PointLight(game.rayHandler, 128);
pl.setDistance(1000);
pl.setPosition(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2);
pl.setColor(Color.WHITE);
pl.setSoftnessLength(0);
Filter filter = new Filter();
filter.categoryBits = B2DVars.CATEGORY_LIGHT; // Value listed below
filter.maskBits = B2DVars.MASK_LIGHT;         // Value listed below
pl.setContactFilter(filter);

또한 내 몸은 다음과 같이 정의됩니다

body = world.createBody(squareBodyDef);
PolygonShape squareShape = new PolygonShape();
squareShape.setAsBox(b2dWidth / 2, b2dWidth / 2, new Vector2(squareBodyDef.position.x * WORLD_TO_BOX, squareBodyDef.position.y * WORLD_TO_BOX), 0f);
body.setUserData(this);
FixtureDef fdef = new FixtureDef();
fdef.shape = squareShape;
fdef.density = 10.0f;
fdef.friction =  0.1f;
fdef.restitution = 1.15f;
fdef.filter.categoryBits = CATEGORY_SQUARE_OBJECTIVE; // Value listed below
fdef.filter.maskBits = MASK_SQUARE; // Value listed below
body.createFixture(fdef).setUserData(this);
squareShape.dispose();

마지막으로 box2d 필터링 상수

public static final short CATEGORY_BALL = 1;
public static final short CATEGORY_LINE = 2;
public static final short CATEGORY_WALL = 4;
public static final short CATEGORY_SQUARE_OBJECTIVE = 8;
public static final short CATEGORY_TRIANGLE_OBJECTIVE = 16;
public static final short CATEGORY_LIGHT = 32;
public static final short LIGHT_GROUP = 1;
public static final short MASK_BALL =
                CATEGORY_LINE |
                CATEGORY_WALL |
                CATEGORY_SQUARE_OBJECTIVE |
                CATEGORY_TRIANGLE_OBJECTIVE;
public static final short MASK_LIGHT =
                CATEGORY_LINE |
                CATEGORY_SQUARE_OBJECTIVE |
                CATEGORY_TRIANGLE_OBJECTIVE |
                CATEGORY_WALL;
public static final short MASK_SQUARE =
                CATEGORY_BALL |
                CATEGORY_LIGHT;
public static final short MASK_WALL = -1

이 문제를 해결하기 위해 약 3 일 동안 논스톱으로 왔습니다. 도움을 주셔서 감사합니다!

  • 답변 # 1

    문제는 메인 카메라의 프로젝션 매트릭스를 RayHandler와 함께 사용하고 있다는 것이 었습니다. 기본적으로 기본 카메라는 100 픽셀 = 1 box2d 미터 인 월드/픽셀 단위이지만 투영 매트릭스는 box2d 단위 (미터) 여야합니다.

    libgdx reddit의 이 게시물 의 정보를 기반으로 함 포럼에서 box2dlights에 별도의 카메라를 만들어 문제를 해결하기로 결정했습니다. 여기 내가 사용한 솔루션이 있습니다 ...

    // Create a separate camera for box2dlights
    OrthographicCamera b2dCam = new OrthgraphicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    b2dCam.setToOrtho(false);
    b2dCam.update();
    
    

    box2dworld.step (..)호출 후 위의 카메라를 RayHandler와 함께 사용하십시오. 이 카메라는 box2d 세계로 확장해야합니다.

    // BOX_TO_WORLD = 100 and WORLD_TO_BOX = 0.01
    rayHandler.setCombinedMatrix(b2dCam.combined.scale(BOX_TO_WORLD,BOX_TO_WORLD,BOX_TO_WORLD), b2dCam.position.x * WORLD_TO_BOX, b2dCam.position.y WORLD_TO_BOX, b2dCam.viewportWidth * b2dCam.zoom, b2dCam.viewportHeight * b2dCam.zoom);
    rayHandler.updateAndRender();
    
    

    마지막으로 box2d 단위로 광원을 만들어야했습니다 ...

    PointLight pl = new PointLight(rayHandler, 128, Color.WHITE, 1500 * WORLD_TO_BOX, (Gdx.graphics.getWidth() / 2) * WORLD_TO_BOX, (Gdx.graphics.getHeight() / 2) * WORLD_TO_BOX);
    
    

    최종 결과 :

  • 이전 unity - Terraria와 같은 게임을위한 2D 조명 달성
  • 다음 tiles - 타 일식 - 이 특정 타일셋에서 지형을 만들 수 있습니까?