XNA 3D Graphics - смысл моего кода? - PullRequest
1 голос
/ 15 сентября 2011

Я хочу нарисовать модель на экране.Вот мой код:

защищенное переопределение void Draw (GameTime gameTime) {

        GraphicsDevice.Clear(Color.CornflowerBlue);

        // TODO: Add your drawing code here
        Matrix[] transforms = new Matrix[model.Bones.Count];
        model.CopyAbsoluteBoneTransformsTo(transforms);

        foreach (ModelMesh mesh in model.Meshes)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                effect.EnableDefaultLighting();
                effect.World = transforms[mesh.ParentBone.Index] *
                    Matrix.CreateRotationY(modelRotation) *
                    Matrix.CreateTranslation(modelPosition);
                effect.View = Matrix.CreateLookAt(cameraPosition, 
                    Vector3.Zero, Vector3.Up);
                effect.Projection = Matrix.CreatePerspectiveFieldOfView(
                    MathHelper.ToRadians(45.0f), aspectRatio,
                    1.0f, 10000.0f);
            }

            mesh.Draw();
        }

        base.Draw(gameTime);
    }

Но, если я удалю:

Matrix [] transforms = new Matrix [model.Bones.Count];model.CopyAbsoluteBoneTransformsTo (transforms);

и изменение кода в цикле:

effect.World = Matrix.CreateRotationY (modelRotation);

Это все еще работает нормально.Так почему я должен добавить приведенный выше код в мой проект?В чем выгода?Большое спасибо!

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Основное отличие состоит в том, что в случае использования частей преобразования у вас есть полный контроль над преобразованиями частей меха, в простом случае вы не можете применять дополнительные матрицы преобразования.

Проще говоря, вы можете вращать свою сетку как один кусок, или вы можете вращать мех как куклу, например, в анимации куклы.

Но я до сих пор не вижу причины, по которой в вашем образце происходит искажение идентичных матриц, доступ к которым осуществляется через индекс кости. Это все еще выглядит бесполезным, пока вы не сделаете что-то с ними в коде, но создаете это каждый раз, когда в одном месте выглядело как ненадлежащее использование martices.

0 голосов
/ 16 сентября 2011
effect.World = transforms[mesh.ParentBone.Index] *
                Matrix.CreateRotationY(modelRotation) *
                Matrix.CreateTranslation(modelPosition);
  1. преобразует каждую сетчатую кость своим собственным преобразованием (которое включает в себя преобразования родительской кости),
  2. затем вращает ее вокруг оси Y (вращается вокруг нее на экране),
  3. затем перемещает его в другое место в мировом пространстве.

Я предполагаю, что на шаге 1 нет никаких преобразований, потому что это простая коробка или что-то, а на шаге 2modelPosition равно 0,0,0, так что на самом деле оно никуда не перемещалось.

измените значение modelPosition, и вы увидите, что модель перемещается по экрану, но не будет с вашими изменениями.

...