【问题标题】:How to move a camera in a isometric scenario using Libgdx如何使用 Libgdx 在等距场景中移动相机
【发布时间】:2016-04-13 15:22:10
【问题描述】:

我正在使用 LibGdx 创建一个具有等距透视图的游戏。 我的代码基于这个例子:Isometric Tile Picking

我需要在屏幕中居中显示一个图块。我尝试使用 camera.lookAt() 但它不起作用。

public boolean tap(float screenX, float screenY, int count, int button) {

    touch.set(screenX, screenY, 0);
    cam.unproject(touch);
    touch.mul(invIsotransform);

    pickedTileX = (int) touch.x;
    pickedTileY = (int) touch.y;
    cam.lookAt(pickedTileX, pickedTileY, 0);

有什么想法吗? 谢谢!

【问题讨论】:

    标签: libgdx isometric


    【解决方案1】:

    您的代码不起作用的原因是,pickedTileXpickedTileY 都在世界坐标中,其中每个图块在正交网格中的宽度和高度为 1 个单位。

    要将相机对准您正在查看的图块,您实际上不需要找出点击了哪个图块。你只需要点的世界坐标和屏幕大小。以下代码应该可以解决问题:

    public boolean tap(float screenX, float screenY, int count, int button) {
        touch.set(screenX, screenY, 0);
        cam.unproject(touch);
    
        //Centralise the camera around the touch point
        cam.position.set(touch.x - cam.viewportWidth / 2,
                         touch.y - cam.viewportHeight / 2,
                         cam.position.z);
    

    您之前使用lookAt 方法所做的只是简单地改变了相机的方向而不进行平移。

    【讨论】:

    • 我不认为你想从位置中减去一半的屏幕尺寸。
    • 好的,用你的小费看起来更好,但它不准确。为什么我们不需要涉及等距变换矩阵?我对此有点迷茫
    【解决方案2】:

    通过将 Basim Khajwal 的响应与渲染映射算法中使用的相同公式结合起来,我终于找到了解决问题的方法。

        float x_pos = (pickedTileX * tileWidth / 2.0f) + (pickedTileY * tileWidth / 2.0f);
        float y_pos = -(pickedTileX * tileHeight / 2.0f) + (pickedTileY * tileHeight / 2.0f);
    
        touch.set( x_pos,  y_pos, cam.position.z);
        cam.position.set(  touch.x , touch.y, cam.position.z);
    

    现在我可以将任何图块居中,即使旋转和缩放我的场景也能正常工作。 (我不确定为什么 Basim 的方法效果不佳,这是有道理的)。

    非常感谢巴西姆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 2011-02-21
      • 2023-03-18
      • 1970-01-01
      • 2017-10-13
      相关资源
      最近更新 更多