2011-10-21 56 views
0

所以我有一艘船,底部有推進器,只能用這些推進器向前移動。它也可以圍繞其中心旋轉。它的推進器使其加速,所以它不會以恆定速度移動。我想要做的是告訴它「移到B點」。移動物體從a點移動到b點(2D),只能向前移動並自行旋轉

我已經想出了一個解決方案,但它不能很好地工作,它不能平穩地旋轉,它動作輕快,並且不會完全到達它應該在的位置,所以我必須有一個大的誤差範圍。

這是一個正常的問題,如果是的話是否有一個「標準」的方式呢?這是一個容易的問題?我想讓它看起來像船在使用球員所具有的約束(推進器,旋轉)來轉向自己。這不包括從A點到B點,還是它?

我想解決這個問題的一些幫助。職位存儲在向量中,這是一個二維問題。僅供參考,我包括我的解決方案,它基本上是加速船直到旋轉它指向的重點。我覺得我實現這個想法的是這個問題:

Vector diff = vector_sub(to_point, pos); 
float angle = vector_getangle(diff); 
float current_angle = vector_getangle(dir); 
float angle_diff = rightrange(angle) - rightrange(current_angle); 
float len = vector_getlength(diff); 

// "Margin of error" 
float margin = 15.0; 

// Adjust direction, only if we're not stopping the next thing we do (len <= margin) 
if (len > margin && fabs(angle_diff) > 2.0) 
{ 
    dir = vector_setangle(dir, current_angle + (angle_diff)*delta*(MY_PI) - MY_PI/2); 
} 
else if (len > margin) 
{ 
    dir = vector_normalize(diff); 
} 

// accelerate ship (if needed) 
acc.x = acc.y = speed; 
acc = vector_setangle(acc, vector_getangle(dir)); 

if (len <= margin) 
{ 
    // Player is within margin of error 
} 
+0

對船舶的旋轉方式有任何限制嗎?例如,它可以旋轉180度在一個單一的刻度?或者你執行最大的角加速度? – Kevin

+0

如果這是你的意思,那麼船隻被限制在每秒360度? – ErikPerik

+0

「指引自己到位」?你的意思是它只有在運動時纔會改變方向?或者它可以旋轉到位,然後推動? – Beta

回答

2

如果你是不是在找的作品在網上非常普遍的解決方案,然後有一個簡單的解決方案。我的在線意思是不斷重新計算沿着完整軌跡的動作。

假設船舶在起步時處於靜止狀態,只需朝目標點旋轉即可(同時仍然靜止)。現在,你的飛船可以通過加速t秒,在運動中旋轉回來(根據約束條件爲0.5秒),並再減速t秒達到目標。如果當前點和目的地之間的距離爲d,那麼你需要解決的方程式爲:

d = 0.5*a*t^2 + 0.5*a*t + 0.5*a*t^2 

中的第一項,同時加速行駛距離。第二項是旋轉時行駛的距離(v*t_rot,v=a*t,t_rot=0.5)。最後一項是減速時行駛的距離。解決以上問題t,你有你的軌跡。

如果船舶在起步時移動,我會先停止它(只是沿着其速度矢量的相反方向旋轉,然後減速直到靜止)。現在我們知道如何到達目的地。

離線軌跡計算的問題是它不是很準確。你很可能會在目標附近結束,但不是完全位於目標之上。


讓我們讓問題更有趣一點:船隻不能在沒有加速度的情況下旋轉。我們把這個加速度矢量叫做a_r,這個矢量與船的方向成某個角度(有點像在後面有一個角度的推進器)。現在您的任務是旋轉船舶並沿着一​​個方向加速,使得與連接當前位置的目標矢量垂直的速度分量被抵消。而不是試圖離線計算向量,我會用這個在線方法。

做的是添加在每個時間間隔計算出以下算法,最簡單的事情:

  1. 計算指着從船到目的地的載體。
  2. 將當前的速度矢量分爲兩部分:朝目的地,垂直於它。
  3. 如果垂直速度爲零,跳過4
  4. 開始向垂直向量方向的負向旋轉。如果已經遠離它(不完全相反,但只是望着遠處),也消防主推進器。

這會振盪一點,我懷疑它也會在一段時間後穩定。我必須承認,我不知道如何讓它停在目的地。


最後的方法是模擬船的動力學,並嘗試線性化它。這將是一個非線性系統,所以第二步將是必要的。然後將模型轉換爲離散時間系統。最後應用控制規則使其達到目標點。爲此,您可以將狀態空間從位置和速度改變爲位置錯誤和(可能)速度錯誤,最後添加一個調節控制(一個控制環路,它接受當前狀態並生成一個輸入,使得狀態變量將接近零)。

這最後一個在數學課堂上相當困難,你可能需要研究一下控制工程。但是,你會得到比上述簡單算法更好的結果 - 這種算法甚至可能無法工作。此外,您現在可以對其應用各種優化規則:最小化達到目標的時間,最小化燃料消耗,最小化行駛距離等。