我似乎无法找到一种方法将我的正交相机在libgdx(带有box2d的项目)的旋转与box2d体的旋转联系起来。 有cam.rotate(xy)的方法,给它一个冲动或加速,但我想设置一个确定的值,如
cam.setAngle(player.body.getAngle());
我该怎么做呢?我是否必须编写自己的功能?如果是这样,那怎么样?我希望相机的旋转始终与玩家的旋转相同......
谢谢!
答案 0 :(得分:6)
睡了一夜好觉后,我只是想到了解决方案! 函数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);
我希望这可以帮助提出我问题的人;)
干杯,祝你有充实的一天! 纳斯
答案 1 :(得分:0)
在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)