gpt4 book ai didi

java libgdx 移动透视相机

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:02 25 4
gpt4 key购买 nike

我正在创建一个 3D 游戏,但我不知道如何根据我的手指平移相机。我正在创建一个 map (x = -30 到 +30;y = -30 到 30;z = -1 到 1),其中每个坐标都用于使用我 Assets 中的 .g3db 文件的模型,并使用模型放置到位翻译。到目前为止这有效, map 看起来不错并且以 67% 的角度查看。 map 太大了,无法立即在相机中查看(不,我不想缩小)。每当我触摸我的 Android 手机的屏幕时,它只是围绕中心旋转,但我希望游戏 map 从我的角度来看留在原地,而不是改变透视相机在 x 和 y 轴上的位置。没有可以用于位置跟踪的游戏对象,一切都应该取决于我的手指 Action 。通过这种方式,我想移动到每个 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,而是实现 InputProcessor并在对 Gdx.input.setInputProcessor 的调用中使用该类。

例如:

public class MyGdxGame extends ApplicationAdapter implements InputProcessor {

在创建方法中:

Gdx.input.setInputProcessor(this);

您必须实现所有方法,如 this link 中所示。 ,除了需要额外代码的 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。例如。对于 dX0.5f 的值意味着用户向右拖动了一半的屏幕尺寸。请注意,这些是自上次调用该方法以来的增量值。每个拖动操作可能会多次调用该方法。因此,dXdY 将是较小的值。

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

请注意,这会在 XY 平面上移动相机。如果您需要继续前进,例如XZ 平面,您需要相应地调整对 cam.position.add(...) 的调用。此外,这不会改变相机的方向。如果您想移动相机,同时注视同一位置,则需要在 cam.update(); 之前添加 cam.lookAt(0,0,0);

关于java libgdx 移动透视相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23921555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com