Визуальное моделирование местности с мельницами и лопастями
СОДЕРЖАНИЕ
Введение
. Описание программы
.1 Общие сведения
.2 Функциональное назначение
.3 Описание алгоритма функционирования программы
.4 Логическая структура
.5 Используемые технические и программные средства
.6 Вызов и загрузка
.7 Входные данные
.8 Выходные данные
. Программа и методика испытаний
.1 Цель испытаний
.2 Средства и порядок испытаний
. Руководство системного программиста
.1 Назначение и условия применения программы
.2 Характеристика программы
.3 Структура программы
.4 Описание алгоритмов, функций и переменных
.5 Настройка программы
. Руководство оператора
. Задачи
Задача 1
Задача 2
Задача 3
Задача 4
Задача 5
Задача 6
Задача 7
Задача 8
Заключение
Список используемых источников
Приложение 1 Листинг программы
ВВЕДЕНИЕ
C# (произносится си шарп) -
объектно-ориентированный
<#"607153.files/image001.gif">
Рис.1.
Диаграмма классов
В данной программе реализована следующая диаграмма классов, представленная
на Рис.1
1.5
Используемые технические и программные средства
Программное обеспечение разработано для персонального компьютера IBM PC с процессором не ниже Pentium3 со следующими характеристиками:
ü Обьем ОЗУ не менее 256 Мб;
ü 3D-видеоадаптер с памятью 128 МБ, совместимый с DirectX® 9.0
(c GeForceFX 5200 или Radeon 9500);
ü Клавиатура
Реализована данное программное обеспечение на языке С #.
.6 Вызов и
загрузка
Вызов программы производится из файла с программой, которая может
находиться как на компьютере, так и на произвольном носителе. Запуск
производится с нажатия файла Programm progect .sln
Объем занимаемого места на носителе составляет 52Мб. Объем памяти
занимаемой программой в ОЗУ составляет около 400 кб.
.7 Входные
данные
Входные данные - это данные положения наблюдателя. С помощью клавиатуры
можно перемещать наблюдателя в нужную точку экрана.
.8
Выходные данные
Выходные данные реализуются выводом программы на монитор компьютера.
2.
ПРОГРАММА И МЕТОДИКА ИСПЫТАНИЙ
.1 Цель
испытаний
Целью испытаний программы является предотвращение ошибок или сбоев,
связанных с кодом программы.
Любое испытание нужно, чтобы проверить работу программы, ее исправность.
Для нас это очень важно, потому что от исправности зависит качество продукта.
Цель испытаний - выявить все ошибки в программе и исправить их. Это необходимо
для корректной работы программы и получения верного результата, т.е. необходимо
установить правильность выходных данных для любого произвольного набора
входных. Программу перед ее полным использованием нужно испытать и проверить.
Для каждого файла программы можно использовать разные способы проверки, они
могут быть похожи, но отличия будут. Нам нужно, чтобы программа быстро и точно
выводила верный результат на экран.
К данной программе предъявляются следующие требования:
· система должна работать в консольном режиме и поддерживать работу с
клавиатурой;
· вывод необходимых данных на экран;
· выход из программы.
.2
Средства и порядок испытаний
Технические и программные средства, используемые во время испытаний:
Технические:
Виртуальная машина
Тип ЦП: 2,40 GHz;
Системная память: 4,00 ГБ;
Видеоадаптер: 512 МБ;
Клавиатура;
Манипулятор типа «мышь»;
Программные:
Операционная система: MicrosoftWindows 7 / Microsoft C# 2008, XNA
3.1
Испытания проходили в следующей последовательности:
1) проверка корректного написания и
последующее исправление ошибок, если таковые имеются, о наличии которых можно
судить по сообщениям, выдаваемым редактором или отсутствии ожидаемого
результата;
2) проверка правильности работы для
каждого пункта программы:
- передвижение наблюдателя по экрану
выход из программы
Было выполнено несколько раз испытание на правильное функционирование.
В ходе испытаний ошибок или сбоев найдено не было. Все работает верно.
3.
РУКОВОДСТВО СИСТЕМНОГО ПРОГРАММИСТА
.1
Назначение и условия применения программы
Программное обеспечение предназначено для моделирования местности с
объектами и может быть использовано для архитектурного моделирования.
Программное обеспечение
разрабатывается для персонального компьютера IBM PC с процессором не ниже
Pentium-120 со следующими характеристиками:
объем ОЗУ не менее 20 Mb;
графический адаптер SVGA;
манипулятор типа "мышь" и
"клавиатура".
ЭВМ должна работать под управлением
операционной системы не ниже Windows
98.
.2
Характеристика программы
Данная программа работает в графическом режиме и поддерживает работу с
клавиатурой.
.3
Структура программы
Программа состоит из 2-х классов (Game1, Program).
Game1 - основной класс, где описаны все
команды для загрузки контента, рисования изображения на экране, обновления и
движения. Program - класс, который запускает игру.
3.4 Описание алгоритмов, функций и
переменных
Вся программа реализована в классе Game1, который является ребенком класса Game. Диаграмма классов представлена на
рис .1
GraphicsDeviceManager graphics - графикаspriteBatch - оболочка рисункаworldMatrix
- матрица визуального пространства[] worldMel - матрица, задающая
преобразование мельниц[] worldLop - матрица, задающая преобразование лопастей
мельниц
Model modelMel -модель
мельницыmodelLop - модель лопастиviewMatrix - матрица наблюдателяprojectionMatrix
- матрица проецирования D e - текстура фона: стены1D n - текстура фона: стены2D
s - текстура фона: стены3D w - текстура фона: стены4D up - текстура фона:
небо[] e1; - массив координат вершин с координатами текстур, описывающих
позицию стен и неба, вокруг мельницыind - переменная построения текстуры вокруг
мельницыindz - переменная построения координат текстуры вокруг мельницыb -
коробка вокруг нашего дома d1 - пересечение выстрелом (лучом)коробки домаd2 -
пересечение приближением коробки дома
Разработка объектов сцены
На сцене расположено 4 одинаковых мельницы. Для каждой мельницы имеется
лопасть, которая вращается. Помимо этого на сцене расположен куб,
представляющий собой визуализацию пространства.
Размер модели «Мельница» имеет размер
1920*1080 пикселов
Размер модели «Лопасть» имеет размер
1920*1080 пикселов
Рисование мельницы и лопасти
осуществляется в методе Draw.
Рис.1. Модель
«Мельница по оси Z, Y»
Рис.2. Модель
«Лопасть по оси Z, Y»
Для визуализации пространства используется куб размером стороны 30 м.
Каждая сторона куба предствлена 2 треугольниками. На стороны куба наложены
текстуры стены1 (sahara_east.bmp, размером - 1024*1024пикселов), стены2 (sahara_north.bmp, размером
- 1024*1024пикселов) , стены3 (sahara_south.bmp, размером - 1024*1024пикселов),
стены3 (sahara_north.bmp, размером - 1024*1024пикселов) и неба (sahara_up.bmp,
размером - 1024*1024пикселов ).
Текстура стены представлена на рис.
3, рис. 4 рис. 5, рис. 7.
Текстура неба представлена на рис. 6.
Алгоритм движения
· движение наблюдателя
Для описания положения наблюдателя используется матрица 4*4 viewMatrix. В Update происходит изменение матрицы в соответствии с
действиями пользователя. При нажатии на клавишу E происходит поворот
наблюдателя вокруг оси Y. Для
этого происходит умножение текущей матрицы viewMatrix на матрицу поворота
Ryα = ,
где α=0.1рад.
При нажатии на клавишу Up происходит перемещение вперед, то есть вдоль
оси Z. Для этого происходит умножение
текущей матрицы viewMatrix на
матрицу перемещения
T= , где dz=0.1рад.
При нажатии на клавишу Down происходит перемещение назад, то есть вдоль
оси Z. Для этого происходит умножение
текущей матрицы viewMatrix на
матрицу перемещения
T= , где dz=-0.1рад.
При нажатии на клавишу W происходит перемещение вверх, то есть вдоль оси Y. Для этого происходит умножение
текущей матрицы viewMatrix на
матрицу перемещения
T= , где dy=-0.1рад.
При нажатии на клавишу Q происходит перемещение вперед, то есть вдоль оси
Y. Для этого происходит умножение
текущей матрицы viewMatrix на
матрицу перемещения
T= , где dy=0.1рад.
При нажатии на клавишу Right происходит перемещение вперед, то есть вдоль
оси X. Для этого происходит умножение
текущей матрицы viewMatrix на
матрицу перемещения
T= , где dx=-0.1рад.
При нажатии на клавишу Left происходит перемещение вперед, то есть вдоль
оси X. Для этого происходит умножение
текущей матрицы viewMatrix на
матрицу перемещения
T= , где dx=0.1рад.
Модели мельницы и лопасти были смоделированы в программе Blender. Они
находятся в папке Content и загружаются при загрузке программы. Мельница
состоит из 2 объектов: Основание мельницы и лопасть. Сделано для того, чтобы
лопасть вращалась вокруг мельницы по оси X.
MLI = MLI* Mm
MLI -матрица модели лопасти
Mm- матрица поворота лопасти по оси X за 1 кадр
I=1,…,10
- кол-во матриц лопастей
Алгоритм генерации координат мельниц I-ая мельница имеет координаты xi,yi,zi.
MLl=T(xi,yi,zi)*Mm
где T-матрица поворота мельниц
MMl= MM* Mm(b1[i]+3, yi, a1[i])
MLl= ML* Mm(b1[i],
yi, a1[i])
a1[i]- сдвиг матриц Мельницы, Лопасти по
оси Z
b1[i]- сдвиг матриц Мельницы, Лопасти по
оси Х
.5
Настройка программы
Настройка данной программы не требуется.
4.
РУКОВОДСТВО ОПЕРАТОРА
Скопируйте папку с программой на компьютер, либо запустить с внешнего
носителя.
При запуске программы на экране
появляется изображение смоделированной архитектуры домов с фоном (Рис.9):
Далее у пользователя появляется возможность передвигаться по программе в
выбранном направлении. Поворот вокруг Y - E (Рис.8.); влево - Left (Рис.9.);вправо - Right (Рис.10.); вверх - W (Рис.11.);
вниз - Q (Рис.12.); ближе - Up (Рис.13.); дальше - Down (Рис.14.).
Рис.10.
Приближение
Для закрытия программы нажимается или клавиша Esc.
5. ЗАДАЧИ
Задача 1
Осуществить заливку методом “С затравочным пикселом” замкнутой растровой
фигуры.
Шаг 0: Стек= (7,3)
Шаг 1: ТП= (7,3) Стек= (Пусто)
Шаг 2: Заливка= (3,3)-( 9,3)
Шаг 3: Стек= (4,2), (7,2), (4,4),
(7,4)
Шаг 1: ТП= (7,4) Стек = (4,2), (7,2),
(4,4)
Шаг 2: Заливка = (7,4)-(8,4)
Шаг 3: Стек = (4,2), (7,2), (4,4),
(8,5)
Шаг 1: ТП= (8,5) Стек = (4,2), (7,2),
(4,4)
Шаг 2: Заливка = (8,5)-(9,5)
Шаг 3: Стек = (4,2), (7,2), (4,4),
(9,6)
Шаг 1: ТП= (9,6) Стек =(4,2), (7,2),
(4,4)
Шаг 2: Заливка = (9,6)
Шаг 3: Стек = (4,2), (7,2), (4,4)
Шаг 1: ТП= (4,4) Стек = (4,2), (7,2)
Шаг 2: Заливка= (4,4)-(5,4)
Шаг 3: Стек= (4,2), (7,2), (4,5)
Шаг 1: ТП= (4,5)
Стек = (4,2), (7,2)
Шаг 2:
Заливка = (2,5)-(4,5)
Шаг 3: Стек = (4,2), (7,2), (2,4),
(3,6)
Шаг 1: ТП= (3,6) Стек = (4,2),
(7,2),(2,4)
Шаг 2: Заливка = (3,6)
Шаг 3: Стек = (4,2), (7,2), (2,4)
Шаг 1: ТП= (2,4) Стек = (4,2), (7,2)
Шаг 2: Заливка = (2,4)
Шаг 3: Стек = (4,2), (7,2)
Шаг 1: ТП= (4,2) Стек = (7,2)
Шаг 2: Заливка = (4,2) - (5,2)
Шаг 3: Стек = (7,2)
Шаг 1: ТП= (7,2) Стек = пусто :)
Шаг 2: Заливка = (7,2) - (8,2)
Шаг 3: Стек = пусто =:)
Получить уравнение прямой, проходящей через 2 точки A и B
№ Варианта
|
A
|
B
|
9
|
4,2,1
|
5,6,2
|
Уравнение прямой, проходящей через две точки, имеет вид:
В каноническом форме:
Уравнение прямой AB:
В параметрической форме:
= (-∞;∞)
Уравнение прямой AB:
Задача
3
Вычислить координаты точек пересечения прямых AB и CD,
лежащих на плоскости
№ Варианта
|
A
|
B
|
C
|
D
|
9
|
2,4
|
5,1
|
4,1
|
-1,0
|
)Получаем уравнение прямой AB:
)Аналогично получаем уравнение прямой CD:
)Найдем точку пересечения прямых AB и CD -
точку E:
Составим систему уравнений:
Точка
пересечения прямых AB и CD имеет координаты: E (5 ; 1)
Задача 4
Получить уравнение плоскости, проходящей через 3 точки A, B и C и
получить уравнение нормали к этой плоскости
№ Варианта
|
A
|
B
|
C
|
9
|
1,5,2
|
-2,1,7
|
3,6,2
|
Находим
значение
Уравнение
нормали
==i(6)-j(-5)+k(-1)=6i+5j-k
Задача 5
Получить матрицу преобразования на плоскости для последовательного
выполнения трех простейших преобразований.
№ Варианта
|
Преобр1
|
Преобр3
|
9
|
Масш X 2 Y 3
|
Пов -30
|
Сдвиг X 1
Y 2
|
Преобразование:
1. Поворот на 300 против
часовой стрелки
M1 = R30* M1 = * M1 =
2. Поворот на 250 против
часовой стрелки
M2 = R30 * M1 =
3. Сдвиг X2
M1 =
Задача 6
Получить матрицу преобразования в пространстве для последовательного
выполнения трех простейших преобразований
№ Варианта
|
Преобр1
|
Преобр2
|
Преобр3
|
9
|
Масш X 2
Y 3
|
Пов Z
-30
|
Сдвиг Y 1 Z 2
|
1. Матрица с масштабированием Масш Y 2 Z 2
M1=
2.Матрица для операции вращения на
угол 300 против часовой стрелки вокруг оси X:
RX30 =
3. Матрица для операции вращения на
угол 300 против часовой стрелки вокруг оси Z:
RZ30 =
. Итоговая матрица преобразований:
M = RZ30 * RX30 * SY2Z2 =
программирование
язык моделирование визуальный
Задача 7
Вычислить координаты вершин квадрата, заданного координатами левого
верхнего угла и длиной стороны. Стороны квадрата до преобразования параллельны
осям координат и плоскость квадрата параллельна плоскости 0xy. Осуществить преобразование над
квадратом в соответствии с вариантом из задания 6. Получить координаты вершин
после преобразования.
№ Варианта
|
Вершина
|
Длина
|
9
|
3,5,4
|
3
|
Координаты вершин квадрата следующие:
A(1;3;5), B(3;3,5), C(3;1;5),
D(1;1;5),)
Исходная матрица для этой фигуры:
M1 =
Решение:
M2 = M * M1 =
Координаты
вершин после преобразования:
AП(0,964; -0,33;11,66), BП (2,696; -1,33; 11,66), CП (0,964; -4.33; 9,66), DП (-0,768; -3,33; 9,66)
Задача 8
Повернуть четырехугольник, полученный в предыдущем задании, вокруг
вершины C на 30 градусов против часовой
стрелки вокруг оси Z.
.Сдвигаем вершину С к началу координат:
TXcYcZc =
2. Вращаем на угол 300 против
часовой стрелки вокруг оси Z:
RZ30 =
3.Сдвигаем вершину С на старое место:
T1XcYcZc =
. Итоговая матрица преобразований:
M3 = T1XcYcZc *RZ30 * TXcYcZc * M2 =
ЗАКЛЮЧЕНИЕ
Мы считаем, что язык программирования C# - это простое, достаточно удобное и мощное средство
разработки самых разных приложений - от создания простых программ,
предназначенных для решения несложных вычислительных задач, до разработки
сложнейших реляционных систем управления базами данных - обладающее весьма
широким спектром возможностей.
СПИСОК
ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Разработка компьютерной
графики с .NET C# и OpenGL API. http://esate.ru/page/uroki-OpenGL-c-sharp
2. Горнаков
С.Г. Программирование компьютерных игр под Windows в XNA Game Studio Express. - М.:ДМК Пресс,
2008.-384с.: ил.
3. Порев
В.Н. Компьютерная графика - СПб.: БХВ-Петербург, 2002.-432 с.: ил.
Приложение
1.
Листинг
программы
Файл Game1.cs
using
System;System.Collections.Generic;System.Linq;Microsoft.Xna.Framework;Microsoft.Xna.Framework.Audio;Microsoft.Xna.Framework.Content;Microsoft.Xna.Framework.GamerServices;Microsoft.Xna.Framework.Graphics;Microsoft.Xna.Framework.Input;Microsoft.Xna.Framework.Media;Microsoft.Xna.Framework.Net;Microsoft.Xna.Framework.Storage;Lab5
{
/// <summary>
/// This is the main type for your
game
/// </summary>class Game1 :
Microsoft.Xna.Framework.Game
{graphics;spriteBatch;worldMatrix;viewMatrix;projectionMatrix;effect;[]
worldMel = new Matrix[10]; //Мельница[] worldLop = new Matrix[10]; //Лопости
МельницыmodelMel; //Модель МельницыmodelLop; //Модель ЛопостиD e;D n;D s;D w;D
up;[] e1;[] ind;[] indz; b;d1 = false;d2 = false;[] a = new float[4];[] b1 =
new float[4];Game1()
{= new
GraphicsDeviceManager(this);.RootDirectory = "Content";
}
/// </summary>override void
Initialize()
{
// TODO: Add your initialization
logic here.RenderState.CullMode = CullMode.None; //Показывать плоскости с двух
сторон= new BasicEffect(GraphicsDevice, new EffectPool());r = new Random();(int
i = 0; i < 10; i++)
{[i] =
Convert.ToSingle(r.NextDouble() * 100 - 50);[i] =
Convert.ToSingle(r.NextDouble() * 100 - 50);[i] = Matrix.CreateScale(0.04f,
0.04f, 0.04f) * Matrix.CreateTranslation(b1[i]+3, -9.2f, a[i]);[i] =
Matrix.CreateScale(0.04f, 0.04f, 0.04f) * Matrix.CreateTranslation(b1[i], 0,
a[i]);
}= Matrix.CreateTranslation(0, -4,
-30); //наблюдатель= Matrix.CreateTranslation(new Vector3(0, 0, 0));= new
VertexPositionTexture[4];= new int[6];[0].Position = new Vector3(100, 0,
100);[0].TextureCoordinate = new Vector2(1, 1);[1].Position = new Vector3(-100,
0, 100);[1].TextureCoordinate = new Vector2(0, 1);[2].Position = new
Vector3(-100, 100, 100);[2].TextureCoordinate = new Vector2(0, 0);[3].Position
= new Vector3(100, 100, 100);[3].TextureCoordinate = new Vector2(1, 0); = new
int[6] {0,1,3,3,1,2 };
//Коробка вокруг нашей стены= new
BoundingBox();.Min = new Vector3(1, 1, -0.1f);.Max = new Vector3(10, 7,
0.1f);.Initialize();
}
/// <summary>
/// LoadContent will be called once
per game and is the place to load
/// all of your content.
/// </summary>override void
LoadContent()
{
// Create a new SpriteBatch, which
can be used to draw textures.= new SpriteBatch(GraphicsDevice);aspectRatio;=
(float)graphics.GraphicsDevice.Viewport.Width /
(float)graphics.GraphicsDevice.Viewport.Height /1.3f;FOV = MathHelper.PiOver4;=
Matrix.CreatePerspectiveFieldOfView(FOV, aspectRatio, 1f, 1000f);=
Content.Load<Model>("2");=
Content.Load<Model>("1");
// TODO: use this.Content to load
your game content here= Content.Load<Texture2D>("e1");=
Content.Load<Texture2D>("n1");=
Content.Load<Texture2D>("s1");=
Content.Load<Texture2D>("w1");= Content.Load<Texture2D>("up");
}
/// <summary>
/// UnloadContent will be called once
per game and is the place to unload
/// all content.
/// </summary>override void
UnloadContent()
{
// TODO: Unload any non
ContentManager content here\.Unload();
}
/// <summary>
/// Allows the game to run logic such
as updating the world,
/// checking for collisions,
gathering input, and playing audio.
/// </summary>
/// <param
name="gameTime">Provides a snapshot of timing
values.</param>override void Update(GameTime gameTime)
{
// Allows the game to
exit(GamePad.GetState(PlayerIndex.One).Buttons.Back ==
ButtonState.Pressed).Exit();(int i = 0; i < 10; i++)
{[i] = Matrix.CreateTranslation(0, 0,
-a[i]) * Matrix.CreateRotationX(0.02f) * Matrix.CreateTranslation(0, 0, a[i]) *
worldLop[i];
}
// TODO: Add your update logic
herekeyboardState;= Keyboard.GetState();(keyboardState.IsKeyDown(Keys.Escape)
== true).Exit();
//Повороты
плавные(keyboardState.IsKeyDown(Keys.Up) == true) //поворот вокруг X=
Matrix.Multiply(viewMatrix,
Matrix.CreateRotationX(0.01f));(keyboardState.IsKeyDown(Keys.Down) == true)
//поворот вокруг X= Matrix.Multiply(viewMatrix,
Matrix.CreateRotationX(-0.01f));(keyboardState.IsKeyDown(Keys.Right) == true)
//поворот вокруг Y= Matrix.Multiply(viewMatrix,
Matrix.CreateRotationY(0.01f));(keyboardState.IsKeyDown(Keys.Left) == true)
//поворот вокруг Y= Matrix.Multiply(viewMatrix,
Matrix.CreateRotationY(-0.01f));
//Шаги
плавные(keyboardState.IsKeyDown(Keys.A) == true) //вправо= Matrix.Multiply(viewMatrix,
Matrix.CreateTranslation(new Vector3(1, 0,
0)));(keyboardState.IsKeyDown(Keys.D) == true) //влево=
Matrix.Multiply(viewMatrix, Matrix.CreateTranslation(new Vector3(-1, 0,
0)));(keyboardState.IsKeyDown(Keys.E) == true) //вверх= Matrix.Multiply(viewMatrix,
Matrix.CreateTranslation(new Vector3(0, 1,
0)));(keyboardState.IsKeyDown(Keys.Q) == true) //вниз=
Matrix.Multiply(viewMatrix, Matrix.CreateTranslation(new Vector3(0, -1,
0)));(keyboardState.IsKeyDown(Keys.S) == true) //ближе= Matrix.Multiply(viewMatrix,
Matrix.CreateTranslation(new Vector3(0, 0,
-1)));(keyboardState.IsKeyDown(Keys.W) == true) //дальше=
Matrix.Multiply(viewMatrix, Matrix.CreateTranslation(new Vector3(0, 0, 1)));
//Матрица m задает положение
наблюдателя относительно объекта (стенки)m = Matrix.Multiply(worldMatrix,
Matrix.Invert(viewMatrix));
//Задаем вектор направления взгляда
из точки расположения наблюдателяr = new Ray(m.Translation, m.Forward);
//Определяем пересечение
взгляда наблюдателя с коробкой вокруг объекта (стенки)? f1 = b.Intersects(r);=
(f1 != null);//Если d1 = true then есть попадание
//Задаем сферу вокруг
наблюдателяs = new BoundingSphere(m.Translation, 1.2f);= b.Intersects(s);
//Если d2 = true then наблюдатель близко к объекту.Update(gameTime);
}
/// <summary>
/// This is called when the
game should draw itself.
/// </summary>
/// <param
name="gameTime">Provides a snapshot of timing
values.</param>override void Draw(GameTime gameTime)
{
// TODO: Add your drawing
code here(d2) //Фон красный, если наблюдатель близко к объекту
1.Clear(Color.Red);(d1) //Фон желтый, если наблюдатель направлен на объект 1
(попадет при выстреле).Clear(Color.Yellow);//Фон синий, если не попадет в
объект 1 и не близко.Clear(Color.CornflowerBlue);
//Задаем учет
глубины.GraphicsDevice.RenderState.DepthBufferEnable = true;(int i = 0; i <
10; i++)
{(ModelMesh mesh in
modelMel.Meshes)
{(BasicEffect effect in
mesh.Effects)
{.World = worldMel[i]; //при
рисовании мельницы надо учесть только ее движение .View =
viewMatrix;.Projection = projectionMatrix;.Texture = null;.TextureEnabled =
false;
}.Draw();
}
}(int i = 0; i < 10; i++)
{(ModelMesh mesh in
modelLop.Meshes)
{.World = worldLop[i]; //при
рисовании лопости надо учесть только ее движение .View = viewMatrix;.Projection
= projectionMatrix;.Texture = null;.TextureEnabled = false;
}.Draw();
}
}
//Рисование объекта 4 (стена
перпендикулярно направлению взгляда)(indz.Length > 0)
{.View =
viewMatrix;.Projection = projectionMatrix;.World = worldMatrix;.Texture = e;.TextureEnabled
= true;.Begin();(EffectPass pass in effect.CurrentTechnique.Passes)
{.Begin();.VertexDeclaration
= new VertexDeclaration(GraphicsDevice,
VertexPositionTexture.VertexElements);.DrawUserIndexedPrimitives(PrimitiveType.TriangleList,
e1, 0, e1.Length, indz, 0, indz.Length / 3);.End();
}.End();
}
//Рисование объекта 5 (стена
перпендикулярно направлению взгляда)(indz.Length > 0)
{.View =
viewMatrix;.Projection = projectionMatrix;.World = worldMatrix *
Matrix.CreateRotationY(MathHelper.Pi);.Texture = w;.TextureEnabled =
true;.Begin();(EffectPass pass in effect.CurrentTechnique.Passes)
{.Begin();.VertexDeclaration
= new VertexDeclaration(GraphicsDevice,
VertexPositionTexture.VertexElements);.DrawUserIndexedPrimitives(PrimitiveType.TriangleList,
e1, 0, e1.Length, indz, 0, indz.Length / 3);.End();
}.End();
}
//Рисование объекта 6 (стена
перпендикулярно направлению взгляда)(indz.Length > 0)
{.View =
viewMatrix;.Projection = projectionMatrix;.World = worldMatrix *
Matrix.CreateRotationY(MathHelper.PiOver2);.Texture = s;.TextureEnabled =
true;.Begin();(EffectPass pass in effect.CurrentTechnique.Passes)
{.Begin();.VertexDeclaration
= new VertexDeclaration(GraphicsDevice,
VertexPositionTexture.VertexElements);.DrawUserIndexedPrimitives(PrimitiveType.TriangleList,
e1, 0, e1.Length, indz, 0, indz.Length / 3);.End();
}.End();
}
//Рисование объекта 7 (стена
перпендикулярно направлению взгляда)(indz.Length > 0)
{.View =
viewMatrix;.Projection = projectionMatrix;.World = worldMatrix *
Matrix.CreateRotationY(-MathHelper.PiOver2);.Texture = n;.TextureEnabled =
true;.Begin();(EffectPass pass in effect.CurrentTechnique.Passes)
{.Begin();.VertexDeclaration
= new VertexDeclaration(GraphicsDevice,
VertexPositionTexture.VertexElements);.DrawUserIndexedPrimitives(PrimitiveType.TriangleList,
e1, 0, e1.Length, indz, 0, indz.Length / 3);.End();
}.End();
}
//Рисование объекта 8 (стена
перпендикулярно направлению взгляда)(indz.Length > 0)
{.View =
viewMatrix;.Projection = projectionMatrix;.World = worldMatrix *
Matrix.CreateTranslation(0,100,0);.Texture = up;.TextureEnabled =
true;.Begin();(EffectPass pass in effect.CurrentTechnique.Passes)
{.Begin();.VertexDeclaration
= new VertexDeclaration(GraphicsDevice,
VertexPositionTexture.VertexElements);.DrawUserIndexedPrimitives(PrimitiveType.TriangleList,
e1, 0, e1.Length, indz, 0, indz.Length / 3);.End();
}.End();
}.Draw(gameTime);
}
}
}
Файл Program.cs
using System;Lab5
{class Program
{
/// <summary>
/// The main entry point
for the application.
/// </summary>void
Main(string[] args)
{(Game1 game = new
Game1())
{.Run();
}
}
}
}