Визуальное моделирование местности с мельницами и лопастями
Сущность и особенности использования языка программирования C#. Общие сведения, назначение, условия применения и параметры программы "Визуальное моделирование местности с мельницами и крутящимися лопастями". Программа и методика испытаний программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 16.01.2013 |
Размер файла | 2,5 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
СОДЕРЖАНИЕ
Введение
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 Листинг программы
Размещено на http://www.allbest.ru/
ВВЕДЕНИЕ
C# (произносится си шарп) -- объектно-ориентированный язык программирования. Разработан в 1998--2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270.
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 Логическая структура
Размещено на http://www.allbest.ru/
Рис.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)
* |
* |
|||||||||
* 8 8 |
||||||||||
Шаг 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 |
|
9 |
4,2,1 |
5,6,2 |
Уравнение прямой, проходящей через две точки, имеет вид:
В каноническом форме:
Уравнение прямой AB:
В параметрической форме:
t = (-?;?)
Уравнение прямой AB:
Задача 3
Вычислить координаты точек пересечения прямых AB и CD, лежащих на плоскости
№ Варианта |
A |
B |
C |
D |
|
9 |
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 |
|
9 |
1,5,2 |
-2,1,7 |
3,6,2 |
Находим значение
Уравнение нормали
==i(6)-j(-5)+k(-1)=6i+5j-k
Задача 5
Получить матрицу преобразования на плоскости для последовательного выполнения трех простейших преобразований.
№ Варианта |
Преобр1 |
Преобр2 |
Преобр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 =
4. Итоговая матрица преобразований:
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.
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
{
/// <summary>
/// This is the main type for your game
/// </summary>
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";
}
/// </summary>
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();
}
/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
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<Model>("2");
modelLop = Content.Load<Model>("1");
// TODO: use this.Content to load your game content here
e = Content.Load<Texture2D>("e1");
n = Content.Load<Texture2D>("n1");
s = Content.Load<Texture2D>("s1");
w = Content.Load<Texture2D>("w1");
up = Content.Load<Texture2D>("up");
}
/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// all content.
/// </summary>
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here\
Content.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>
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(r);
d1 = (f1 != null);//Если d1 = true then есть попадание
//Задаем сферу вокруг наблюдателя
BoundingSphere s = new BoundingSphere(m.Translation, 1.2f);
d2 = b.Intersects(s); //Если d2 = true then наблюдатель близко к объекту
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
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
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
using (Game1 game = new Game1())
{
game.Run();
}
}
}
}
Размещено на Allbest.ru
Подобные документы
Проектирование и объектно-ориентированный анализ программного продукта для создания и поддержки составления генеалогического дерева. Морфологическая и функциональная модель системы, построение соответствующих диаграмм. Теория о BPWin и Microsoft Word.
курсовая работа [887,4 K], добавлен 27.08.2012Визуальное моделирование в UML. Построение модели в форме диаграммы вариантов использования (use case diagram), которая описывает функциональное назначение системы. Документация для взаимодействия разработчиков системы с ее заказчиками и пользователями.
лабораторная работа [672,2 K], добавлен 10.03.2014Программирование как процесс описания последовательности действий решения задачи средствами конкретного языка и оформление результатов описания в виде программы. Этапы разработки программы, требования к ее функциональности, направления использования.
контрольная работа [79,7 K], добавлен 10.01.2016Методологическая основа моделирования – диалектико-математический метод познания и научного исследования. Назначение и условия применения программы. Описание задачи и логической структуры программы. Используемые технические средства, вызов и загрузка.
курсовая работа [311,8 K], добавлен 06.01.2009Средства программирования, описание языка С++. Назначение программы, требования к документации. Стадии разработки, виды испытаний. Используемые технические, программные средства. Вызов и загрузка, входные и выходные данные. Программа и методика испытаний.
контрольная работа [205,3 K], добавлен 23.07.2013Порядок описание процесса разработки модели для разрешения задачи программирования с помощью средств языка программирования. Структуры данных и основные принципы их построения. Этапы компьютерного моделирования. Этапы и значение написания программы.
курсовая работа [19,5 K], добавлен 19.05.2011Принципы получения электронных копий. История создания сканера, принцип действия. Виды сканеров, их характеристики. Выбор среды программирования: визуальное программирование, среда программирования Delphi, язык С++. Описание разработанной программы.
курсовая работа [42,9 K], добавлен 25.12.2008Общие сведения о программном средстве по моделированию работы электродвигателя, его функциональное назначение. Описание логической структуры программного обеспечения. Вызов программы modelDPR52, ее загрузка, входные и выходные данные. Листинг программы.
курсовая работа [420,0 K], добавлен 28.05.2012Общие сведения о работе программы в среде программирования Microsoft Visual Studio 2008, на языке программирования C++. Ее функциональное назначение. Инсталляция и выполнение программы. Разработанные меню и интерфейсы. Алгоритм программного обеспечения.
курсовая работа [585,5 K], добавлен 24.03.2009Специфика визуального подхода к программированию, языки и среды программирования, которые поддерживают его возможности. Классификация языков визуального программирования. Объектная модель (иерархия классов VBA), используемая в MS Word и в MS Excel.
контрольная работа [965,6 K], добавлен 27.04.2013