Матриците на XNA 3D Collision не работят

Преди това зададох въпрос защо моят сблъсък не работи. Получих добър отговор, който има смисъл: Приложете същите трансформации, които направих в метода 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();
    }
}

И това беше методът, при който рисувам моделите и правя матричните трансформации. Допълнителен код е наличен при поискване заедно с допълнителна информация.


person SupremeSteak1    schedule 24.12.2013    source източник


Отговори (2)


Не успях да разбера как да направя същите трансформации в метода isCollision. Ако някой може да ми помогне, ще е страхотно

Вие правите това чрез изграждане на матрицата на трансформация в метода за актуализиране, след като сте приложили всяко движение или ротация. След това запазете изградената матрица и я предайте за използване както в метода за тестване на сблъсък, така и в метода на чертане.

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 ;
}
person Steve H    schedule 25.12.2013

Трябва да изградите вашите световни матрици от трите трансформации (мащаб, ротация, транслация, в този ред). Ако сте използвали само превод в играта си, тогава вашият метод трябва да работи добре. Може би вашият модел е объркан. Опитайте да изобразите гранични сфери, за да видите дали наистина се пресичат. Ето един наистина добър клас BoundingSphereRenderer.

person instancedName    schedule 24.12.2013