LibGDX相机平滑移动

4

如何对跟随玩家的俯视游戏相机进行线性插值操作(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为0.1f)停止颤抖吗?

3个回答

4

我尝试使用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);
}

4
我认为你不需要线性插值,而是像这样(未经测试,矢量运算应被视为伪代码):
//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);

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

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

你可以做的是,在开始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.
  //..
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接