【问题标题】:LibGDX camera smooth translationLibGDX 相机平滑翻译
【发布时间】:2014-07-25 16:16:25
【问题描述】:

我怎样才能 lerp(线性插值)跟随玩家的顶视图游戏的相机,使其在接近目标时不会颤抖。这是我用于相机翻译的代码:

//Creating a vector 3 which represents the target location (my player)
Vector3 target = new Vector3(
(float)player.getPosition().x*map.getTileWidth()+(float)map.getTileWidth()/2, 
(float)player.getPosition().y*map.getTileHeight()+(float)map.getTileHeight()/2, 
0);
//Creating vector 3 which gets camera position
Vector3 cameraPosition = camera.position;
//Interpolating (lerping) vector 
cameraPosition.lerp(target, 0.1f);
//Updating camera and setting it for batch
camera.position.set(cameraPosition);        
camera.update();
batch.setProjectionMatrix(camera.combined);

我认为我这样做是正确的,但 alpha 值可能太小,但如果我将其变大,则相机移动太快并出现其他问题。我可以用这个 alpha 值(在我的示例中 alpha 为 0.1f)使颤抖停止吗?

【问题讨论】:

    标签: java opengl camera libgdx


    【解决方案1】:

    我认为您不想要线性插值,但是像这样(未经测试,向量运算充其量应该被视为伪代码):

    //Change speed to your need
    final float speed=0.1f,ispeed=1.0f-speed;
    //The result is roughly: old_position*0.9 + target * 0.1
    cameraPosition.scale(ispeed);
    target.scale(speed);
    cameraPosition.add(target);
    
    camera.position.set(cameraPosition);
    

    【讨论】:

    • 我实现了您发布的内容。它比线性插值效果好得多。感谢您的建议。
    • 您能否发布一些示例代码来演示解决方案。
    • @RichieHH 老实说,我没有使用足够的 libgdx 来记住所有样板代码。但这应该替换 OP 代码“cameraPosition.lerp(target, 0.1f);”中的一行。希望这对您有所帮助。
    【解决方案2】:

    所以我尝试了 libgdx,它工作得很好,只改变 Vector3 中 scl 函数的比例和 delta 的速度

     public void updateCam(float delta,float Xtaget, float Ytarget) {
    
            //Creating a vector 3 which represents the target location myplayer)
            Vector3 target = new Vector3(Xtaget,Ytarget,0); 
            //Change speed to your need
            final float speed=delta,ispeed=1.0f-speed;
            //The result is roughly: old_position*0.9 + target * 0.1
            Vector3 cameraPosition = camBox2D.position;
            cameraPosition.scl(ispeed);
            target.scl(speed);
            cameraPosition.add(target);
            camBox2D.position.set(cameraPosition);
    }
    

    【讨论】:

      【解决方案3】:

      您做错的是cameraPosition.lerp(target, 0.1f);,因为这会将 lerp 立即应用于相机位置,因此下次您调用它时,cameraPosition 不再相同,因此您在与上一次迭代不同的值之间进行调整。

      您可以做的是在开始 lerp 时存储开始位置。

      //call once when you want to move
      private void move()
      {
        beginPosition = cameraPosition.cpy(); 
        //make sure you copy so it's not a reference of cameraPosition.
        lerpAlpha = 0;
      }
      
      public update()
      {
        //..
        //Calculate lerp alpha
        lerpAlpha += .1;
        //..
        camera.position.set(beginposition.cpy().lerp(target, lerpAlpha), 0);
        //Copy again so it does not change.
        //..
      }
      

      每当您使用 Vectors 得到奇怪的结果时,99% 的情况都是因为您没有复制 Vector 并直接对其应用方法,因为它使用了链接模式(它会更改给定对象并返回它)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多