Камерата следва целта в 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 не работят:
Например, ако искате да конвертирате 100px в единици Box2d:
100 * 0,032 = 3,2
И след това от единици Box2d в пиксели:
3,2 * 32 = 102,4

И разбира се разликата ще бъде по-голяма, ако преобразувате по-големи стойности.

person Kotcrab    schedule 11.01.2014