2015-04-30 33 views
2

我在堆棧數學網站上發佈了這個問題,但他們並不太興奮,看不到包括編程在內的問題。不管怎樣,現在我在這裏:)Unity3D從V1到V2的線性插值


  1. 我有一個對象,它位於MyTransform.position(矢量)
  2. 該對象應遵循DesiredPosition(矢量),其是 在雜色山雀方向上移動具有變化速度
  3. MaxDelayDistance(浮點)是我的目的是允許 具有對DesiredPosition的最大距離。
  4. DelayRecovery(float)是我的對象在達到MaxDelayDistance時將 移動到DesiredPosition的秒數。
  5. Time.deltaTime(float)是一個術語,我們用它來描述最後一次 幀更新所花費的時間。它的價值通常約爲0.025f。

private Vector3 GetLerpedPosition(Vector3 DesiredPosition) { 
      //DesiredPosition now contains the goal 
      Vector3 dirToDesiredPosition = (DesiredPosition - MyTransform.position).normalized; //Direction to desired position 
      Vector3 lerpStart = DesiredPosition + (-dirToDesiredPosition * MaxDelayDistance); //Start the lerp at my farthest allowed position 
      float lerpCurrentT = Vector3.Distance(MyTransform.position, DesiredPosition)/Vector3.Distance(lerpStart, DesiredPosition); //My current fragtion (t) of the lerp 

      //Now I lerp from lerpStart to DesiredPosition using a calculated fraction 
      Vector3 result = Vector3.Lerp(
       lerpStart, 
       DesiredPosition, 
       lerpCurrentT + (DelayRecovery/MaxDelayDistance * Vector3.Distance(MyTransform.position, DesiredPosition) * Time.deltaTime) 
       ); 
      return result; 
     } 

主要的問題是,我的對象不順利繼DesiredPosition。 它從MaxDelayDistance跳轉到DesiredPosition並返回。 不知何故,我的Lerp函數中的分數(t)總是大約爲1.005或大約0.001。你能在我的方法中發現任何問題嗎?

+0

如果我正確理解你的目標,你可以通過計算'dirToDesiredPosition',跟蹤某個值'distanceMoved'來增加每一幀,然後將該對象移動到'lerpStart + dirToDesiredPosition * distanceMoved'來獲得更一致的結果。 – rutter

回答

0

我看到了幾個問題,我不確定你選擇的方向(至少從未見過類似的東西)。

序言:

Vector3.Distance(lerpStart, DesiredPosition) 

這是一個常數,是圍繞DesiredPosition半徑。

這裏的一些問題,我注意到:

問題1

lerpT總是> = 1對於每個點更遠多於MaxDelayDistance(半徑外側)。所以當物體遠離MaxDelayDistance時,它會立即移動到DesiredPosition

問題2

DelayRecovery(浮點)是我的對象具有在順序如果達到MaxDelayDistance移動 到DesiredPosition秒。

不確定是否完全理解了你的錯綜複雜的lerp,順便說一句,上面的陳述似乎是錯誤的。儘管距離很遠,但總是會考慮到DelayRecover

問題3

零可能的劃分,當你關閉DesiredPosition/以前*運營商進行評估)

一些考慮

我會更加關注你的代碼讀出,我會試圖找出背後的邏輯。這是我從未見過的。 用於朝向一個給定的位置移動的一些一般的方法:

  1. 如果起點和終點是已知的並且固定的,比lerping(或ease function)允許精確地控制的行駛時間遞增噸參數從0到1
  2. 如果目的地正在移動,你仍然可以順利地使用lerp跟蹤目標(可能不是從理論角度來看更正確的使用,也不是物理的現實,但在任何情況下都是有效的)。在這種情況下,勒普因素是一種「向目標速度」。有效地與距目標的距離成正比。
  3. 一些基於物理的方法。整合。定義某種最大速度和最大加速度並計算下一個位置(最終鉗位以防止過沖和振盪)
  4. PID控制器。很多權力,但我總是發現他們很難調整。

也可考慮使用Vector3.MoveToward,這裏是它是如何實現的:

public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta) 
    { 
     Vector3 a = target - current; 
     float magnitude = a.magnitude; 
     if (magnitude <= maxDistanceDelta || magnitude == 0f) 
     { 
      return target; 
     } 
     return current + a/magnitude * maxDistanceDelta; 
    } 

希望這有助於。

+0

一旦我回到我的電腦,我會檢查這一點。感謝您的解釋! –

+0

感謝您提供非常有用的提示!我雖然關於你的想法,並實施了一些可行的方法。我也會嘗試其他技巧來找到最合適的。我可能只是想弄清楚一些事情,然後想出一個非常複雜的不工作的解決方案。感謝您爲我清理這個問題。 :d –