java libgdx移动透视摄像头

我正在创build一个3D游戏,但我不知道如何根据我的手指来翻译相机。 我正在创build一个映射(x = -30到+30; y = -30到30; z = -1到1),其中每个坐标用于使用我的资产中的.g3db文件的模型,并使用模型翻译。 到目前为止,这个地图看起来不错,并以67%的angular度观看。 地图太大,无法一次在相机中查看(不,我不想缩小)。 每当我触摸我的android手机的屏幕,它只是围绕中心旋转,而是我希望游戏地图从我的angular度来看,而不是改变透视摄像机在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

Solutions Collecting From Web of "java libgdx移动透视摄像头"

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

例如:

 public class MyGdxGame extends ApplicationAdapter implements InputProcessor { 

而在创build方法中:

 Gdx.input.setInputProcessor(this); 

除了touchDowntouchDragged方法需要额外的代码之外,你必须实现这个链接中所示的所有方法:

 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; } 

这里的dXdY值是用户在-1f+1f之间范围内拖动的数量。 例如,对于dX ,值为0.5f表示用户将屏幕大小的一半拖到右侧。 请注意,这些是自上次调用方法以来的增量值。 该方法可能会被每次拖动操作调用多次。 因此, dXdY值很小。

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

请注意,这会在XY平面上移动相机。 如果您需要继续前进,例如XZ飞机,则需要相应调整cam.position.add(...) 。 而且,这不会改变相机的方向。 如果你想移动摄像机,同时查看相同的位置,你需要添加cam.lookAt(0,0,0); 就在cam.update();之前cam.update();