我似乎无法找到一种方法将我的正射相机在 libgdx(带有 box2d 的项目)中的旋转与 box2d 主体的旋转联系起来。有 cam.rotate(xy) 的方法,给它一个脉冲或加速度,但我想设置一个确定的值,比如
cam.setAngle(player.body.getAngle());
我该怎么做呢?我必须编写自己的函数吗?如果是这样,那怎么办?我希望相机的旋转始终与玩家的旋转相同...
谢谢!
经过一夜好眠后,我刚醒来就想到了解决方案!函数 cam.angle(angle) 显然确实将角度设置为您想要的角度(以度为单位) - 但您只能执行一次,而不是在更新循环中,否则相机只会开始旋转。这很明显,但我只是没有得到它。
另一个问题是 box2d 主体具有“无限”度数(我使用 *MathUtils.radiansToDegrees 将所有内容转换为度数),因此我必须将这些限制为 0 到 359:
playerAngle = player.body.getAngle()*MathUtils.radiansToDegrees;
while(playerAngle<=0){
playerAngle += 360;
}
while(playerAngle>360){
playerAngle -= 360;
}
相机的度数从 -180 到 180,因此您还必须将这些转换为 0 到 359:
camAngle = -getCameraCurrentXYAngle(camera) + 180;
函数“getCameraCurrentXYAngle(cam)”如下:
public float getCameraCurrentXYAngle(OrthographicCamera cam)
{
return (float)Math.atan2(cam.up.x, cam.up.y)*MathUtils.radiansToDegrees;
}
现在使用它来更新你的凸轮到你的播放器的旋转:
camera.rotate((camAngle-playerAngle)+180);
我希望这对提出我的问题的人有所帮助;)
干杯,有一个富有成效的一天!乔纳斯
在 Box2D 中,角度可以是无限的,如建议的答案中所述。然而,用于限制角度的方法效率很低。更有效的解决方案是通过以下代码段使用模运算:
playerAngle = (player.body.getAngle() % 360) * MathUtils.radiansToDegrees()
下一步是计算相机的角度,上面提供的解决方案在这方面是足够的,但可以进一步浓缩为:
public float getCameraAngle(OrthographicCamera cam) {
return ((float) -Math.atan2(cam.up.x, cam.up.y) * MathUtils.radiansToDegrees) + 180;
}
现在,使用以下方法将相机旋转给定角度对于所有可能的值都是有效的rotate()
:
camera.rotate((getCameraAngle(camera) - playerAngle) + 180)