java - 找到用于旋转给定实体的增量角度,其位置、初始旋转和目标点为 'face toward'

标签 java math vector rotation ardor3d

我正在用 Java 编写植绒算法,但我卡在了某个点(在 2D 平面中使用 Ardor3D 库)。

基本上,我需要找到要添加到当前旋转的角度差。如果你只能得到它应该指向北方 0 度的极坐标的方式而不是差异,不用担心——我有一个方法可以返回角度差异,同时考虑到角度和负角度的环绕。

alt text

目前,我有以下代码,这显然行不通,因为该算法没有引用初始旋转:

  long tpf = currUpdateTimeMS - lastUpdateTimeMS;

  Vector2 pos = new Vector2();
  rt.getPosition(pos);

  double rot = pos.angleBetween(app.getAvgBoidPos(new Vector2()).normalizeLocal());
  rt.setRotation(rot);

  pos.addLocal(
   Math.cos((rot - MathUtils.HALF_PI)) * (tpf / 10f),
   Math.sin((rot - MathUtils.HALF_PI)) * (tpf / 10f)
  );
  rt.setPosition(pos);

  super.updateLogic();

更新的代码(不工作,来自第一个答案):

    long tpf = currUpdateTimeMS - lastUpdateTimeMS;
    //rt.setRotation(rt.getRotation() + ((tpf / (ROT_SPEED / 2f)) % 360));

    Vector2 avgpos = app.getAvgBoidPos(new Vector2());
    Vector2 pos = rt.getPosition(new Vector2());
    avgpos.subtractLocal(pos);

    double angleRads = rt.getRotation() * FastMath.DEG_TO_RAD;
    double rot = MathUtils.acos((
        (avgpos.getX() * MathUtils.sin(angleRads)
    ) +
        (avgpos.getY() * MathUtils.cos(angleRads)
    )) / ((Math.pow(avgpos.getX(), 2) + Math.pow(avgpos.getY(), 2)) * 0.5));

    double adegdiff = rot * FastMath.RAD_TO_DEG;

    rt.setRotation(rt.getRotation() - adegdiff);
    double newrot = rt.getRotation();

    pos.addLocal(
        Math.cos((newrot - MathUtils.HALF_PI)) * (tpf / 10f),
        Math.sin((newrot - MathUtils.HALF_PI)) * (tpf / 10f)
    );
    rt.setPosition(pos);

    super.updateLogic();

根据另一个答案的另一个修改:

    long tpf = currUpdateTimeMS - lastUpdateTimeMS;
    //rt.setRotation(rt.getRotation() + ((tpf / (ROT_SPEED / 2f)) % 360));

    Vector2 avgpos = app.getAvgBoidPos(new Vector2());
    Vector2 pos = rt.getPosition(new Vector2());
    avgpos.subtractLocal(pos);

    double rot = pos.angleBetween(
        app.getAvgBoidPos(new Vector2()).normalizeLocal()
    ) - (rt.getRotation() * MathUtils.DEG_TO_RAD);

    rt.setRotation(rt.getRotation() - (rot * MathUtils.RAD_TO_DEG));
    double newrot = rt.getRotation();

    pos.addLocal(
        Math.cos((newrot - MathUtils.HALF_PI)) * (tpf / 10f),
        Math.sin((newrot - MathUtils.HALF_PI)) * (tpf / 10f)
    );
    rt.setPosition(pos);

    super.updateLogic();

我不太擅长数学题,所以代码比公式更有帮助:)

输入

  • 实体现职
  • 实体的当前旋转度(极向)

输出

  • 添加或减去当前旋转的度数或弧度
  • ... 或表示为极向角的度数或弧度

如果您能提供帮助,请提前致谢:)

克里斯

最佳答案

您可以使用点积来确定当前方向与您要面对的点之间的角度(以弧度为单位)的余弦值。假设执行查看的代理位于原点并面向某个方向,该方向由相对于 Y 轴的角度 θ 给出(即 0 度是“向上”或“向北”)。您想要找到该方向与面向点 (x, y) 之间的角度差 θ'。这是由:

θ' = cos-1[(x*sin(θ) + y*cos(θ)) / sqrt(x2 + y2)]

从 θ 中减去 θ' 将使 agent 朝向目标。

如果agent不在原点,只需将agent的位置从要查看的对象中减去,即可得到上面的形式。

关于java - 找到用于旋转给定实体的增量角度,其位置、初始旋转和目标点为 'face toward',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4053396/

相关文章:

java - 如何解决加载 spring-context 的问题?

c++ - 如何将一个空的成对 vector 推回另一个 vector ?

java - 从 vector 创建的 JButton 上的 actionListener

java - 如何在 docker 镜像中的 Spring Boot 应用程序中禁用保持 Activity 状态

Java/泛型/ClassCastException

java - File.delete() 仅随机删除目标文件

algorithm - O 符号和一些数学

javascript - 计算缺失坐标

java - 如何计算 "long"的平方根

string - 用字符串数组折叠