2011-07-30 37 views
5

我正在嘗試開發一款遊戲。遵循具有一定慣性的路徑的算法

image demonstrating concept

我有一個起點與和起始載體(藍色),下一個I畫在其上欲遵循一定的慣性,或有限的角,並且步驟每一匝屏幕的路徑(黑),其應該會產生紅線。

你有關於如何編程這種算法的任何提示?

+1

歡迎來到Stack Overflow!正如你提出你的問題,它太模糊,得不到一個特別好的答案。你在什麼特定的限制下操作?我們可以假設世界的結構呢?您提供的細節越多,我們就可以提供更好的幫助。 – templatetypedef

+0

黑色路徑在第一步之前是否完全可用?或者,隨着時間的推移,黑點是否逐漸可用?紅線必須儘可能接近新顯示的黑點?第一種選擇是可取的。 – Dialecticus

+0

@Dialecticus我認爲在開始繪製紅線之前,至少有一部分黑線是可用的,但是我應該能夠在繪製黑線之前繪製紅線。 @ templatetypedef我想不出任何約束,我試圖模擬一個會遵循手繪路徑的航班,但試圖模擬慣性(物體可以轉過的最小半徑) – orko

回答

3

您可以創建一個差分格式,即離散時刻的源點的模型速度和座標。假設你修正了一些dt = 0.1 sec例如,起始速度由v0的藍色向量給出。我們從x0開始。 說y[j]是黑道的點。

x1 = x0 + v1 * dt,其中v1 = v0 + (y[k(x0)+1] - x0) * f(abs(y[k(x0)+1] - x_0))。凡
k(x0)是就近x0點之間y[j]指數,
f(x)是表徵「力」拉着你的軌跡所定義的路徑的功能。它僅爲非負的x定義。

該模型將您的軌跡拉到定義路徑中距離軌跡上當前建模位置最近的點的下一個點。

f(x)的一個很好的例子可能是一個模擬引力的模型:f(x) = K/(x * x),其中K應該通過實驗進行調整以得到自然的理想結果。

然後x2 = x1 + v2 * dt,其中v2 = v1 + (y[k(x1) + 1] - x1) * f(abs(y[k(x1) + 1] - x_1))等:

x[n+1] = x[n] + v[n+1] * dt,其中v[n+1] = v[n] + (y[k(x[n]) + 1] - x[n]) * f(abs(y[k(x[n])+1] - x[n])) ...

你必須調整dtK這裏。 dt應該足夠小,以使軌跡平滑。更大的K使軌跡更接近於精確定義,更小的K使它更加放鬆。

編輯現在居然當我想到了一點,據我所知,力功能f的選擇並不好,因爲引力使空間速度,即能爲你的軌跡與期望的無限如果飛走初始速度太大。所以你應該構建另一個函數,可能只是沿着f(x) = K xf(x) = K x^alpha的行,其中alpha > 0。你看,這個方案是相當普遍的,所以你應該試驗。

+2

我認爲[這篇文章](http://www.red3d.com/cwr/steer/gdc99/)解釋了你的答案中描述的相同方法,但以更多的方式持有。我發現這是一個非常有趣和有益的閱讀。 –

1

另一種選擇是做這樣的事情...

1. Compute the average value of k points in the target path 
    to get (<x>,<y>). 
    2, Compte the angle between the most recent point in the path 
    and (<x>,<y>) and turn that way; if the angle is too big, 
    turn as hard as possible. 
    3. Recompute (<x>,<y>) for the next set of k elements by sliding 
    the window by 1; repeat step 2. 

這都可以成爲相當恰當的行爲。我會通過一個例子,但這將是相當乏味的。請注意,這與unkulunkulu概述的方法類似,但在方法上略有不同。

+0

好!這看起來可以比我的更容易控制。 – unkulunkulu