2008-12-10 38 views
2

我有彈跳的球,每次碰撞時他們的速度矢量都會被恢復係數降低。使用epsilon值來確定遊戲中的球是否不移動?

現在我的球COR爲我的球是0.80。所以在很多反彈之後,我的球已經「停止」了,因爲他們的速度已經變得很小了。

在什麼階段是適當的檢查,如果速度值足夠小,以簡單地稱之爲零(所以我沒有反應,他們的微速球的瘋狂抖動)。我在某些論壇上讀到過,人們有時會使用epsilon常數,一些小數字,然後檢查它。

我應該定義的ε恆定,這樣做:

if Math.abs(velocity.x) < epsilon then velocity.x = 0 

每次我更新了球的速度和位置?這是通常完成的嗎?將它放在我的Vector類的x和y的setter中是否合理?或者我應該在計算速度時在矢量類之外進行。

而且,這將是一個合理的小量值,如果我使用花車我的速度矢量?

回答

0

IMO你的epsilon方法很好。我只是試着看看遊戲中動畫的外觀或感覺是否自然。

1

對於小量的合理值是要取決於你的系統的約束。如果您用圖形表示球,那麼您的epsilon可能對應於每秒0.1像素的速度(確保您的停止概念與屏幕對象停止時的用戶體驗相匹配)。如果您正在進行物理模擬,您需要將其調整到您嘗試測量系統的準確度。

至於你多久檢查一次 - 這也取決於。如果您實時模擬某些內容,額外的支票可能會很昂貴,並且您需要檢查每10次更新或每秒一次或更新。或者性能可能不是問題,您可以檢查每個更新。

1

而是一個IsStillMoving功能的小量的,也許你可以使用一個UpdatePosition功能,計劃基於其速度的物體,通過對象的基礎。

我會做這樣的事情(在我自己的化妝它 - 上 - 因爲你去僞代碼):

void UpdatePosition(Ball b) { 

    TimeStamp now = Clock.GetTime(); 
    float secondsSinceLastUpdate = now.TimeSince(b.LastUpdate).InSeconds; 

    Point3D oldPosition = b.Position; 
    Point3D newPosition = CalculatePosition(b.Position, b.Velocity, interval); 
    b.MoveTo(newPosition); 

    float epsilonOfAccuracy = 0.5; // Accurate to one half-pixel 
    float pixelDistance = Camera.PixelDistance(oldPosition, newPosition); 
    float fps = System.CurrentFramesPerSecond; 
    float secondsToMoveOnePixel = (pixelDistance * secondsSinceLastUpdate)/fps; 
    float nextUpdateInterval = secondsToMoveOnePixel/epsilonOfAccuracy; 

    b.SetNextUpdateAt(now + nextUpdateInterval); 
} 

球非常迅速會得到更新每一幀上。移動速度較慢的球可能每五或十幀更新一次。已停止(或幾乎停止)的球只會非常非常少地更新。

0

Epsilon本質上是最小的可能增量。不幸的是,計算機具有不同的「最小」增量,這取決於浮點表示。我會非常小心的(甚至可能比我爲了安全而計算的更高),特別是如果我想讓代碼變得便攜的話。

您可能需要編寫計算出的最小增量上的花車一個函數,而不是使用魔法值。