2014-10-06 38 views
1

我目前正在Unity(C#)中複製一個粒子系統。我正在向每個粒子添加物理(用一個球體表示)以允許它從位於原點的平面反彈。顆粒反彈很多次,受重力影響。隨着彈跳變小,球體開始穿過飛機,直至最終落下。重力將持續作用於粒子。什麼是停止飛機頂部的球體的正確方法?爲什麼碰撞響應允許彈跳球最終穿過平面?

到目前爲止,我已經包含了我的實現,但代碼總是最終允許球體在飛機上下落。

檢測:

public bool SpherePlaneCollisionDetection(Particle part) 
{ 
      Vector3 sphereCenter = part.position; 
      Vector3 planeCenter = Vector3.zero; 
      Vector3 normal = Vector3.up; 
      double radius = 0.5; 

      Vector3 dist1 = (sphereCenter - planeCenter); 
      float finalDist = Vector3.Dot (dist1, normal); 

      if (finalDist > radius) { 
        return false; 
      } else { 
      //Debug.Log ("COLLISION HAS OCCURED"); 
      //Debug.Log ("POSITION: " + part.position); 
      //Debug.Log ("FINAL DIST: " + finalDist); 
        return true; 
      } 
    } 

迴應:

public void HandlePlaneCollision() 
{ 
    for (int i=0; i<Particles.Count; i++) { 
     //Particle p1temp = Particle[i]; 
     Particle tempParticle = (Particle)Particles[i]; 
     //Particle part = tempParticle.GetComponent<Particle>(); 


     float dampning = 0.8f; 
     float bounce = -1f; 
     if(SpherePlaneCollisionDetection(tempParticle)) 
     { 
      tempParticle.velocity.y *= (bounce*dampning); 
      tempParticle.velocity.x *= friction; 
      tempParticle.velocity.z *= friction; 

      Debug.Log(tempParticle.velocity.y); 

      Particles[i] = tempParticle; 
     } 
    } 
} 

任何幫助是極大的讚賞。

+2

當碰撞發生三角洲,嘗試將y位置設置爲飛機的y位置。 – Imapler 2014-10-07 06:31:38

+1

並且如果'| speed | Spektre 2014-10-07 06:47:23

+0

你沒有使用Unity內置的對撞機嗎? – anothershrubery 2014-10-09 13:53:10

回答

2

我不使用統一,但我之前編碼的物理模擬和發生這種情況通常是因爲:

  1. 潤+浮動輪錯誤

    是你正在衰減,所以如果你的對象是下降然後它再次彈起(高度h0)再次下降,然後再次彈起(高度h1<h0)...所以它振盪的幅度越來越低,但從未爲零。

    如果你的使用過的引擎/框架有一些性能調整來加速碰撞測試或者不能以更高的精度處理碰撞測試,那麼振盪就會錯過邊界碰撞,特別是只有平面邊界而不是體積,或者如果命中接近邊界的頂點。

    if (|speed|<some_minimal_safe_speed)然後將其設置爲零,以停止跳動更好的將是left just surface tangent speed part而不是零

  2. 您可以通過消除低幅度振盪在我的評論這樣提到避免這種錯誤的邊界定義

    某些邊界碰撞測試系統需要以特定方式定義邊界對象,如:

    • 多邊形繞組由軸
    • 順序或由概率一些角度
    • 爲了通過大小
    • 順序的擊中

    在文檔,以便檢查它與正確的,如果需要

  3. 採樣率vs.模擬速度

    您在一定的時間間隔內對物體的位置,速度,狀態進行採樣。在碰撞檢測時間內,物體通常在邊界表面之下/之後,但通常不完全(取決於速度和時間間隔)。當speed*time_interval足夠高時,物體被檢測爲碰撞,因此其速度在表面反射並被阻尼。

    但是由於在下一次迭代中衰減,位置仍然在邊界之後,所以在迭代後它被作爲正常邊界命中並以錯誤方式反彈。這發生在更高的速度不低的...你可以阻止這種通過設置於表面砸點的位置(如@Imapler評論)和/或+以上一些表面