XNA, ограничивающая Сферу и объект в одной позиции, но выглядящие по-разному - PullRequest
1 голос
/ 19 апреля 2011

ОК, ребята, у меня проблема с XNA с позиционированием ограничивающей сферы.Клянусь, положение каждого из них абсолютно одинаковое - я даже проверил с помощью отладчика, тем не менее, они появляются в разных направлениях.Я мог бы отрегулировать это вручную, умножив на факторы, чтобы получить это право, но почему этот эффект появляется?Вот код:

Граничная сфера:

protected BoundingSphere CalculateBoundingSphere()
    {
        BoundingSphere mergedSphere = new BoundingSphere();
        BoundingSphere[] boundingSpheres;
        int index = 0;
        int meshCount = Model.Meshes.Count;

        boundingSpheres = new BoundingSphere[meshCount];
        foreach (ModelMesh mesh in Model.Meshes)
        {
            boundingSpheres[index++] = mesh.BoundingSphere;
        }

        mergedSphere = boundingSpheres[0];
        if ((Model.Meshes.Count) > 1)
        {
            index = 1;
            do
            {
                mergedSphere = BoundingSphere.CreateMerged(mergedSphere,
                    boundingSpheres[index]);
                index++;
            } while (index < Model.Meshes.Count);
        }

        mergedSphere.Center = Position;
        return mergedSphere;
    }

    internal void DrawBoundingSphere(Matrix view, Matrix projection,
GameObject boundingSphereModel)
    {
        Matrix scaleMatrix = Matrix.CreateScale(BoundingSphere.Radius);
        Matrix translateMatrix =
            Matrix.CreateTranslation(BoundingSphere.Center);//BoundingSphere.Center   CHANGED THISSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

        Matrix worldMatrix = scaleMatrix * translateMatrix;

        foreach (ModelMesh mesh in boundingSphereModel.Model.Meshes)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                effect.World = worldMatrix;
                effect.View = view;
                effect.Projection = projection;
            }
            mesh.Draw();
        }
    }
}

Рисование объекта:

class Asteroid : GameObject
{
    public bool Destroyed { get; set; }
    Vector3 m_Rotations;
    public int rotDir;

    public Asteroid(int rot)
        : base()
    {
        Destroyed = false;
        rotDir = rot;


    }

    public void LoadContent(ContentManager content, string modelName)
    {
        Model = content.Load<Model>(modelName);
        Position = Vector3.Down;
    }
    public void update(GameTime gameTime)//for making asteroid spin
    {
        switch (rotDir)
        {
            case 0: m_Rotations.Z += (float)gameTime.ElapsedGameTime.TotalSeconds;
                break;
            case 1: m_Rotations.X += (float)gameTime.ElapsedGameTime.TotalSeconds;
                break;
            case 2 :m_Rotations.Z += (float)gameTime.ElapsedGameTime.TotalSeconds;
                break;


        }
    }
    public void Draw(Matrix view, Matrix projection)
    {
        BoundingSphere = CalculateBoundingSphere();

        //Vector3 pos = BoundingSphere.Center;

        Matrix[] transforms = new Matrix[Model.Bones.Count];
        Model.CopyAbsoluteBoneTransformsTo(transforms);
        Matrix translateMatrix = Matrix.CreateTranslation(Position);//POSITION
        Matrix worldMatrix = Matrix.Identity;
        worldMatrix *= Matrix.CreateRotationX(m_Rotations.X);//making asteroid spin
        worldMatrix *= Matrix.CreateRotationY(m_Rotations.Y);//making asteroid spin
        worldMatrix *= Matrix.CreateRotationZ(m_Rotations.Z);//making asteroid spin
        worldMatrix *= translateMatrix;

        //Matrix worldMatrix = translateMatrix;

        if (!Destroyed)
        {
            foreach (ModelMesh mesh in Model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.World =
                        worldMatrix* transforms[mesh.ParentBone.Index];  //MAKE THIS ROTATE
                    effect.View = view ;
                    effect.Projection = projection;


                    effect.EnableDefaultLighting();
                    effect.PreferPerPixelLighting = true;
                }
                mesh.Draw();
            }
        }

Ответы [ 3 ]

0 голосов
/ 28 апреля 2011

проверьте этот сайт, это может быть полезно.

http://aarcoraci.wordpress.com/2010/01/11/blender-to-xna-fbx-understanding-the-model/

0 голосов
/ 24 февраля 2013

jv42 правило гласит: СТО: масштабирование - вращение - перевод

0 голосов
/ 20 апреля 2011

Не слишком задумываясь, не Matrix worldMatrix = scaleMatrix * translateMatrix; задом наперед?

Разве это не должно быть Matrix worldMatrix = translateMatrix * scaleMatrix;?

...