камера перспективы движения Java libgdx

Я создаю 3D-игру, но я не знаю, как перевести камеру в соответствии с моими пальцами. Я создаю карту(x = -30 до +30;y = -30 до 30;z = -1 до 1), где каждая координата используется для использования модели .g3db файлы из моих активов и поставить на место с помощью перевода модели. Это работает до сих пор, карта выглядит хорошо и просматривается под углом 67%. Карта настолько велика, что ее нельзя сразу просмотреть в камере(нет, я не хочу уменьшать масштаб). Всякий раз, когда я прикасаюсь к экрану моего телефона он просто вращается вокруг центра, но вместо этого я хочу, чтобы карта игры оставалась на месте с моей точки зрения и вместо этого меняла положение камеры перспективы на оси x и Y. Нет игрового объекта, который можно использовать для отслеживания позиции, все должно зависеть от действий моего пальца. Таким образом, я хочу перейти на видимый экран в каждом направлении x и y(подумайте об этом визуально, как 2D-камера, движущаяся вверх, вниз и в стороны перед изображением). Ты можешь помочь? я?

Это мой код до сих пор:

public class MyGdxGame extends ApplicationAdapter implements ApplicationListener{
//define variables
...
@Override
public void create() {
    environment = new Environment();
    environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
    environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));

    modelBatch = new ModelBatch();

    cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    cam.position.set(10f, 10f, 10f);
    cam.lookAt(0,0,0);
    cam.near = 1f;
    cam.far = 300f;
    cam.update();

    assets = new AssetManager();
    //load assets
    ...
    loading = true;        
    camController = new CameraInputController(cam);
    camController.forwardTarget = true;
    Gdx.input.setInputProcessor(camController);      
}

private void doneLoading() {
//load models and add them to instances
loading = false
}

    @Override
public void render() {
    if (loading && assets.update())
        doneLoading();
    camController.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);

    modelBatch.begin(cam);
    modelBatch.render(instances, environment);
    modelBatch.end();
}

Я использую spring tool suite 3.5.1 как IDE и libgdx 1.0.1

1 ответов


не использовать CameraInputController, но вместо того, чтобы реализовать InputProcessor и используйте этот класс в вызове Gdx.input.setInputProcessor.

например:

public class MyGdxGame extends ApplicationAdapter implements InputProcessor {

и в методе create:

Gdx.input.setInputProcessor(this);

вам придется реализовать все методы, как показано в этой ссылке, за исключением touchDown и touchDragged метод, который требует дополнительного кода:

private int dragX, dragY;
@Override
public boolean touchDown (int x, int y, int pointer, int button) {
    dragX = x;
    dragY = y;
    return true;
}

@Override
public boolean touchDragged (int x, int y, int pointer) {
    float dX = (float)(x-dragX)/(float)Gdx.graphics.getWidth();
    float dY = (float)(dragY-y)/(float)Gdx.graphics.getHeight();
    dragX = x;
    dragY = y;
    cam.position.add(dX * 10f, dY * 10f, 0f);
    cam.update();
    return true;
}
на dX и dY values-это количество, которое пользователь имеет перетаскивается на экран в диапазоне между -1f и +1f. Е. Г. для dX значение 0.5f означает, что пользователь перетащил половину размера экрана. Обратите внимание, что это Дельта-значения с момента последнего вызова метода. Метод, вероятно, будет вызываться много раз за операцию перетаскивания. Поэтому ... --7--> и dY будут небольшие значения.

вызов cam.position.add(...) фактически переместит камеру и вызов cam.update(); будет пересчитывать значения требуется для рендеринга. Я использовал множитель 10f как для X, так и для y-перевода камеры. Это означает, что если пользователь полностью перетаскивает с левого края на правый край экрана, то камера переместит в общей сложности 10 единиц вправо. Вы можете настроить значение по мере необходимости.

обратите внимание, что это перемещает камеру на плоскости XY. Если вам нужно перейти, например, на плоскость XZ, вам нужно настроить вызов cam.position.add(...) соответственно. Кроме того, это не меняет направление камеры. Если вы хотите переместить камеру, глядя в том же месте, вам нужно добавить cam.lookAt(0,0,0); перед cam.update();.