Построения гироскопа Фуко средствами OpenGL - Программирование, компьютеры и кибернетика курсовая работа

Построения гироскопа Фуко средствами OpenGL - Программирование, компьютеры и кибернетика курсовая работа




































Главная

Программирование, компьютеры и кибернетика
Построения гироскопа Фуко средствами OpenGL

Общие понятия о гироскопах, их классификация и применение. Механические гироскопы, свойства трехстепенного роторного гироскопа. Создание проекта "Гироскоп Фуко" средствами OpenGL и начальная настройка среды разработки. Инициализация объекта вывода и Glut.


посмотреть текст работы


скачать работу можно здесь


полная информация о работе


весь список подобных работ


Нужна помощь с учёбой? Наши эксперты готовы помочь!
Нажимая на кнопку, вы соглашаетесь с
политикой обработки персональных данных

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«Московский государственный текстильный университет
Кафедра информационных технологий и систем автоматизированного проектирования
по дисциплине «Геометрическое моделирование САПР»
Выполнил: Ворожбитов А.П. гр. 45т-10
1.4 Свойства трехстепенного роторного гироскопа
4.1 Создание проекта и начальная настройка среды разработки
4.2 Начальная настройка формы проекта
4.3 Инициализация объекта вывода и Glut
4.4 Общие составляющие функции визуализации
4.6 Описание модели средствами OpenGL
Гироскоп -- устройство, способное реагировать на изменение углов ориентации тела, на котором оно установлено, относительно инерциального пространства. Простейший пример гироскопа -- юла (волчок).
Термин впервые введен Жаном (Бернаром Леоном) Фуко в его докладе в 1852 году Французской Академии Наук. Доклад был посвящён способам экспериментального обнаружения вращения Земли в инерциальном пространстве. Этим и обусловлено название «гироскоп» (от др.-греч. г?спт «круг» и укпрЭщ «смотрю»).
До изобретения гироскопа человечество использовало различные методы определения направления в пространстве. Издревле люди ориентировались визуально по удалённым предметам, в частности, по Солнцу. Уже в древности появились первые приборы: отвес и уровень, основанные на гравитации. В средние века в Китае был изобретён компас, использующий магнетизм Земли. В Европе были созданы астролябия и другие приборы, основанные на положении звёзд.
Гироскоп изобрёл Иоганн Боненбергер и опубликовал описание своего изобретения в 1817 году. Однако французский математик Пуассон ещё в 1813 году упоминает Боненбергера как изобретателя этого устройства. Главной частью гироскопа Боненбергера был вращающийся массивный шар в кардановом подвесе. В 1832 году американец Уолтер Р. Джонсон придумал гироскоп с вращающимся диском. Французский учёный Лаплас рекомендовал это устройство в учебных целях. В 1852 году французский учёный Фуко усовершенствовал гироскоп и впервые использовал его как прибор, показывающий изменение направления (в данном случае -- Земли), через год после изобретения маятника Фуко, тоже основанного на сохранении вращательного момента. Именно Фуко придумал название «гироскоп». Фуко, как и Боненбергер, использовал карданов подвес. Не позже 1853 года Фессель изобрёл другой вариант подвески гироскопа.
Преимуществом гироскопа перед более древними приборами являлось то, что он правильно работал в сложных условиях (плохая видимость, тряска, электромагнитные помехи). Однако вращение гироскопа быстро замедлялось из-за трения.
Во второй половине XIX века было предложено использовать электродвигатель для разгона и поддержания вращения гироскопа. Впервые на практике гироскоп был применён в 1880-х годах инженером Обри для стабилизации курса торпеды. В XX веке гироскопы стали использоваться в самолётах, ракетах и подводных лодках вместо компаса или совместно с ним.
Основные типы гироскопов по количеству степеней свободы:
Основные два типа гироскопов по принципу действия:
Среди механических гироскопов выделяется роторный гироскоп -- быстро вращающееся твёрдое тело (ротор), ось вращения которого может свободно изменять ориентацию в пространстве. При этом скорость вращения гироскопа значительно превышает скорость поворота оси его вращения. Основное свойство такого гироскопа -- способность сохранять в пространстве неизменное направление оси вращения при отсутствии воздействия на него моментов внешних сил и эффективно сопротивляться действию внешних моментов сил. Это свойство в значительной степени определяется величиной угловой скорости собственного вращения гироскопа.
Впервые это свойство использовал Фуко в 1852 г. для экспериментальной демонстрации вращения Земли. Именно благодаря этой демонстрации гироскоп и получил своё название от греческих слов «вращение», «наблюдаю».
1.4 Свойства трехстепенного роторного гироскопа
При воздействии момента внешней силы вокруг оси, перпендикулярной оси вращения ротора, гироскоп начинает поворачиваться вокруг оси прецессии, которая перпендикулярна моменту внешних сил.
Это свойство обусловлено возникновением так называемой кориолисовой силы. Так, при воздействии момента внешней силы гироскоп поначалу будет вращаться именно в направлении действия внешнего момента (нутационный бросок). Каждая частица гироскопа будет таким образом двигаться с переносной угловой скоростью вращения вследствие действия этого момента. Но ротор гироскопа, помимо этого, и сам вращается, поэтому каждая частица будет иметь относительную скорость. В результате возникает кориолисова сила, которая заставляет гироскоп двигаться в перпендикулярном приложенному моменту направлении, то есть прецессировать. Прецессия вызовет кориолисову силу, момент которой скомпенсирует момент внешней силы (гироскопический момент).
Гироскопический эффект вращающихся тел есть проявление коренного свойства материи -- её инерционности.
Свойства гироскопа используются в приборах -- гироскопах, основной частью которых является быстро вращающийся ротор, который имеет несколько степеней свободы (осей возможного вращения).
Чаще всего используются гироскопы, помещённые в карданов подвес. Такие гироскопы имеют 3 степени свободы, то есть он может совершать 3 независимых поворота вокруг осей АА', BB' и CC', пересекающихся в центре подвеса О, который остаётся по отношению к основанию A неподвижным.
Гироскопы, у которых центр масс совпадает с центром подвеса O, называются астатическими, в противном случае -- статическими гироскопами.
Для обеспечения вращения ротора гироскопа с высокой скоростью применяются специальные гиромоторы.
Для управления гироскопом и снятия с него информации используются датчики угла и датчики момента.
Гироскопы используются в виде компонентов как в системах навигации (авиагоризонт, гирокомпас, ИНС и т. п.), так и в системах ориентации и стабилизации космических аппаратов.
При использовании в гировертикали показания гироскопа должны корректироваться акселерометром (маятником), так как из за суточного вращения земли и ухода гироскопа, происходит отклонение от истиной вертикали. Кроме того, в механических гироскопах может использоваться смещение его центра масс, которое эквивалентно непосредственному воздействию маятника на гироскоп.
Задачей данной курсовой работы стоит разработка интерактивной геометрической модели трехстепенного механического роторного гироскопа Фуко, функционирующего идеализированно.
Для выполнения поставленной задачи в качестве средств разработки были выбраны SharpDevelop 3.0 и TaoFramework 2.1.0.
Данный выбор обусловлен тем, что эти продукты бесплатны, находятся в свободном доступе, достаточно популярны и для своего применения не требуют больших ресурсов ЭВМ.
Tao Framework -- это библиотека, предоставляющая разработчикам.NET и Mono доступ к возможностям популярных библиотек вроде OpenGL и SDL. В ее состав входят:
На данный момент в Windows существует два стандарта для работы с трёхмерной графикой: OpenGL, являющийся стандартом де-факто для всех графических рабочих станций, и Direct3D - стандарт, предложенный фирмой Microsoft. Далее будет рассмотрен только стандарт OpenGL
Существенным достоинством OpenGL является его широкая распространенность - он является стандартом в мире графических рабочих станций типа Sun, Silicon Graphics и др. В основу стандарта была положена библиотека IRIS GL, разработанная фирмой Silicon Graphics Inc.
OpenGL представляет собой программный интерфейс к графическому оборудованию (хотя существуют и чисто программные реализации OpenGL). Интерфейс насчитывает около 120 различных команд, которые программист использует для задания объектов и операций над ними (необходимых для написания интерактивных трёхмерны приложений).
OpenGL был разработан как эффективный, аппаратно-независимый интерфейс, пригодный для реализации на различных аппаратных платформах. Поэтому OpenGL не включает в себя никаких специальных команд для работы с окнами или ввода информации от пользователя.
1. Создавать объекты из геометрических примитивов (точки, линии, грани и битовые изображения).
2. Располагать объекты в трёхмерном пространстве и выбирать способ и параметры проецирования.
3. Вычислять цвет всех объектов. Цвет может быть как явно задан, так и вычисляться с учётом источников света, параметров освещения, текстур.
4. Переводить математическое описание объектов и связанной с ними информации о цвете в изображение на экране.
При этом OpenGL может осуществлять дополнительные операции, такие, как удаление невидимых фрагментов изображения.
Команды OpenGL реализованы как модель клиент-сервер. Приложение выступает в роли клиента - оно вырабатывает команды, а сервер OpenGL интерпретирует и выполняет их. Сам сервер может находиться как на том же компьютере, на котором находится и клиент, так и на другом.
Основным используемым компонентом, помимо OpenGL, в данной работе является FreeGLUT.
OpenGL Utility Toolkit (GLUT) -- библиотека утилит для приложений под OpenGL, которая в основном отвечает за системный уровень операций ввода-вывода при работе с операционной системой. Из функций можно привести следующие: создание окна, управление окном, мониторинг за вводом с клавиатуры и событий мыши. Она также включает функции для рисования ряда геометрических примитивов: куб, сфера, чайник. GLUT даже включает возможность создания несложных всплывающих меню.
GLUT был создан Марком Килгардом (Mark Kilgard), во время его работы в Silicon Graphics Inc.
Использование библиотеки GLUT преследует две цели. Во-первых, это создание кроссплатформенного кода. Во-вторых, GLUT позволяет облегчить изучение OpenGL. Чтобы начать программировать под OpenGL, используя GLUT, требуется всего страница кода. Написание аналогичных вещей на API требует несколько страниц, написанных со знанием API управления окнами операционной системы.
SharpDevelop (сокращенно #Develop) свободная среда разработки для языков группы Microsoft NET(C#, F#, Visual Basic.NET, Boo). Предоставляет собой интегрированный отладчик, который использует собственные библиотеки и взаимодействует с исполняющей средой.NET через COM Interop.
· Подсветка синтаксиса для C#, IronPython, HTML, ASP, ASP.NET, VBScript, VB.NET, XML, XAML
· Визуальный редактор для форм WinForms (COM-компоненты не поддерживаются)
· Интегрированная поддержка NUnit, MbUnit и NCover
· Интегрированная поддержка анализатора сборок FxCop
· Конвертор кода между языками C#, VB.NET, IronPython и Boo
· Предпросмотр документации, полученной из документирующих комментариев
· Расширяемость внешними инструментами
· Расширяемость на основе механизма Add-Ins
· Для работы требуется Microsoft.NET Framework 3.5 + Service Pack 1
· Для работы в F# требуется установить дополнение
Разработанное с использованием данных средств приложение требует для запуска небольших вычислительных и графических мощностей.
Программный проект «Гироскоп Фуко» состоит из:
· библиотек формата dll Tao.OpenGL, Tao.FreeGlut, Tao.Platform.Windows
Проект оформлен в виде установочного файла сторонними средствами
(Smart Install Maker) для удобства установки. После установки опционально на рабочем столе создается ярлык для быстрого запуска приложения. По умолчанию проект устанавливается в системную папку Program Files.
4. Разработка программного проекта
4.1 Создание проекта и начальная настройка среды разработки
После установки среды разработки SharpDevelop и комплекта библиотек TaoFramework необходимо скопировать файлы из директории C:\Programm Files\TaoFramework\lib в директорию C:\Windows\System32.
Далее создается программный проект (Solution) в SharpDevelop, путем прохождения через цепочку основного меню File -> New -> Solution. После задания имени проекта, выбора типа необходимо подключить библиотеки и объявить их в разделе объявления заголовочных файлов.
Добавить библиотеки можно в меню Project -> Add Reference. После выбора библиотек, приведенных в разделе 3, их необходимо подключить. Подключение библиотек производится оператором using. Данные действия описаны в Листинге №1. (Так же далее в процессе описания будут представлены фрагменты программного кода, полный листинг будет представлен в приложении А).
Листинг 1. Подключение библиотек проекта
4.2 Начальная настройка формы проекта
Для отображения модели необходимо разместить элемент, с помощью которого библиотеки OpenGL смогли бы вывести изображение на рабочее пространство приложения (в данном случае форму). Для этого в библиотеке Tao.Platform.Windows существует визуальный компонент simpleOpenGLControl. Необходимо разместить его на форме и в панели свойств установить свойству Dock значение Fill, чтобы компонент занял все свободное пространство формы. Этим действием задается рабочее пространство отображения модели проектом.
В описываемом проекта данный компонент имеет имя AnT.
4.3 Инициализация объекта вывода и Glut
Для инициализации компонента отображения simpleOpenGLControl используется команда <имя компонента>.InitializeContexts(). Данная команда располагается в конструкторе класса формы, и инициализирует работу компонента непосредственно после запуска приложения.
После инициализации компонента вывода необходимо инициализировать сам Glut. Выполняется это командой glutInit(). Также нужно задать режим работы компонента вывода средствами библиотеки и цвет очистки окна.
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
Листинг 3. Инициализация Glut и начальная настройка вывода
В параметрах инициализации GLUT_RGB означает что используется режим цветов RGB(от Red, Green, Blue - красный, зеленый, синий; компонентность цвета), GLUT_DOUBLE означает использование двойной буферизации и GLUT_DEPTH использование буфера глубины (Z-буфер).
Команда glClearColor имеет 4 параметра: полнота компонентов цветности: красного, зеленого и синего и значение прозрачности, где 1 непрозрачность, а 0 полная прозрачность.
Инициализировав Glut, необходима инициализация освещения сцена, настройка его параметров, также тест глубины и установка обработки цвета при освещении.
float[] bluish = { 1f, 1f, 1f, 0.1f };
Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_DIFFUSE, bluish);
Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_SPECULAR, bluish);
Gl.glLightModeli(Gl.GL_LIGHT_MODEL_COLOR_CONTROL, Gl.GL_SEPARATE_SPECULAR_COLOR);
Листинг 4. Настройка освещения и тест глубины
Командой glEnable включается использование какого либо параметра. В данном случае использованы GL_DEPTH_TEST - тест глубины, GL_LIGHTING - использование источников света, GL_LIGHT1 - управление источником света под номером «1». Команда glLightfv осуществляет управление источником света, где GL_LIGHT1 - источник света, GL_DIFFUSE - параметр отвечающий за цвет источника света;GL_SPECULAR - за отраженный свет, третьим аргументом идет параметр, в данном случае массив с параметрами света под именем bluish. Цвет источника света и света отражения - белый. После необходима настройка модели освещения. Команда glLightModel отвечает за выбор модели освещения, где GL_LIGHT_MODEL_COLOR_CONTROL - режим вычисление зеркального цвета отдельно от фонового и диффузного, GL_SEPARATE_SPECULAR_COLOR - отвечает за наложение вторичного цвета, состоящего из суммы всех зеркальных вкладов всех источников света. Такая модель освещения обеспечит достаточную реалистичность.
4.4 Общие составляющие функции визуализации
Функции визуализации вызывается каждый раз при отрисовке кадра динамической сцены, средствами какой либо библиотек или среды разработки. В данном случае функция вызывается средствами среды, а конкретно объектом Timer.
· описания параметров вывода через визуальный компонент
Параметры вывода через визуальный компонент задают методы и способы вывода через компонент.
Gl.glViewport(0, 0, AnT.Width, AnT.Height);
Glu.gluPerspective(45, (float)AnT.Width / (float)AnT.Height, 0.1, 200);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Листинг 5. Настройка параметров вывода и перспективы
Команда glViewport выполняет инициализацию области вывода, параметры, заданные данной команде в листинге 5 показывают что вывод будет производиться на весь объект. Функция glMatrixMode предназначена для того, чтобы задавать матричный режим: будет определена матрица, над которой в дальнейшем будут производиться операции. В данном случае это GL_PROJECTION - матрица проекций. Следующим действием очищается матрица, с помощью функции glLoadIdentity (функция заменяет текущую матрицу на единичную). Далее в листинге устанавливается тип текущей проекции с помощью функции gluPerspective. Функция gluPerspective определена в библиотеке GLU - OpenGL Utility Library (GLU). Эта библиотека является надстройкой над библиотекой OpenGL, реализующей ряд более продвинутых функций. Она так же является свободно-распространяемой и поставляется вместе с библиотекой OpenGL. Данная функция строит пирамиду охвата видимости, основываясь на угле визуального охвата, отношении сторон порта просмотра и установке ближней и дальней плоскости просмотра.
Рисунок 1. Схема обработки перспективы OpenGL
После определения проекции устанавливается объектно-видовая матрица GL_MODELVIEW и также очищается функцией glLoadIdentity. Когда вызывается функция вывода, первым делом производиться очистка окна (т.к. до этого уже мог быть реализован вывод предыдущего кадра - очистка экрана перед визуализацией кадра - это стандартный метод). Для этого используется функция glClear. В качестве параметра, функция получает значения каких буферов ей необходимо очистить - в листинге 5 это буфер цвета и буфер глубины.
Модель трехстепенного механического роторного гироскопа Фуко состоит из:
· неподвижной рамы относительно ротора
· двух подвижных рам относительно ротора в разных направлениях
Для наглядности в интерактивной модели добавлены:
Балансиры добавлены для наглядности вращения ротора, утяжелитель для указания изначальной позиции гироскопа, плоскости крепления.
4.6 Описание модели средствами OpenGL
В данной модели одни объекты зависят от других. Таким первым описать необходимо описать те объекты, которые не зависят от других объектов. Такими объектами являются внутренняя рама и ротор.
Функция glutSolidTorus из библиотеки GLUT осуществляет рисование тора (кольцо с круговым сечением). Здесь первый параметр - радиус сечения тора, второй - радиус самого тора, третий и четвертый параметр - количество разбиений по отдельному радиальному сектору и тору соответственно. Разбиения - точность отрисовки негладких кривых на экране, так как пикселями не возможно изобразить идеально гладкую кривую.
Чтобы модель отражала свет, а не поглощала, а также вела себя реалистичнее со светом необходимо придать ей свойства материала. Это означает что ей необходимо задать параметры отражения и рассеивания света.
float[] color = new float[4]{ 0.8f, 0.7f, 0f, 1};
float[] shininess = new float[1]{ 30 };
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, color);
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, color);
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, shininess);
Здесь режим GL_FRONT функции glMaterial означает что свойства материалов будут применены к передней грани. Режим GL_DIFFUSE означает рассеянный свет, режим GL_SPECULAR отраженный свет, а GL_SHININESS его степень. Третьим параметром выступают массивы значений. В данном примере ротор имеет золотое отражение.
Glut.glutSolidCylinder(0.8d,24d, 64, 64);
Glut.glutSolidCylinder(10d,1d, 64, 64);
Glut.glutSolidCylinder(1d,1d, 64, 64);
Gl.glTranslated(-18,0,0); //перенос
Glut.glutSolidCylinder(1d,1d, 64, 64);
Осью ротора является цилиндр. Функция glutSolidCylinder позволяет его изобразить. Функция имеет четыре параметра: радиус, длина, количество разбиений вдоль и вокруг оси цилиндра. Так как из-за особенностей библиотеки Glut цилиндр по умолчанию расположен в пространстве не вертикально, а горизонтально, одним из оснований в начале координат, и осью на оси Z, его необходимо переместить и повернуть. Осуществляются эти действия функциями glRotate и glTranslate. Функция glTranslate принимает 3 аргумента и перемещает начало координат в точку с координатами x, y, z соответственно параметрам. Функция glRotate принимает 4 параметра, в которых указывается на какой угол, и относительно каких осей будет произведен поворот. В листинге 8 были выполнены поворот по оси x на 90 градусов и перенос по оси z на 12.
При построении сложной модели необходимо ориентироваться относительно какой точки осуществляется перенос. После выполнения определенных построений в какой либо точке после переноса автоматического возврата в предыдущую позицию не осуществляется.
Так как ротор является вращающейся частью все построения ведутся относительно центра ротора (центра его оси и центра диска). Следовательно, после каких либо переносов, необходимо возвращаться в вышеуказанную позицию.
Для равномерного вращения необходимо разместить функцию поворота перед началом описания вращающегося объекта, задав в качестве угла поворота переменную, и линейно ее увеличивать на определенную величину, от которой будет зависеть скорость вращения объекта. Удобнее всего к данной переменной добавлять величину при каждой отрисовке сцены.
Но так как после описания элемента вращения могут описываться другие элементы, не вращающиеся вместе с вышеописанным объектом, необходимо после описания объекта разместить аналогичную функцию поворота с переменной, противоположной переменной вращения. Так как общая сумма вращения будет равна 0, объекты, описанные ниже останутся неподвижны.
Описание внешней рамы от средней принципиально отличается только наличием утяжелителя.
Glut.glutSolidCylinder(0.5d,2d, 64, 64);
Glut.glutSolidCylinder(0.5d,2d, 64, 64);
Glut.glutSolidCylinder(6d,3d,64,64);
Особого внимания при описании требует положение рамы и осей ее закрепления. Для обеспечения целостности модели и отсутствия артефактов, как и в случае с ротором, оси должны входить в два соседние объекта. Рама должна быть расположена перпендикулярно предыдущей, оси закрепления также должны быть перпендикулярны осям предыдущей рамы.
Так как эти рамы будут управляться пользователем, необходимо указать функции вращения с переменными, через которые модель будет менять положения рам в зависимости от действий пользователя.
Оси в гироскопе расположены таким образом, что вращая среднюю раму происходит вращение двух рам сразу - средней и внешней. Следовательно средняя рама должна быть описана раньше чем внешняя, и изменяя положение средней рамы только по одной оси, внешняя рама будет изменять положение сразу по двум.
Также, для обеспечения рассмотрения сцены с разных ракурсов и расстояний необходимо добавить для сцены целиком (то есть перед описанием всех элементов) функции вращения и переноса с переменными (листинг 10).
Листинг 10. Функции управления камерой
Выполнив необходимые описания, необходимо обозначить окончание отрисовки функцией glFlush вызвать перерисовку компонента вывода методом Invalidate().
Имея модель нужно иметь средства интерактивно ею управлять. Рассматривая примеры управления различными моделями в пространстве, наиболее удобным является управление при помощи мыши. Мышью можно сообщить любое линейное движение на плоскости, и быстро изменить направление и откорректировать ошибочное перемещение в случае неверных действий. Клавиатура, в отличии от мыши такими возможностями не обладает, так как сложно интерпретировать сложное перемещение нажатием немногих клавиш, в отличие от задания траектории непосредственно рукой. Поэтому для реализации управления моделью рациональным выбором является управление мышью.
Однако, и здесь не обойтись без трудностей. Описанная модель имеет как минимум два полюса управления (камера и оси), модели не двухмерные, а трехмерные. Следовательно, для реализации управления необходим алгоритм, в соответствии с которым будет осуществляться управление.
Управление необходимо разделить на две основные части, это:
Вполне логично предположение, что одновременно эти два компонента мышью управляться не могут. Следовательно необходимо их разделить, в один момент времени должно осуществляться управление только одним компонентом. Также необходимо рассматривать модель с разного расстояния, иметь возможность менять чувствительность мыши. Так же завершение работы с моделью должно быть возможным.
Управление поворотом рам гироскопа, а также и камерой, удобно осуществлять при нажатой клавиши мыши и последующим перемещением мыши. Алгоритм, дающий такую возможность, реализуется так: запоминается положение курсора во время нажатия клавиши, с минимальной задержкой происходят итерации цикла отслеживания координат (в начале каждой итерации курсор смещается в запомненное положение), при смещении мыши в каком либо направлении передаются значения в функцию-обработчик, которая даст результаты для функций, осуществляющих управление моделью, курсор при этом скрывается; при отпускании клавиши цикл прекращает свою работу и курсор появляется вновь.
Данный алгоритм использует средства среды, такие как обработчики событий нажатия, перемещения и отпускания кнопки, а также таймер. Для вычисления углов смещения используется класс расчета.
class coord{private int xpos, ypos, xpos_n, ypos_n; float mdx,mdy;
public void set_coord(int xx,int yy){xpos=xx;ypos=yy;}
public void set_coordn(int xn,int yn){xpos_n=xn;ypos_n=yn;}
public float mx(){mdx=0.01f*(xpos_n-xpos);return mdx;}
public float my(){mdy=0.01f*(ypos_n-ypos);return mdy;}
Листинг 11. Класс расчета углов поворота
В листинге 11 приведен такой класс. В данном классе из считанных координат во время смещения вычитаются исходные координаты, соответственное если число положительное узел поворачивается в одну сторону, если же отрицательное то в противоположную. Также получившееся выражение необходимо умножить на коэффициент, зависящий от того, как быстро у вас происходят итерации считывания мыши. В итоге мы получаем значения углов, на которое необходимо повернуть какой либо узел.
Действия, происходящие при обработке нажатия клавиши мыши можно увидеть в листинге 12.
void AnTMouseDown(object sender, MouseEventArgs e)
if (e.Button == MouseButtons.Left) { Cursor.Hide();}
if (e.Button == MouseButtons.Left){
if(raxis==false){cord.set_coord(Cursor.Position.X,Cursor.Position.Y);click=true;}
if(raxis==true) {cord_n.set_coord(Cursor.Position.X,Cursor.Position.Y);click=true; }}
if (e.Button==MouseButtons.Right) {ConMenu.Show(Cursor.Position.X, Cursor.Position.Y);}
При нажатии на мышь определяется какая кнопка была нажата. Если это левая кнопка, то скрывается курсор, задаются начальные координаты, и переменной присваивается значение «истина», означающее удержание кнопки. Также в кнопке определяется каким объектом ведется управление, и соответственно значения начальных координат сообщаются в разных случаях разным экземплярам класса. Нажатием правой кнопку вызовется контекстное меню с опциями управления, которое будет описано позже.
Нажав левую кнопку и задав начальные координаты необходимо обработать перемещение.
void AnTMouseMove(object sender, MouseEventArgs e)
if(click==true) {if (raxis == false){cord.set_coordn(Cursor.Position.X,Cursor.Position.Y);
if (raxis == true) {cord_n.set_coordn(Cursor.Position.X,Cursor.Position.Y);
Листинг 13. Обработчик движения мыши
В первую очередь проверяется условие, нажата ли левая кнопка мыши. Далее проверяется, каким объектом производится управление. После этого считываются координаты и передаются как новые в класс расчета углов. Полученные значения из класса прибавляются к переменным, отвечающим за поворот узлов. Также значения углов умножаются на параметр чувствительности, влияющий на скорость смещения узлов модели в зависимости от перемещения мыши.
При отпускании клавиши происходит смена значения переменной на «ложь», означающей отпускание кнопки, и возврат курсора к отображению (листинг 14).
void AnTMouseUp(object sender, MouseEventArgs e)
if (e.Button == MouseButtons.Left) {Cursor.Show();}}
Листинг 14. Обработчик отпускание клавиши
В то время, когда клавиша мыши нажата, необходимо перемещать на каждой итерации указатель мыши. Это условие необходимо добавить в обработчик таймера (листинг 15).
void Timer1Tick(object sender, EventArgs e)
if(click==true) {Cursor.Position = new Point(x,y);}
В обработчик таймера также добавлена функция визуализации (функция Draw() в листинге 15). Также необходимо задать начальные параметры удаленности камеры, чувствительности мыши, углов поворота, выбранного объекта управления.
Листинг 16. Задание начальных значений параметров управления
Как упоминалось ранее, управление параметрами осуществляется через контекстное меню. Для его создания необходимо на форму поместить компонент контекстного меню ContextMenuStrip, после чего создать пункты контекстного меню, кликнув по элементу.
Рисунок 2. Редактирование пунктов контекстного меню
Далее необходимо каждому пункту присвоить значения по умолчанию (отмечен или нет).
При клике на определенном пункте меню вызывается обработчик, в котором необходимо описать переключение режима управления на выбранный.
void AxisToolStripMenuItemClick(object sender, EventArgs e)
cameraToolStripMenuItem.Checked = false;
axisToolStripMenuItem.Checked = true;
Листинг 17. Переключение режима управления объектом на выбранный
В листинге 17 происходит изменение значения переменной управления, отмечается текущий пункт контекстного меню, предыдущий пункт становится не отмеченным.
В пункте меню выход размещается процедура выхода из приложения.
В результате выполнения курсовой работы было разработан программный проект, реализующий интерактивную трехмерную модель идеализированного трехстепенного механического роторного гироскопа Фуко.
Модель обладает интуитивно понятным интерфейсом и интерактивным управлением. При разработке студент совершенствовал свои навыки геометрического моделирования, усвоил основные методы и функции библиотек OpenGL, развил навыки программирования в среде программирования C#.
Программный проект способен демонстриров
Построения гироскопа Фуко средствами OpenGL курсовая работа. Программирование, компьютеры и кибернетика.
Реферат по теме Визитная карточка
Смарт Образование Реферат
Взаимосвязь Оплаты Труда И Его Производительности Реферат
Как Писать Введение Дипломную
Идеальный Человек Итоговое Сочинение
Реферат: Методы стимулирования персонала и покупателей
Контрольная работа по теме Система управления маркетингом
Контрольная работа по теме Экономічний аналіз підприємства
Рецензия По Магистерской Диссертации Юриспруденция Образец
Курсовая работа по теме Революція Горбачова в СРСР
Курсовая Работа На Тему Излишки Потребителя И Производителя, Эластичность
Курсовая работа по теме Заключение и показания эксперта
Курсовая работа: Розрахунок та технічні характеристики електромагнітного реле
Курсовая работа по теме Методы и методики исследования социально-психологического климата в коллективе
Отчет по практике по теме Стратегическое управление на примере предприятия ООО "Сысертский Хлебокомбинат"
Эссе Дар Бораи Эхтиет Аз Коронавирус
Проблемы современного развития экономики
Контрольная работа по теме Поняття бренду, товарної марки, брендінгу і бренд-менеджменту
Судебно медицинская травматология
Дипломная работа: Виртуальные миры в творчестве Терри Гудкайнда. Скачать бесплатно и без регистрации
Планирование потенциала предприятия - Менеджмент и трудовые отношения реферат
Життєвий цикл товару та маркетингова діяльність фірми - Маркетинг, реклама и торговля контрольная работа
Совершенствование организационной структуры управления ООО "Галион" - Менеджмент и трудовые отношения курсовая работа


Report Page