Визуальное моделирование местности с мельницами и лопастями
При проведении испытаний применялся редактор Microsoft C# 2008, XNA 3.1, выявляющий синтаксические и логические ошибки, необъявленные переменные, при обнаружении которых происходит прерывание в выполнении программы и предоставляется возможность отладки программы. Помимо этого среда разработки Microsoft C# 2008, XNA 3.1 позволяет применять такие методы отладки, как пошаговое выполнение программы… Читать ещё >
Визуальное моделирование местности с мельницами и лопастями (реферат, курсовая, диплом, контрольная)
1. Описание программы
1.1 Общие сведения
1.2 Функциональное назначение
1.3 Описание алгоритма функционирования программы
1.4 Логическая структура
1.5 Используемые технические и программные средства
1.6 Вызов и загрузка
1.7 Входные данные
1.8 Выходные данные
2. Программа и методика испытаний
2.1 Цель испытаний
2.2 Средства и порядок испытаний
3. Руководство системного программиста
3.1 Назначение и условия применения программы
3.2 Характеристика программы
3.3 Структура программы
3.4 Описание алгоритмов, функций и переменных
3.5 Настройка программы
4. Руководство оператора
5. Задачи Задача 1
Задача 2
Задача 3
Задача 4
Задача 5
Задача 6
Задача 7
Задача 8
Заключение
Список используемых источников Приложение 1 Листинг программы
C# (произносится си шарп) — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23 270.
C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.
Переняв многое от своих предшественников — языков C++, Java, Delphi, Модула и Smalltalk — С #, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# не поддерживает множественное наследование классов (в отличие от C++).
Microsoft XNA (англ. XNA’sNotAcronymed) — набор инструментов с управляемой средой времени выполнения (.NET), созданный Microsoft, облегчающий разработку и управление компьютерными играми. XNA стремится освободить разработку игр от написания «повторяющегося шаблонного кода» и объединить различные аспекты разработки игр в одной системе.
Пакет Microsoft XNA, по словам представителей Microsoft, позволит разработчикам игр избежать многих технических трудностей, возникающих при написании кода, а также обеспечит существенное снижение стоимости конечной продукции. Кроме того, благодаря XNA программисты смогут создавать принципиально новые игры с высококачественной графикой.
1. ОПИСАНИЕ ПРОГРАММЫ
1.1 Общие сведения
Программа в данной курсовой работе реализована на языке программирования C#.
C# разрабатывался как язык программирования прикладного уровня для Common Language Runtime и, как таковой, зависит, прежде всего, от возможностей самой CLR. CLR предоставляет C#, как и всем другим .NET-ориентированным языкам, многие возможности, которых лишены «классические» языки программирования. Например, сборка мусора не реализована в самом C#, а производится CLR для программ, написанных на C# точно так же, как это делается для программ на VB.NET, J# и др.
Разработанная программа называется «Визуальное моделирование местности с мельницами и крутящимися лопастями» в соответствии с алгоритмом, разработанным в ней. Используемый язык программирования C#.
1.2 Функциональное назначение
Программа моделирует ландшафт местности с созданием внешней архитектуры помещений.
Может пригодиться в архитектурном моделировании.
1.3 Описание функционирования программы
Программное обеспечение не взаимодействует с другим ПО.
Основные действия пользователя в программе представлены следующими пунктами:
1. Передвижение наблюдателя (камеры) по местности,
2. Визуализация четырёх мельниц с крутящимися лопастями,
3. Выход из программы.
При осуществлении операций система взаимодействует с графическими объектами.
1.4 Логическая структура
Рис. 1. Диаграмма классов В данной программе реализована следующая диаграмма классов, представленная на Рис.1
1.5 Используемые технические и программные средства
Программное обеспечение разработано для персонального компьютера IBM PC с процессором не ниже Pentium3 со следующими характеристиками:
ь Обьем ОЗУ не менее 256 Мб;
ь 3D-видеоадаптер с памятью 128 МБ, совместимый с DirectX® 9.0
(c GeForceFX 5200 или Radeon 9500);
ь Клавиатура Реализована данное программное обеспечение на языке С #.
1.6 Вызов и загрузка
Вызов программы производится из файла с программой, которая может находиться как на компьютере, так и на произвольном носителе. Запуск производится с нажатия файла Programm progect .sln
Объем занимаемого места на носителе составляет 52Мб. Объем памяти занимаемой программой в ОЗУ составляет около 400 кб.
1.7 Входные данные
Входные данные — это данные положения наблюдателя. С помощью клавиатуры можно перемещать наблюдателя в нужную точку экрана.
1.8 Выходные данные
Выходные данные реализуются выводом программы на монитор компьютера.
2. ПРОГРАММА И МЕТОДИКА ИСПЫТАНИЙ
2.1 Цель испытаний
Целью испытаний программы является предотвращение ошибок или сбоев, связанных с кодом программы.
Любое испытание нужно, чтобы проверить работу программы, ее исправность. Для нас это очень важно, потому что от исправности зависит качество продукта. Цель испытаний — выявить все ошибки в программе и исправить их. Это необходимо для корректной работы программы и получения верного результата, т. е. необходимо установить правильность выходных данных для любого произвольного набора входных. Программу перед ее полным использованием нужно испытать и проверить. Для каждого файла программы можно использовать разные способы проверки, они могут быть похожи, но отличия будут. Нам нужно, чтобы программа быстро и точно выводила верный результат на экран.
К данной программе предъявляются следующие требования:
· система должна работать в консольном режиме и поддерживать работу с клавиатурой;
· вывод необходимых данных на экран;
· выход из программы.
2.2 Средства и порядок испытаний
Технические и программные средства, используемые во время испытаний:
Технические:
Виртуальная машина
Тип ЦП: 2,40 GHz;
Системная память: 4,00 ГБ;
Видеоадаптер: 512 МБ;
Клавиатура;
Манипулятор типа «мышь»;
Программные:
Операционная система: MicrosoftWindows 7 / Microsoft C# 2008, XNA 3.1
При проведении испытаний применялся редактор Microsoft C# 2008, XNA 3.1, выявляющий синтаксические и логические ошибки, необъявленные переменные, при обнаружении которых происходит прерывание в выполнении программы и предоставляется возможность отладки программы. Помимо этого среда разработки Microsoft C# 2008, XNA 3.1 позволяет применять такие методы отладки, как пошаговое выполнение программы и др.
Испытания проходили в следующей последовательности:
проверка корректного написания и последующее исправление ошибок, если таковые имеются, о наличии которых можно судить по сообщениям, выдаваемым редактором или отсутствии ожидаемого результата;
проверка правильности работы для каждого пункта программы:
— передвижение наблюдателя по экрану
— выход из программы Было выполнено несколько раз испытание на правильное функционирование.
В ходе испытаний ошибок или сбоев найдено не было. Все работает верно.
3. РУКОВОДСТВО СИСТЕМНОГО ПРОГРАММИСТА
3.1 Назначение и условия применения программы
Программное обеспечение предназначено для моделирования местности с объектами и может быть использовано для архитектурного моделирования.
Программное обеспечение разрабатывается для персонального компьютера IBM PC с процессором не ниже Pentium-120 со следующими характеристиками:
— объем ОЗУ не менее 20 Mb;
— графический адаптер SVGA;
— манипулятор типа «мышь» и «клавиатура» .
ЭВМ должна работать под управлением операционной системы не ниже Windows 98.
3.2 Характеристика программы
Данная программа работает в графическом режиме и поддерживает работу с клавиатурой.
3.3 Структура программы
Программа состоит из 2-х классов (Game1, Program). Game1 — основной класс, где описаны все команды для загрузки контента, рисования изображения на экране, обновления и движения. Program — класс, который запускает игру.
3.4 Описание алгоритмов, функций и переменных
Вся программа реализована в классе Game1, который является ребенком класса Game. Диаграмма классов представлена на рис .1
GraphicsDeviceManager graphics — графика
SpriteBatch spriteBatch — оболочка рисунка
Matrix worldMatrix — матрица визуального пространства
Matrix [] worldMel — матрица, задающая преобразование мельниц
Matrix [] worldLop — матрица, задающая преобразование лопастей мельниц
Model modelMelмодель мельницы
Model modelLop — модель лопасти
Matrix viewMatrix — матрица наблюдателя
Matrix projectionMatrix — матрица проецирования
Texture2D e — текстура фона: стены1
Texture2D n — текстура фона: стены2
Texture2D s — текстура фона: стены3
Texture2D w — текстура фона: стены4
Texture2D up — текстура фона: небо
VertexPositionTexture[] e1; - массив координат вершин с координатами текстур, описывающих позицию стен и неба, вокруг мельницы
int ind — переменная построения текстуры вокруг мельницы
int indz — переменная построения координат текстуры вокруг мельницы
BoundingBox b — коробка вокруг нашего дома
bool d1 — пересечение выстрелом (лучом)коробки дома
bool 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]- сдвиг матриц Мельницы, Лопасти по оси Х
3.5 Настройка программы
Настройка данной программы не требуется.
4. РУКОВОДСТВО ОПЕРАТОРА
Скопируйте папку с программой на компьютер, либо запустить с внешнего носителя.
При запуске программы на экране появляется изображение смоделированной архитектуры домов с фоном (Рис.9):
Рис. 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
Получить уравнение прямой, проходящей через 2 точки A и B
№ Варианта | A | B | |
4,2,1 | 5,6,2 | ||
Уравнение прямой, проходящей через две точки, имеет вид:
В каноническом форме:
Уравнение прямой AB:
В параметрической форме:
t = (-?;?)
Уравнение прямой AB:
Задача 3
Вычислить координаты точек пересечения прямых AB и CD, лежащих на плоскости
№ Варианта | A | B | C | D | |
2,4 | 5,1 | 4,1 | — 1,0 | ||
1)Получаем уравнение прямой AB:
2)Аналогично получаем уравнение прямой CD:
3)Найдем точку пересечения прямых AB и CD — точку E:
Составим систему уравнений:
Точка пересечения прямых AB и CD имеет координаты: E (5; 1)
Задача 4
Получить уравнение плоскости, проходящей через 3 точки A, B и C и получить уравнение нормали к этой плоскости
№ Варианта | A | B | C | |
1,5,2 | — 2,1,7 | 3,6,2 | ||
Находим значение Уравнение нормали
==i (6)-j (-5)+k (-1)=6i+5j-k
Задача 5
Получить матрицу преобразования на плоскости для последовательного выполнения трех простейших преобразований.
№ Варианта | Преобр1 | Преобр2 | Преобр3 | |
Масш 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 | |
Масш X 2 Y 3 | Пов Z -30 | Сдвиг Y 1 Z 2 | ||
1. Матрица с масштабированием Масш Y 2 Z 2
M1=
2.Матрица для операции вращения на угол 300 против часовой стрелки вокруг оси X:
RX30 =
3. Матрица для операции вращения на угол 300 против часовой стрелки вокруг оси Z:
RZ30 =
4. Итоговая матрица преобразований:
M = RZ30 * RX30 * SY2Z2 =
программирование язык моделирование визуальный
Задача 7
Вычислить координаты вершин квадрата, заданного координатами левого верхнего угла и длиной стороны. Стороны квадрата до преобразования параллельны осям координат и плоскость квадрата параллельна плоскости 0xy. Осуществить преобразование над квадратом в соответствии с вариантом из задания 6. Получить координаты вершин после преобразования.
№ Варианта | Вершина | Длина | |
3,5,4 | |||
Координаты вершин квадрата следующие:
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.
1.Сдвигаем вершину С к началу координат:
TXcYcZc =
2. Вращаем на угол 300 против часовой стрелки вокруг оси Z:
RZ30 =
3.Сдвигаем вершину С на старое место:
T1XcYcZc =
4. Итоговая матрица преобразований:
M3 = T1XcYcZc *RZ30 * TXcYcZc * M2 =
ЗАКЛЮЧЕНИЕ
В ходе данной курсовой работы мы получили основные знания и некоторые навыки в составлении алгоритмов и написании программ на языке программирования C#. Мы приобрели навыки и умения самостоятельного составления программ на языке программирования C# для разработки игры.
Мы считаем, что язык программирования 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;
using System.Collections.Generic;
using System. Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
namespace Lab5
{
/// This is the main type for your game
public class Game1: Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Matrix worldMatrix;
Matrix viewMatrix;
Matrix projectionMatrix;
BasicEffect effect;
Matrix [] worldMel = new Matrix[10]; //Мельница
Matrix [] worldLop = new Matrix[10]; //Лопости Мельницы
Model modelMel; //Модель Мельницы
Model modelLop; //Модель Лопости
Texture2D e;
Texture2D n;
Texture2D s;
Texture2D w;
Texture2D up;
VertexPositionTexture[] e1;
int[] ind;
int[] indz;
BoundingBox b;
bool d1 = false;
bool d2 = false;
float[] a = new float[4];
float[] b1 = new float[4];
public Game1()
{
graphics = new GraphicsDeviceManager (this);
Content.RootDirectory = «Content» ;
}
protected override void Initialize ()
{
// TODO: Add your initialization logic here
GraphicsDevice.RenderState.CullMode = CullMode. None; //Показывать плоскости с двух сторон
effect = new BasicEffect (GraphicsDevice, new EffectPool ());
Random r = new Random ();
for (int i = 0; i < 10; i++)
{
a[i] = Convert. ToSingle (r.NextDouble () * 100 — 50);
b1[i] = Convert. ToSingle (r.NextDouble () * 100 — 50);
worldMel[i] = Matrix. CreateScale (0.04f, 0.04f, 0.04f) * Matrix. CreateTranslation (b1[i]+3, -9.2f, a[i]);
worldLop[i] = Matrix. CreateScale (0.04f, 0.04f, 0.04f) * Matrix. CreateTranslation (b1[i], 0, a[i]);
}
viewMatrix = Matrix. CreateTranslation (0, -4, -30); //наблюдатель
worldMatrix = Matrix. CreateTranslation (new Vector3(0, 0, 0));
e1 = new VertexPositionTexture[4];
indz = new int[6];
e1[0].Position = new Vector3(100, 0, 100);
e1[0]. TextureCoordinate = new Vector2(1, 1);
e1[1]. Position = new Vector3(-100, 0, 100);
e1[1]. TextureCoordinate = new Vector2(0, 1);
e1[2]. Position = new Vector3(-100, 100, 100);
e1[2]. TextureCoordinate = new Vector2(0, 0);
e1[3]. Position = new Vector3(100, 100, 100);
e1[3]. TextureCoordinate = new Vector2(1, 0);
indz = new int[6] {0,1,3,3,1,2 };
//Коробка вокруг нашей стены
b = new BoundingBox ();
b.Min = new Vector3(1, 1, -0.1f);
b.Max = new Vector3(10, 7, 0.1f);
base.Initialize ();
}
/// LoadContent will be called once per game and is the place to load
/// all of your content.
protected override void LoadContent ()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch (GraphicsDevice);
float aspectRatio;
aspectRatio = (float)graphics.GraphicsDevice.Viewport.Width / (float)graphics.GraphicsDevice.Viewport.Height /1.3f;
float FOV = MathHelper. PiOver4;
projectionMatrix = Matrix. CreatePerspectiveFieldOfView (FOV, aspectRatio, 1f, 1000f);
modelMel = Content. Load («2»);
modelLop = Content. Load («1»);
// TODO: use this. Content to load your game content here
e = Content. Load («e1»);
n = Content. Load («n1»);
s = Content. Load («s1»);
w = Content. Load («w1»);
up = Content. Load («up»);
}
/// UnloadContent will be called once per game and is the place to unload
/// all content.
protected override void UnloadContent ()
{
// TODO: Unload any non ContentManager content here
Content.Unload ();
}
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// Provides a snapshot of timing values.
protected override void Update (GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState (PlayerIndex.One).Buttons.Back == ButtonState. Pressed)
this.Exit ();
for (int i = 0; i < 10; i++)
{
worldLop[i] = Matrix. CreateTranslation (0, 0, -a[i]) * Matrix. CreateRotationX (0.02f) * Matrix. CreateTranslation (0, 0, a[i]) * worldLop[i];
}
// TODO: Add your update logic here
KeyboardState keyboardState;
keyboardState = Keyboard. GetState ();
if (keyboardState.IsKeyDown (Keys.Escape) == true)
this.Exit ();
//Повороты плавные
if (keyboardState.IsKeyDown (Keys.Up) == true) //поворот вокруг X
viewMatrix = Matrix. Multiply (viewMatrix, Matrix. CreateRotationX (0.01f));
if (keyboardState.IsKeyDown (Keys.Down) == true) //поворот вокруг X
viewMatrix = Matrix. Multiply (viewMatrix, Matrix. CreateRotationX (-0.01f));
if (keyboardState.IsKeyDown (Keys.Right) == true) //поворот вокруг Y
viewMatrix = Matrix. Multiply (viewMatrix, Matrix. CreateRotationY (0.01f));
if (keyboardState.IsKeyDown (Keys.Left) == true) //поворот вокруг Y
viewMatrix = Matrix. Multiply (viewMatrix, Matrix. CreateRotationY (-0.01f));
//Шаги плавные
if (keyboardState.IsKeyDown (Keys.A) == true) //вправо
viewMatrix = Matrix. Multiply (viewMatrix, Matrix. CreateTranslation (new Vector3(1, 0, 0)));
if (keyboardState.IsKeyDown (Keys.D) == true) //влево
viewMatrix = Matrix. Multiply (viewMatrix, Matrix. CreateTranslation (new Vector3(-1, 0, 0)));
if (keyboardState.IsKeyDown (Keys.E) == true) //вверх
viewMatrix = Matrix. Multiply (viewMatrix, Matrix. CreateTranslation (new Vector3(0, 1, 0)));
if (keyboardState.IsKeyDown (Keys.Q) == true) //вниз
viewMatrix = Matrix. Multiply (viewMatrix, Matrix. CreateTranslation (new Vector3(0, -1, 0)));
if (keyboardState.IsKeyDown (Keys.S) == true) //ближе
viewMatrix = Matrix. Multiply (viewMatrix, Matrix. CreateTranslation (new Vector3(0, 0, -1)));
if (keyboardState.IsKeyDown (Keys.W) == true) //дальше
viewMatrix = Matrix. Multiply (viewMatrix, Matrix. CreateTranslation (new Vector3(0, 0, 1)));
//Матрица m задает положение наблюдателя относительно объекта (стенки)
Matrix m = Matrix. Multiply (worldMatrix, Matrix. Invert (viewMatrix));
//Задаем вектор направления взгляда из точки расположения наблюдателя
Ray r = new Ray (m.Translation, m. Forward);
//Определяем пересечение взгляда наблюдателя с коробкой вокруг объекта (стенки)
float? f1 = b. Intersects®;
d1 = (f1 ≠ null);//Если d1 = true then есть попадание
//Задаем сферу вокруг наблюдателя
BoundingSphere s = new BoundingSphere (m.Translation, 1.2f);
d2 = b. Intersects (s); //Если d2 = true then наблюдатель близко к объекту
base.Update (gameTime);
}
/// This is called when the game should draw itself.
/// Provides a snapshot of timing values.
protected override void Draw (GameTime gameTime)
{
// TODO: Add your drawing code here
if (d2) //Фон красный, если наблюдатель близко к объекту 1
GraphicsDevice.Clear (Color.Red);
else
if (d1) //Фон желтый, если наблюдатель направлен на объект 1 (попадет при выстреле)
GraphicsDevice.Clear (Color.Yellow);
else //Фон синий, если не попадет в объект 1 и не близко
GraphicsDevice.Clear (Color.CornflowerBlue);
//Задаем учет глубины
graphics.GraphicsDevice.RenderState.DepthBufferEnable = true;
for (int i = 0; i < 10; i++)
{
foreach (ModelMesh mesh in modelMel. Meshes)
{
foreach (BasicEffect effect in mesh. Effects)
{
effect.World = worldMel[i]; //при рисовании мельницы надо учесть только ее движение
effect.View = viewMatrix;
effect.Projection = projectionMatrix;
effect.Texture = null;
effect.TextureEnabled = false;
}
mesh.Draw ();
}
}
for (int i = 0; i < 10; i++)
{
foreach (ModelMesh mesh in modelLop. Meshes)
{
foreach (BasicEffect effect in mesh. Effects)
{
effect.World = worldLop[i]; //при рисовании лопости надо учесть только ее движение
effect.View = viewMatrix;
effect.Projection = projectionMatrix;
effect.Texture = null;
effect.TextureEnabled = false;
}
mesh.Draw ();
}
}
//Рисование объекта 4 (стена перпендикулярно направлению взгляда)
if (indz.Length > 0)
{
effect.View = viewMatrix;
effect.Projection = projectionMatrix;
effect.World = worldMatrix;
effect.Texture = e;
effect.TextureEnabled = true;
effect.Begin ();
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Begin ();
GraphicsDevice.VertexDeclaration = new VertexDeclaration (GraphicsDevice, VertexPositionTexture. VertexElements);
GraphicsDevice.DrawUserIndexedPrimitives (PrimitiveType.TriangleList, e1, 0, e1. Length, indz, 0, indz. Length / 3);
pass.End ();
}
effect.End ();
}
//Рисование объекта 5 (стена перпендикулярно направлению взгляда)
if (indz.Length > 0)
{
effect.View = viewMatrix;
effect.Projection = projectionMatrix;
effect.World = worldMatrix * Matrix. CreateRotationY (MathHelper.Pi);
effect.Texture = w;
effect.TextureEnabled = true;
effect.Begin ();
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Begin ();
GraphicsDevice.VertexDeclaration = new VertexDeclaration (GraphicsDevice, VertexPositionTexture. VertexElements);
GraphicsDevice.DrawUserIndexedPrimitives (PrimitiveType.TriangleList, e1, 0, e1. Length, indz, 0, indz. Length / 3);
pass.End ();
}
effect.End ();
}
//Рисование объекта 6 (стена перпендикулярно направлению взгляда)
if (indz.Length > 0)
{
effect.View = viewMatrix;
effect.Projection = projectionMatrix;
effect.World = worldMatrix * Matrix. CreateRotationY (MathHelper.PiOver2);
effect.Texture = s;
effect.TextureEnabled = true;
effect.Begin ();
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Begin ();
GraphicsDevice.VertexDeclaration = new VertexDeclaration (GraphicsDevice, VertexPositionTexture. VertexElements);
GraphicsDevice.DrawUserIndexedPrimitives (PrimitiveType.TriangleList, e1, 0, e1. Length, indz, 0, indz. Length / 3);
pass.End ();
}
effect.End ();
}
//Рисование объекта 7 (стена перпендикулярно направлению взгляда)
if (indz.Length > 0)
{
effect.View = viewMatrix;
effect.Projection = projectionMatrix;
effect.World = worldMatrix * Matrix. CreateRotationY (-MathHelper.PiOver2);
effect.Texture = n;
effect.TextureEnabled = true;
effect.Begin ();
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Begin ();
GraphicsDevice.VertexDeclaration = new VertexDeclaration (GraphicsDevice, VertexPositionTexture. VertexElements);
GraphicsDevice.DrawUserIndexedPrimitives (PrimitiveType.TriangleList, e1, 0, e1. Length, indz, 0, indz. Length / 3);
pass.End ();
}
effect.End ();
}
//Рисование объекта 8 (стена перпендикулярно направлению взгляда)
if (indz.Length > 0)
{
effect.View = viewMatrix;
effect.Projection = projectionMatrix;
effect.World = worldMatrix * Matrix. CreateTranslation (0,100,0);
effect.Texture = up;
effect.TextureEnabled = true;
effect.Begin ();
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Begin ();
GraphicsDevice.VertexDeclaration = new VertexDeclaration (GraphicsDevice, VertexPositionTexture. VertexElements);
GraphicsDevice.DrawUserIndexedPrimitives (PrimitiveType.TriangleList, e1, 0, e1. Length, indz, 0, indz. Length / 3);
pass.End ();
}
effect.End ();
}
base.Draw (gameTime);
}
}
}
Файл Program.cs
using System;
namespace Lab5
{
static class Program
{
/// The main entry point for the application.
static void Main (string[] args)
{
using (Game1 game = new Game1())
{
game.Run ();
}
}
}
}