Опубликован: 14.08.2012 | Доступ: свободный | Студентов: 880 / 20 | Оценка: 5.00 / 5.00 | Длительность: 09:59:00
Специальности: Программист
Самостоятельная работа 19:

Игровой мир, освещение, тени

В листинге 26.2 приведен код класса modCls.

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace P19_1
{
    public class modCls : Microsoft.Xna.Framework.DrawableGameComponent
    {
        //Модель
        public Model myModel;
        //Мировая матрица, матрицы вида и проекции
        public Matrix WorldMatrix;
        public Matrix ViewMatrix;
        public Matrix ProjectMatrix;
        //Соотношение сторон экрана
        public float aspectRatio;
        //Для управления графическим устройством
        GraphicsDeviceManager graphics;
        //Конструктор получает на вход 
        //игровой класс, модель, объект для управления графическим устройством
        public modCls(Game game, Model mod, GraphicsDeviceManager grf)
            : base(game)
        {
            myModel = mod;
            graphics = grf;
            aspectRatio = (float)graphics.GraphicsDevice.Viewport.Width /
(float)graphics.GraphicsDevice.Viewport.Height;
        }

        public override void Initialize()
        {
            base.Initialize();
        }

        public override void Draw(GameTime gameTime)
        {

            foreach (ModelMesh mesh in myModel.Meshes)
            {
                //Для каждого эффекта в сети
                foreach (BasicEffect effect in mesh.Effects)
                {
                    //Установить освещение по умолчанию
                    effect.LightingEnabled = true;
                    effect.EnableDefaultLighting();
                    //установить матрицы
                    effect.World = WorldMatrix;
                    effect.View = ViewMatrix;
                    effect.Projection = ProjectMatrix;
                }
                mesh.Draw();
            }

            base.Draw(gameTime);
        }
    }
}
Листинг 26.2. Код класса modCls

На рис. 26.2 и рис. 26.3 вы можете видеть различные состояния игрового экрана проекта.

Игровой экран проекта P19_1

Рис. 26.2. Игровой экран проекта P19_1
Игровой экран проекта P19_1

Рис. 26.3. Игровой экран проекта P19_1

26.3. Управление освещением, тени

Рассмотрим управление освещением и отображением теней в XNA. Существуют различные техники работы с тенями, мы рассмотрим отрисовку теней. В частности, мы модифицируем проект P18_2 таким образом, чтобы шарики, падающие на плоскость, отбрасывали тени.

Для создания тени мы воспользуемся методом CreateShadow объекта Matrix. Он позволяет создавать тень от объекта на основе информации об источнике освещения и плоскости, на которую должна проецироваться тень.

После того, как сознана матрица, представляющая собой тень, мы используем эту матрицу для вывода тени. Предварительно мы включаем альфа-смешение, и, выводя объекты, указываем, что они непрозрачны, выводя тень – настраиваем её прозрачность.

В этом же примере мы рассмотрим настройку источника света. В частности, мы применим для рисования объектов один направленный источник света, направление которого можно менять с помощью экранныэ элементов управления. Изменение направления освещения влияет не только на освещение объектов, но и на тень.

Создадим новый проект – P19_2.

На рис. 26.4 вы можете видеть его окно Обозреватель решений.

Обозреватель решений, P19_2

Рис. 26.4. Обозреватель решений, P19_2

Для представления моделей, выводимых на экран, мы используем класс modCls, в качестве ресурсов игры используем шар ball2 и плоскость plane.

Рассмотрим код класса modCls (листинг. 26.3.) В проекте P18_2 этот класс отвечал за вывод изображений на экран. Сейчас он выполняет ту же функцию, дополнив вывод изображений визуализацией теней.

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace P19_2
{
    public class modCls : Microsoft.Xna.Framework.DrawableGameComponent
    {
        //Модель
        public Model myModel;
        //Мировая матрица, матрицы вида и проекции
        public Matrix WorldMatrix;
        public Matrix ViewMatrix;
        public Matrix ProjectMatrix;
        //Направление света
        public Vector3 LightDirection;
        //Матрица для отображения тени
        Matrix shadow;
        //Плоскость, на которой отображается тень
        Plane sPlane;
        //Соотношение сторон экрана
        public float aspectRatio;
        //Для управления графическим устройством
        GraphicsDeviceManager graphics;
        //Конструктор получает на вход 
        //игровой класс, модель, объект для управления графическим устройством и плоскость для вывода тени

        public modCls(Game game, Model mod, GraphicsDeviceManager grf, Plane pl)
            : base(game)
        {
            myModel = mod;
            graphics = grf;
            sPlane = pl;
            aspectRatio = (float)graphics.GraphicsDevice.Viewport.Width /
(float)graphics.GraphicsDevice.Viewport.Height;
            LightDirection = new Vector3();
            //Включаем альфа-смешение для эффекта полупрозрачности теней
            graphics.GraphicsDevice.BlendState = BlendState.AlphaBlend;
        }

        public override void Initialize()
        {
            base.Initialize();
        }

        public override void Draw(GameTime gameTime)
        {

            //Выводим объект
            foreach (ModelMesh mesh in myModel.Meshes)
            {
                //Для каждого эффекта в сети
                foreach (BasicEffect effect in mesh.Effects)
                {
                    //Объекты непрозрачны
                    effect.Alpha = 1.0f;
                    effect.DiffuseColor = new Vector3(1.0f, 1.0f, 1.0f);
                    //Включить освещение
                    effect.LightingEnabled = true;
                    //Включить источник направленного света №0
                    effect.DirectionalLight0.Enabled = true;
                    //Настроить параметры
                    effect.DirectionalLight0.DiffuseColor = Vector3.One;
                    effect.DirectionalLight0.SpecularColor = Vector3.One;
                    //Направление света - в класса Game1 мы меняем направление
                    //по клавиатурным командам
                    effect.DirectionalLight0.Direction = Vector3.Normalize(LightDirection);
                    //Установка матриц
                    effect.World = WorldMatrix;
                    effect.View = ViewMatrix;
                    effect.Projection = ProjectMatrix;
                }
                mesh.Draw();
            }

            //Создать матрицу тени
            shadow = Matrix.CreateShadow(-LightDirection, sPlane);
            //Выводим тень
            foreach (ModelMesh mesh in myModel.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    //Тень полупрозрачна
                    effect.Alpha = 0.4f;
                    effect.View = ViewMatrix;
                    effect.Projection = ProjectMatrix;
                    //При выводе тени умножаем мировую матрицу
                    //на матрицу вывода тени
                    effect.World = WorldMatrix * shadow;
                }
                mesh.Draw();
            }

            base.Draw(gameTime);
        }
    }
}
Листинг 26.3. Код класса modCls
Гулич Анна
Гулич Анна
Невозможно пройти тесты, в окне с вопросами пусто