我之前问了一个关于为什么我的碰撞不起作用的问题。我得到了一个很有意义的答案:将我在DrawModel方法中执行的相同转换应用于isCollision方法。然而,这不起作用。我无法弄清楚如何在isCollision方法中进行相同的转换。如果有人能帮助我,那就太好了。谢谢!以下是方法:
private bool checkPlayerCollision(Model model1, Matrix world1)
{
//Make floor matrix
Matrix floorMatrix = Matrix.CreateTranslation(new Vector3(0, 0, 0));
//Make ship1 matrix
Matrix ship1WorldMatrix = Matrix.CreateTranslation(ship1loc);
//Make ship2 matrix
Matrix ship2WorldMatrix = Matrix.CreateTranslation(ship2loc);
//Check for collision with floor
if (IsCollision(model1, world1, floor, floorMatrix)) return true;
//Check for collision with ship1
if (IsCollision(model1, world1, model, ship1WorldMatrix)) return true;
//Check for collision with ship2
if (IsCollision(model1, world1, model, ship2WorldMatrix)) return true;
return false;
}
这是检查玩家碰撞,我检查所有模型是否与玩家模型发生碰撞。
private bool IsCollision(Model model1, Matrix world1, Model model2, Matrix world2)
{
for (int meshIndex1 = 0; meshIndex1 < model1.Meshes.Count; meshIndex1++)
{
BoundingSphere sphere1 = model1.Meshes[meshIndex1].BoundingSphere;
sphere1 = sphere1.Transform(world1);
for (int meshIndex2 = 0; meshIndex2 < model2.Meshes.Count; meshIndex2++)
{
BoundingSphere sphere2 = model2.Meshes[meshIndex2].BoundingSphere;
sphere2 = sphere2.Transform(world2);
if (sphere1.Intersects(sphere2))
return true;
}
}
return false;
}
这是我实际检查碰撞的方法。
private void DrawModel(Model model, Matrix world, Matrix view, Matrix projection, Vector3 loc)
{
Matrix gameWorldRotation = Matrix.CreateRotationX(MathHelper.ToRadians(RotationX)) * Matrix.CreateRotationY(MathHelper.ToRadians(RotationY));
Matrix[] transforms = new Matrix[model.Bones.Count];
model.CopyAbsoluteBoneTransformsTo(transforms);
foreach (ModelMesh mesh in model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.World = gameWorldRotation * transforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(loc);
GraphicsDevice.RenderState.DepthBufferEnable = true;
effect.EnableDefaultLighting();
//effect.World = world;
effect.View = view;
effect.Projection = projection;
}
mesh.Draw();
}
}
这就是我绘制模型并进行矩阵变换的方法。 可根据要求提供更多代码以及更多信息。
答案 0 :(得分:1)
您应该根据所有三种变换(缩放,旋转,平移,按此顺序)构建世界矩阵。如果您在游戏中仅使用翻译,那么您的方法应该可以正常工作。也许你的模型搞砸了。尝试渲染边界球体以查看它们是否真正相交。 这是一个非常好的BoundingSphereRenderer class。
答案 1 :(得分:1)
我无法弄清楚如何在中进行相同的转换 isCollision方法。如果有人能帮助我,那就太棒了
通过在应用任何移动或旋转后在Update方法中构建变换矩阵来执行此操作。然后保存该构建的矩阵并传递它以用于碰撞测试方法和绘制方法。
Matrix TransformationMatrix;
void Update()
{
TransformationMatrix = Matrix.Create...X(RotationX) * Matrix.Create...Y(RotationY) * transforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(loc);
}
然后
(IsCollision(TransformationMatrix )
{
sphere.Transform(TransformationMatrix );
}
和
DrawModel(TransformationMatrix )
{
effect.World = TransformationMatrix ;
}