我的世界里有几个对象,有三种主要类型。第一个是自我,即玩家,玩家不会移动,但他们会旋转。第二个是子弹,它们以直线从用户身上飞出。第三个是目标,这些只是坐在某处等待被击中。
这是我用来进行碰撞检测的代码,它不起作用:
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)
请注意,如果子弹移动得太快,它们可能会扫过目标而不会击中它们。使用扫描安全的测试技术,例如光线。
答案 1 :(得分:0)
您是否检查过goRealPos的计算是否大约达到预期的坐标?你为什么要改变goRealPos,而不是为eo做任何类似的事情?可能是您正在测试不在同一坐标系上的对象之间的碰撞。