【问题标题】:XNA 3D Collision matrices not workingXNA 3D 碰撞矩阵不起作用
【发布时间】:2014-01-12 17:58:21
【问题描述】:

我之前问过一个问题,为什么我的碰撞不起作用。我得到了一个有意义的好答案:将我在 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();
    }
}

这就是我绘制模型并进行矩阵变换的方法。 可根据要求提供更多代码以及更多信息。

【问题讨论】:

    标签: c# matrix 3d xna collision


    【解决方案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 ;
    }
    

    【讨论】:

      【解决方案2】:

      您应该根据所有三种变换(按比例、旋转、平移,按此顺序)构建您的世界矩阵。如果您在游戏中只使用翻译,那么您的方法应该可以正常工作。也许你的模型搞砸了。尝试渲染边界球以查看它们是否真正相交。 这是一个非常好的BoundingSphereRenderer class

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-10
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        • 2016-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多