2010-02-12 35 views
0

我在遊戲中有一個單位,指向特定的方向;當它轉向另一個方向時,應該選擇最短的轉彎。該方案以特定角度開始,並且需要一個給定的角度來指向lerp(線性插值)。遊戲中的單位輪換

例如,從10度傾斜到350度應計算-10的目標角度。相反,從350到10的頂峯應計算370度的末端。

什麼算法可以計算這些所需的最終值?

編輯::好像有過什麼,我需要

我使用線性插值隨着時間的推移,計算角度有些混​​亂。所以,如果我想從10到20,那麼最終值需要是20,然後我將從10到20插入並右轉。但是,同樣如果我想從20到10,那麼從20到10的插值將逆時針旋轉,這也可以。問題是什麼時候順時針方向轉180度以上,270度到80度(210度)需要順時針轉動,直接插補270到80會逆時針轉動,我需要從270到420插補(360度+80),它將逆時針旋轉。

+0

如你所說,假設你試圖總是採取最短的轉向,我對你的例子感到困惑。如果你有一個10度的航向並想轉向350度,那就是-20度的旋轉。如果你有350度的航向,並且想要轉向10,那也是+20度的旋轉。我錯過了什麼嗎? – 2010-02-12 13:39:01

+0

是的,我需要計算_end value_而不是delta。從10→350的線性插值將順時針旋轉,從10→-10的線性插值將逆時針旋轉 – Martin 2010-02-12 13:48:25

+0

您想要恆定速度嗎?固定時間去那裏?如果你有三角洲,使用(的一小部分)來增加你的角度,不要嘗試插值。 – phkahler 2010-02-12 14:30:53

回答

1

如果你想要的東西更側重於「終止角」,這個怎麼樣:

float startAngle = something, endAngle = something; 

endAngle = ((endAngle - startAngle) % 360) + startAngle; 
if(endAngle < startAngle - 180) endAngle += 360; 
if(endAngle > startAngle + 180) endAngle -= 360; 

這帶來endAngle接近由startAngle儘可能在360

+0

嗯,我可以證實這一個作品,它的目的是實現結束的角度,並不使用循環 - 得到我的投票:) – Martin 2010-02-15 19:27:17

4

你需要

dist = (end - start + 360) % 360; 
if (dist > 180) 
    dist = dist - 360; 

,讓您在範圍-180 ... 180的東西。如果那是你想要的。

+0

您可能還想做一個if(dist <180) dist + = 360;'處理另一個邊緣情況......其中,例如,「開始」爲0,「結束」爲-710 ... – 2010-02-12 13:48:45

+0

我不太明白這是如何解決這個問題的?如果我是從180-> 190,然後我想我的最終值是190 ... – Martin 2010-02-12 13:49:13

+0

我剛剛更新了我的問題,我不認爲這回答了它(因爲我之前很不清楚) – Martin 2010-02-12 13:53:28

1

馬丁的增量,我覺得我明白你想要什麼。基本上,你只需要添加360到你的最終位置,直到它大於你的開始位置。然後從中減去360。那些可能是你的解決方案的兩個絕對角度。那麼你的答案只不過是最接近的。

僞/真正的代碼:

int current = 350; // where you are now 
int desired = 10; // where you want to go 

while(desired < current) 
    desired += 360; 
int end = desired; 
int start = desired - 360; 

int delta1 = abs(end - current); 
int delta2 = abs(start - current); 
int answer = delta1 < delta2 ? end : current; 
+0

這看起來很有趣。我會和這個一起玩... – Martin 2010-02-15 18:03:37

+0

現在我會說克里斯的答案更緊湊,更優雅,它確實有效(至少在我測試了幾個案例的時候)。我的方法的主要優點是它很容易遵循,如果你在深夜起牀,你不會理解它。當然,只要你設置了單元測試來檢查你的幾個角落案例,你甚至不需要去查看它。 ;) – Dave 2010-02-15 23:25:19

0

如果您正在轉向一個特定的點,只是想知道是否這個框架中順時針或逆時針轉動,這樣做的通常方法是考慮玩家作爲矢量的方向,並將其與從玩家到點的矢量之間的交叉乘積。如果是肯定的,逆時針轉動;如果是負值,請順時針轉動。