【问题标题】:Rotating zombies to face player旋转僵尸面对玩家
【发布时间】:2019-05-09 14:32:19
【问题描述】:

我正在尝试旋转一大群僵尸来面对玩家。一段时间以来,我一直试图自己弄清楚,但我似乎无法弄清楚。

我目前正在使用以下代码来旋转僵尸:

public void calculateAngle() {
        double theta = 0.0d;
        for(Zombie zombie : entities) {
            double a = zombie.getX() - player.getX(); 
            double b = zombie.getY() - player.getY();
            double c = (int) Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));

            if(zombie.getX() > player.getX() && zombie.getY() > player.getY())
                theta = Math.sin(b / c) + 90;
            else if(zombie.getX() < player.getX() && zombie.getY() > player.getY())
                theta = Math.sin(b / a) - 60;
            else if(zombie.getX() > player.getX() && zombie.getY() < player.getY())
                theta = Math.sin(a / c);
            else
                theta = Math.sin(a / c);
            zombie.setDegrees(theta);
        }
    }

我尝试使用人们建议的 atan2 函数,但它从来没有为我工作过。我知道僵尸的位置和玩家的位置。我该怎么做呢?

编辑:我阅读了 cmets,Thomas 所说的内容在实施到我的代码中时有效。更新后的代码如下:

public void calculateAngle() {
        float theta = 0.0f;
        for(Zombie zombie : entities) {
            float a = zombie.getX() - player.getX() - 40; 
            float b = zombie.getMidpointY() - 10 - player.getY() - 10;

            theta = (float) Math.toDegrees(Math.atan2(b, a)) + 90;
            zombie.setDegrees(theta);
        }
    }

数值变化如 - 40 和 - 10 用于调整 x 和 y 位置,使僵尸正确面对玩家。为了旋转图像本身,我使用 AffineTransform 和 .rotate(theta, x, y) 方法。我不完全知道为什么使用 Math.atan2() 方法最初不适用于我的代码,但现在可以使用。谢谢大家的帮助。

【问题讨论】:

  • 那么实际的问题是如何正确计算theta?还是轮换本身也有问题?
  • 您通常会通过获取方向向量(僵尸到玩家)和一些基本向量(例如 x 轴)之间的角度来计算旋转角度。对于基础知识,请查看here 并注意库通常以弧度返回角度,因此如果您想要度数,则需要对其进行转换(库通常也有相应的方法)。进一步注意,您的 ab 当前描述了从玩家到僵尸的方向,这可能会产生一个偏离 180 度的角度。
  • 除了我上面的评论Math.atan2()如果使用正确应该可以工作。尝试Math.toDegrees( Math.atan2( b ,a ) ) 并注意您将获得 -180 到 +180 度范围内的角度,并且该角度是该向量与 x 轴之间的角度。因此,根据您所基于的旋转角度,您可能需要将结果调整 90 度的某个倍数(例如,如果它应该相对于 y 轴,您可能需要减去或增加 90 度)。

标签: java trigonometry degrees


【解决方案1】:

sin 函数需要度数作为输入,其结果始终在[-1..1] 内,您无法使用它计算度数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    相关资源
    最近更新 更多