我正在用 Java 编写植绒算法,但我卡在了某个点(在 2D 平面中使用 Ardor3D 库)。
基本上,我需要找到要添加到当前旋转的角度差。如果你只能得到它应该指向北方 0 度的极坐标的方式而不是差异,不用担心——我有一个方法可以返回角度差异,同时考虑到角度和负角度的环绕。
目前,我有以下代码,这显然行不通,因为该算法没有引用初始旋转:
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/