Камера следует за целью в Box2D

Я пытаюсь следить за игроком с камерой в мире Box2D. Но есть смещение. И я думаю, что это как-то связано с преобразованием пикселей на метр. Прежде чем вы проверите мой код, вы должны знать, что Values.WTB = World_To_Box and has a values of 0.032f и Values.BTW = Box_To_World and has a values of 32f.

Вот часть рендера:

@Override
    public void render(float delta) {
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        Gdx.gl.glClearColor(0.105f,0.105f,0.105f,1f);

        camera.position.set(player.getPosition().x*Values.BTW, player.getPosition().y*Values.BTW, 0);
        camera.update();

        Matrix4 cameraCopy = camera.combined.cpy();
        cameraCopy.scl(Values.BTW);
        batch.setProjectionMatrix(cameraCopy);
        shapeRenderer.setProjectionMatrix(cameraCopy);

        batch.begin();
        player.draw(batch);
        batch.end();

        debugRenderer.render(world, cameraCopy);

        world.step(1/60f, 6, 2);

        shapeRenderer.begin(ShapeType.Filled);

        shapeRenderer.setColor(Color.GREEN);
        shapeRenderer.circle(player.getPosition().x, player.getPosition().y, 5*Values.WTB,10);

        shapeRenderer.setColor(Color.ORANGE);
        shapeRenderer.circle(camera.position.x*Values.WTB, camera.position.y*Values.WTB, 5*Values.WTB,10);

        shapeRenderer.end();
    }

и вот изображение для демонстрации: введите здесь описание изображения

Зеленая точка – это центр игрока, а оранжевая точка – центр камеры. И чем дальше вы идете от координат 0,0 тем больше смещение.

Что я делаю не так?


person Rohit Malish    schedule 11.01.2014    source источник
comment
Почему Values.WTB = World_To_Box и имеет значения 0,032f ??? почему не 0.32f   -  person Pranav008    schedule 11.01.2014
comment
Я использовал его, потому что большее значение приводит к огромным размерам.   -  person Rohit Malish    schedule 11.01.2014


Ответы (2)


Values.WTB = World_To_Box и имеет значения 0,032f и Values.BTW = Box_To_World и имеет значения 32f

Нет причин менять значения WTB/BTW на 0,01f и 100f, как это было предложено другими, поскольку ваши значения почти верны. Преобразования в степени двойки также намного быстрее, чем преобразования в 100.

Если вы хотите 32 пикселя экрана на метр box2d, продолжайте использовать Values.BTW = 32f. Но тогда Values.WTB будет 1f / 32f = 0.03125f, а не 0.032f. Это всего лишь небольшая разница, но в конечном итоге она имеет значение.

person noone    schedule 11.01.2014
comment
изменение 0,032f на 0,03125f помогло. Но без cameraCopy.scl(Values.BTW); Мир box2d — это часть экрана. - person Rohit Malish; 12.01.2014
comment
@RohitMalish Мне это кажется странным. Возможно, это как-то связано с тем, как вы настраиваете окна просмотра вашего рендерера. Но это не часть кода, и ваша проблема, похоже, решена... так что, однако :) - person noone; 12.01.2014
comment
Я устанавливаю положение камеры, но никогда не масштабирую его, пока cameraCopy.scl(Values.BTW); - person Rohit Malish; 12.01.2014
comment
@RohitMalish Но здесь camera.position.set(player.getPosition().x*Values.BTW, player.getPosition().y*Values.BTW вы масштабируете его, не так ли? - person noone; 12.01.2014
comment
но масштабирует ли он его, если я только устанавливаю положение? я масштабирую позицию игрока, верно? - person Rohit Malish; 12.01.2014
comment
@RohitMalish А, теперь понял. На самом деле вы не масштабируете положение игрока, потому что вы просто масштабируете значения x и y. По сути, это означает, что вы масштабируете положение камеры. При выполнении cameraCopy.scl(Values.BTW); вы масштабируете область просмотра камеры. Вам, вероятно, придется это сделать, потому что область просмотра вашей камеры изначально находится в единицах измерения box2d, верно? (это означает, что вы установили ширину * WTB или ширину / BTW) - person noone; 12.01.2014
comment
не совсем, я создаю его с помощью пустого конструктора, такого как этот camera = new OrthographicCamera(); - person Rohit Malish; 12.01.2014
comment
@RohitMalish Ну, в этом случае размер экрана используется в качестве области просмотра, и вам не нужен этот второй масштаб. Что ж, тогда это останется загадкой, по крайней мере, для меня. Я удалю эту часть из своего ответа. - person noone; 12.01.2014

Измените свои значения на:

static final float WORLD_TO_BOX = 0.01f;
static final float BOX_TO_WORLD = 100f;

Почему 0,032 и 32 не работают:
Например, если вы хотите преобразовать 100 пикселей в единицы Box2d:
100 * 0,032 = 3,2
А затем из единиц Box2d в пиксели:
3,2 * 32 = 102,4

И, конечно, разница будет больше, если вы конвертируете большие значения.

person Kotcrab    schedule 11.01.2014