java libgdx移动透视摄像头

use*_*121 7 java camera android perspectivecamera libgdx

我正在创建一个3D游戏,但我不知道如何根据我的手指翻译相机.我正在创建一个地图(x = -30到+30; y = -30到30; z = -1到1),其中每个坐标用于使用我的资产中的.g3db文件的模型,并使用模型放置到位翻译.这项工作到目前为止,地图看起来很好,并以67%的角度查看.地图太大,无法立即在相机中查看(不,我不想缩小).每当我触摸我的Android手机的屏幕时,它只是围绕中心旋转,而是我希望游戏地图从我的视角保持原位,而是改变透视摄像机在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();
}
Run Code Online (Sandbox Code Playgroud)

我使用Spring工具套件3.5.1作为IDE和libgdx 1.0.1

Xop*_*ppa 15

不要使用a CameraInputController,而是实现InputProcessor并在调用中使用该类Gdx.input.setInputProcessor.

例如:

public class MyGdxGame extends ApplicationAdapter implements InputProcessor {
Run Code Online (Sandbox Code Playgroud)

并在创建方法:

Gdx.input.setInputProcessor(this);
Run Code Online (Sandbox Code Playgroud)

您必须实现此链接中显示的所有方法,除了需要其他代码的touchDownand 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;
}
Run Code Online (Sandbox Code Playgroud)

这里的dXdY值是用户在-1f和之间的范围内拖动的数量+1f.例如,对于dX值,0.5f意味着用户将屏幕尺寸的一半拖到右侧.请注意,这些是自上次调用方法以来的delta值.每次拖动操作可能会多次调用该方法.因此,dX并且dY将是小的价值观.

调用cam.position.add(...)将实际移动相机,并且调用cam.update();将重新计算渲染所需的值.我使用了10f相机的X和Y平移的乘数.这意味着如果用户完全从屏幕的左边缘拖动到右边缘,则相机将向右移动总共10个单位.您可以根据需要调整值.

请注意,这会将相机移动到XY平面上.如果您需要在XZ平面上移动,则需要相应地调整呼叫cam.position.add(...).此外,这不会改变相机的方向.如果你想移动相机,同时查看相同的位置,你需要在cam.lookAt(0,0,0);之前添加cam.update();.