2016-01-06 116 views
1

我正在做一個物體,它總是面對平滑過渡 - 加速和減速的鼠標位置。跟着加速和減速的鼠標

對於近鼠標減速這是一個簡單的公式:

rotation += deltaRotation/speed 

,爲了促進有一點更多的代碼(但它搖晃圍繞目標轉,因爲沒有摩擦或阻尼)

var deltaRotation = rotation - targetRotation; 

if (Math.abs(deltaRotation) < EPSILON) { //Stop motion near 0 
    return; 
} 

var direction = deltaRotation != 0 ? deltaRotation/Math.abs(deltaRotation) : 0; 

dv += ACCELERATION * direction * dt; 

dv = FMath.clamp(dv, -MAX_SPEED, MAX_SPEED); 

rotation += dv * deltaRotation; 

如何合併這兩種算法,所以旋轉會慢慢開始並慢慢達到目標旋轉?

回答

1

在物理世界中,加速度與施加的力成正比。模擬在給定時間步施加的力的一種方法是使其與您需要移動物體的距離成正比,減去一些阻尼力。阻尼力(如摩擦力或抗風力)與當前速度成反方向並與其成比例。阻尼力有效地限制了最高速度,並在直接力下降時給出了很好的減速。

考慮一個線性系統。假設xCursor是光標的位置,xMonster是追蹤光標的位置。我們使用dxMonster作爲怪物的速度。

首先,我們需要知道我們有多遠,因爲我們要根據這個來加速怪物。

float delta = xCursor - xMonster; 

force是淨力。它包括一個加速怪物向光標的直接力量和一個抵抗怪物當前速度的阻尼力。

float force = A*delta - B*dxMonster; 

你可以玩常數,看看什麼效果最好。您可能需要A < B。在我的測試程序中,我使用了A = 0.1B = 0.5

由於加速度與力成正比,因此我們可以直接將其與速度相加。請注意,我們不再需要限制速度,因爲阻尼力會阻止它變得太大。速度然後用於更新位置。 (在一個更好的模擬,你可以更好地接近這個使用像龍格 - 庫塔做整合,而只是在每個時間步增加是罰款,一個簡單的動畫。)每個時間步長

dxMonster += force; 
xMonster += dxMonster; 

重複。我省略了dt,因爲我的幀速率足夠穩定以至於不重要。

你的問題是關於旋轉而不是直線運動,但這完全是類似的。在物理方面,它只是角速度和扭矩,而不是線速度和力。

+0

謝謝!這只是我遊戲中的一個美化細節,所以不需要矯枉過正。我使用RK4 /一些Verlet衍生物(或其他任何Nape Phys引擎使用的)來製作重要的遊戲元素。我會盡可能接受你的答案 – Misiur