2011-03-13 106 views
0

我在我的世界有幾個對象,有三種主要類型。首先是自我,即玩家,玩家不會移動,但是他們會旋轉。第二種是直線飛出用戶的子彈。第三個是目標,這些只是坐在某個地方,等待被擊中。爲什麼我的3D碰撞檢測工作不正常?

下面是我用做碰撞檢測代碼,它不工作:

 foreach (GameObject go in bullets) { 
      float goRadius = go.Model.Meshes.Sum((x) => x.BoundingSphere.Radius) * go.Scale; 
      EnemyObject last = null; 

      Vector3 goRealPos = Vector3.Transform(go.Position, Matrix.CreateScale(go.Scale) * Matrix.CreateTranslation(go.Position) * Matrix.CreateRotationY(go.Rotation.Y)); 

      foreach (EnemyObject eo in targets) { 
       float eoRadius = eo.Model.Meshes.Sum((x) => x.BoundingSphere.Radius) *eo.Scale; 

       if (Vector3.Distance(eo.Position, goRealPos) < eoRadius + goRadius) { 
        //collision has occured 
        if (!eo.TakeHit()) { 
         last = eo; 
        } 

        //remove bullet 
        toBeRemoved.Add(go); 

        break; 
       } 
      } 

      if (last != null) { 
       targets.Remove(last); 
      } 
      if (go.Position.Z > 2000 || go.Position.Z < -2000) { 
       toBeRemoved.Add(go); 
      } 
     } 

誰能告訴我,爲什麼它不工作?

回答

0

請注意,如果子彈移動太快,他們可能會掃過你的目標而不擊中它們。例如使用射線,使用掃描通過安全的測試技術。

+0

情況並非如此。我放慢了我的子彈爬行,我的目標是相當大的,但碰撞從未發生(根據我的數學),雖然我的眼睛看到它 – Malfist 2011-03-13 19:26:36

0

您是否檢查過您的goRealPos計算是否獲得了您期望的座標?你爲什麼要改變goRealPos,但沒有爲EO做類似的事情?可能是因爲您正在測試不在同一座標系上的物體之間的碰撞。

+0

似乎是這樣,但goRealPos可能會或可能不會準確。我沒有對eo做任何事情的原因是因爲它沒有移動,所以它應該與它所說的位置相同。 – Malfist 2011-03-13 20:22:22