簡體   English   中英

LibGDX相機平滑翻譯

[英]LibGDX camera smooth translation

我該如何控制(線性插值)跟隨玩家的頂視圖游戲的攝像頭,使其在靠近目標時不會發抖。 這是我用於相機翻譯的代碼:

//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)使顫抖停止嗎?

我認為您不需要線性插值,但需要進行如下操作(未經測試,向量運算最多應被視為偽代碼):

//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);

所以我嘗試了libgdx,它工作得很好,只改變了Vector3中scl函數的比例和增量的速度

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

你做錯的是cameraPosition.lerp(target, 0.1f); 由於這會立即將lerp應用於攝影機位置,因此下一次您將其命名為cameraPosition不再相同,因此您將在上一次迭代的不同值之間進行攝影。

您可以做的是在開始收緊時存儲開始位置。

//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.
  //..
}

每當使用Vector獲得奇怪的結果時,它都是99%的時間,因為您沒有復制Vector並直接將方法應用到它,因為它使用了鏈接模式(它改變給定的對象並返回它)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM