Визуальное моделирование местности с мельницами и лопастями

Сущность и особенности использования языка программирования 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.