2011-03-13 86 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