我正在編碼Java中的植絨算法,但我被困在某個點(使用Ardor3D庫,在一個2D平面)。查找三角形角度用於旋轉給定實體的位置,初始旋轉和目標點'面向'
基本上,我需要找到要添加到當前旋轉的角度差。如果你只能用極座標指向北極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();
我不是一個真正的數學問題不太好,所以代碼將是有益的,而不是公式:)
輸入
- 實體的當前位置
- 當前實體的旋轉(極性取向)以度
輸出
- 度或弧度來增加或減少當前旋轉
- ...或學位或弧度提前表示爲導向的極角
謝謝如果你能幫助:)
克里斯
所以'rt.getPosition'給出了實體的位置和'app.getAvgBOIDPos'給出了目標位置,是這樣嗎?什麼給了實體的方向? – Beta 2010-10-29 15:41:07
這就是rt.getRotation(),它是以面向極座標的度數表示的:) – 2010-10-29 15:42:25
糟糕,忘記說你對應用程序是正確的,getAvgBoidPos()給出了實體向實體移動的平均位置。 – 2010-10-29 15:53:58