java libgdx移动透视照相机

java libgdx移动透视照相机,java,android,camera,libgdx,perspectivecamera,Java,Android,Camera,Libgdx,Perspectivecamera,我正在制作一个3D游戏,但我不知道如何根据我的手指来翻译相机。我正在创建一个映射(x=-30到+30;y=-30到30;z=-1到1),其中每个坐标都用于使用我的资源中的.g3db文件的模型,并使用模型转换将其放置到位。到目前为止,这是可行的,地图看起来不错,并且以67%的角度观看。这张地图太大了,无法立即在相机中查看(不,我不想缩小)。每当我触摸android手机的屏幕时,它只是围绕中心旋转,但我希望游戏地图从我的角度保持在原位,并改变透视相机在x轴和y轴上的位置。没有游戏对象可以用于位置跟踪

我正在制作一个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();
}

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

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

例如:

public class MyGdxGame extends ApplicationAdapter implements InputProcessor {
在create方法中:

Gdx.input.setInputProcessor(this);
您必须实现中所示的所有方法,除了需要额外代码的
触地
触地
方法外:

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
值是用户在
-1f
+1f
范围内在屏幕上拖动的量。例如,对于
dX
而言,
0.5f
的值表示用户向右拖动了一半屏幕大小。请注意,这些是自上次调用该方法以来的增量值。每次拖动操作都可能多次调用该方法。因此,
dX
dY
将是小值

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


请注意,这会在XY平面上移动摄影机。如果您需要在例如XZ平面上移动,则需要调整调用
凸轮位置。相应地添加(…)
。此外,这不会改变相机的方向。如果您想移动相机,同时观察同一位置,则需要添加
cam.lookAt(0,0,0)就在
cam.update()之前

对于键盘输入,类似于
render()
中的
if(Gdx.input.isKeyPressed(input.Keys.W))
也很有用