3D Графика для Windows Phone 7 с использованием XNA Framework. Часть 2

Что же происходит, когда мы вызываем метод Draw модели? Читатели знакомые с более ранними версиями, возможно, удивятся тому, что теперь не нужно писать код, который бы обходил все мэши модели и устанавливал параметры эффекта.

Дело в том, что весь этот код теперь скрыт внутри метода Draw модели. С другой стороны, при использовании нового метода Draw теряется возможность настраивать параметры эффекта.

Для того, чтобы иметь возможность настраивать параметры эффектов мы применим старый метод отображения модели. Также стоит изменить позицию модели и камеры, чтобы иметь лучший обзор полученного эффекта.

 
protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
 
            Matrix world = Matrix.CreateRotationY((float)gameTime.TotalGameTime.TotalSeconds)
                *Matrix.CreateTranslation(0,-0.4f,0);
            Matrix view = Matrix.CreateLookAt(new Vector3(0,0,1.2f), Vector3.Zero, Vector3.Up);
            Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), GraphicsDevice.Viewport.AspectRatio, 0.1f, 10f);
 
            Matrix[] transforms = new Matrix[model.Bones.Count];
            model.CopyAbsoluteBoneTransformsTo(transforms);
 
            foreach (ModelMesh mesh in model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.PreferPerPixelLighting = true;
 
                    effect.LightingEnabled = true;
                    effect.AmbientLightColor = new Vector3(0.1f, 0.1f, 0.1f);
 
                    effect.SpecularColor = new Vector3(1, 1, 1);
                    effect.SpecularPower = 24;
 
                    effect.DirectionalLight0.Direction = new Vector3(1, -1, 0);
                    effect.DirectionalLight0.DiffuseColor = new Vector3(1, 0, 0);
                    effect.DirectionalLight0.SpecularColor = new Vector3(1, 1, 1);
 
                    effect.View = view;
                    effect.Projection = projection;
                    effect.World = transforms[mesh.ParentBone.Index] * world;
                }
                mesh.Draw();
            }
 
            base.Draw(gameTime);
        }

Примечание:

Этот код будет работать только в том случае, когда в качестве эффекта в свойствах Content Processor установлен BasicEffect.

В этом коде мы устанавливаем параметры освещения модели: включаем попиксельное освещение и создаем один направленный источник света красного цвета.

Теперь чайник должен выглядеть следующим образом:

Перед тем как идти дальше давайте остановимся и рассмотрим код, который мы только что написали, так как он потребуется нам дальше.

Каждая модель состоит из мешей или сеток (Mesh), которые позиционированы в локальной системе координат модели. Так что перед тем как рисовать каждую сетку, нам нужно преобразовать ее координаты в мировую систему координат. Модель также содержит кости (Bones), которые на самом деле являются матрицами трансформаций для сеток.

Замечание:

Вы можете найти подробное описание класса Model по ссылке (http://msdn.microsoft.com/en-us/library/dd904249.aspx)

Так что сначала нам нужно сохранить все кости модели:

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

После этого пройтись по всем сеткам модели и нарисовать их при помощи выбранного эффекта (который обычно указывается в свойствах Content Processor). Также нам нужно установить параметры для этих эффектов. Основные параметры – это матрицы World, View и Projection.

Когда Вы устанавливаете мировую матрицу (World) для модели, убедитесь в том, что Вы используете матрицы трансформаций из массива Bones.

            foreach (ModelMesh mesh in model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{

              // set effect parameters

                 effect.View = view;
effect.Projection = projection;
                    effect.World = transforms[mesh.ParentBone.Index] * world;
                }
mesh.Draw();
}

Реклама
Запись опубликована в рубрике Компьютерная графика с метками , , , , , , . Добавьте в закладки постоянную ссылку.

Один комментарий на «3D Графика для Windows Phone 7 с использованием XNA Framework. Часть 2»

  1. Уведомление:   Windows Phone / Возможности 3D графики Windows Phone by SOS Admin!

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s