Матрицы столкновений XNA 3D не работают

Ранее я задавал вопрос о том, почему моя коллизия не работает. Я получил хороший ответ, который имеет смысл: примените те же преобразования, которые я сделал в методе 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. Если бы кто-нибудь мог мне помочь, это было бы здорово

Вы делаете это, создавая матрицу преобразования в методе 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 ;
}
person Steve H    schedule 25.12.2013

Вы должны построить свои мировые матрицы из всех трех преобразований (масштаб, вращение, перемещение, именно в таком порядке). Если вы использовали в своей игре только перевод, то ваш метод должен работать нормально. Возможно, ваша модель испорчена. Попробуйте визуализировать ограничивающие сферы, чтобы увидеть, действительно ли они пересекаются. Вот действительно хороший класс BoundingSphereRenderer.

person instancedName    schedule 24.12.2013