为什么我的3D碰撞检测不起作用?

时间:2011-03-13 19:08:17

标签: c# xna 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);
            }
        }

有谁能告诉我它为什么不起作用?

2 个答案:

答案 0 :(得分:0)

请注意,如果子弹移动得太快,它们可能会扫过目标而不会击中它们。使用扫描安全的测试技术,例如光线。

答案 1 :(得分:0)

您是否检查过goRealPos的计算是否大约达到预期的坐标?你为什么要改变goRealPos,而不是为eo做任何类似的事情?可能是您正在测试不在同一坐标系上的对象之间的碰撞。