Raycasting не сообщает о столкновении

1

Хорошо, поэтому я пытаюсь вернуть объект обратно, с которым столкнулся луч, но я всегда возвращаю значение null. Вот код.

    public static PerspectiveCamera cam;
static btCollisionWorld collisionWorld;
DebugDrawer debugDrawer;
public ModelBatch modelBatch;
btCollisionConfiguration collisionConfig;
static btDispatcher dispatcher;
btBroadphaseInterface broadphase;
public static btCollisionShape voxelShape;
public static Viewport viewport;
public static Model model;
public static ModelInstance test;
public static btCollisionShape collisiontest;
public static btCollisionObject collisiontestobject;


@Override
public void create () {
    Bullet.init();
    collisionConfig = new btDefaultCollisionConfiguration();
    dispatcher = new btCollisionDispatcher(collisionConfig);
    broadphase = new btDbvtBroadphase();
    collisionWorld = new btCollisionWorld(dispatcher, broadphase, collisionConfig);

    cam = new PerspectiveCamera(67, 1280, 720);
    cam.position.set(10f,10f,10f);
    cam.lookAt(0,0,0);
    cam.near = 1f;
    cam.far = 300f;
    cam.update();

    modelBatch = new ModelBatch();


    ModelBuilder modelBuilder = new ModelBuilder();
    model = modelBuilder.createBox(3f, 3f, 3f,
            new Material(ColorAttribute.createDiffuse(Color.BLUE)),
            Usage.Position | Usage.Normal);

    test = new ModelInstance(model);

    test.transform.setTranslation(0,0,0);

    collisiontest = new btBoxShape(new Vector3 (1.5f,1.5f,1.5f));

    collisiontestobject = new btCollisionObject();
    collisiontestobject.setCollisionShape(collisiontest);
    collisiontestobject.setWorldTransform(new Matrix4());

    debugDrawer = new DebugDrawer();
    debugDrawer.setDebugMode(btIDebugDraw.DebugDrawModes.DBG_MAX_DEBUG_DRAW_MODE);

    collisionWorld.setDebugDrawer(debugDrawer);

    collisionWorld.addCollisionObject(collisiontestobject);

    viewport = new FitViewport(1280, 720, cam);

    Gdx.input.setInputProcessor(new BulletInputProcessor(viewport, collisionWorld));


}

@Override
public void render () {

    cam.update();


    Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);


    debugDrawer.begin(cam);
    collisionWorld.debugDrawWorld();
    debugDrawer.end();

    modelBatch.begin(cam);
    modelBatch.render(test);
    modelBatch.end();


}

И следующая часть

public class RayTesting {

private static final Vector3 rayFrom = new Vector3();
private static final Vector3 rayTo = new Vector3();
private static final ClosestRayResultCallback callback = new ClosestRayResultCallback(rayFrom, rayTo);

public static btCollisionObject rayTest(btCollisionWorld collisionWorld, Ray ray) {
    rayFrom.set(ray.origin);
    // 50 meters max from the origin
    rayTo.set(ray.direction).scl(50f).add(rayFrom);

    // we reuse the ClosestRayResultCallback, thus we need to reset its
    // values
    callback.setCollisionObject(null);
    callback.setClosestHitFraction(1f);
    callback.getRayFromWorld().setValue(rayFrom.x, rayFrom.y, rayFrom.z);
    callback.getRayToWorld().setValue(rayTo.x, rayTo.y, rayTo.z);

    collisionWorld.rayTest(rayFrom, rayTo, callback);

    if (callback.hasHit()) {
        return callback.getCollisionObject();
    }

    return null;
}






}

И для последней части.

public class BulletInputProcessor extends InputAdapter {

private Viewport pickingViewport;
private btCollisionWorld collisionWorld;

// a constructor which takes a Viewport and the collision world and stores them
public BulletInputProcessor(Viewport viewport, btCollisionWorld collisionWorld){

    this.pickingViewport = viewport;

    this.collisionWorld = collisionWorld;



}

@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
    if (button == Input.Buttons.LEFT) {
        Ray pickRay = pickingViewport.getPickRay(screenX, screenY);

        btCollisionObject body = RayTesting.rayTest(collisionWorld, pickRay);
        if (body != null) {
            System.out.println("Test");
            return true;
        }
    }

    return false;
}

}

Я полностью потерял, я понимаю большую часть материала Libgdx, но пуля запутала меня. Btw Спасибо @noone За всю помощь! Очень ценю это: D

  • 0
    Вы должны начать чаще использовать отладчик. Но так как ваши вопросы довольно замкнуты, я могу использовать отладчик для вас;)
Теги:
libgdx
bulletphysics

1 ответ

0
Лучший ответ

Ваш видовой экран не обновляется, как предполагалось. Размер его видового экрана - 0. В результате получается Ray (pickingViewport.getPickRay(...)), который состоит исключительно из значений NaN (не числа). Кажется, что Пуля справляется с этим без исключения, но, конечно, это работает неправильно. Добавьте в свой ApplicationAdapter или Screen или другое, что вы используете.

@Override
public void resize(int width, int height) {
    viewport.update(width, height);
}
  • 0
    Каждый раз, когда вы комментируете, я чувствую себя идиотом 0.0 Большое спасибо за помощь еще раз
  • 0
    Хаха, нет проблем. Я также много боролся с пулей в начале :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню