Шестеренки в Open GL

Автор работы: Пользователь скрыл имя, 05 Февраля 2015 в 17:04, курсовая работа

Краткое описание

Библиотека OpenGLпредставляет из себя интерфейс программирования трехмерной графики. Единицей информации является вершины, из них состоят более сложные объекты. Программист создает вершины, указывает, как их соединять (линиями или многоугольниками), устанавливает координаты и параметры камеры и ламп, а библиотека OpenGL берет на себя работу создания изображения на экране. OpenGL идеально подходит для программистов, которым необходимо создать небольшую трехмерную сцену

Вложенные файлы: 1 файл

Курсач шестерни.docx

— 109.86 Кб (Скачать файл)

Министерство образования и науки Российской Федерации 
Рубцовский индустриальный институт (филиал) 
ФГБОУ ВПО «Алтайский государственный технический 
университет им. И.И. Ползунова»

Кафедра “Прикладная математика”

 

 

 

 

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА КУРСОВОЙ РАБОТЫ

По инженерной и компьютерной графике

Шестеренки

тема работы

 

 

Руководитель работы E.А.Дудник

подпись дата инициалы, фамилия

Работу выполнил

студент гр.ИВТ-21  Л.В.Воробьёв

подпись дата инициалы, фамилия

Работа защищена с оценкой 

Члены комиссии 

подпись дата инициалы, фамилия

 

Рубцовск, 2014 
Рубцовский индустриальный институт

Кафедра “Прикладная математика”

 

Студент Воробьёв Леонид Васильевич Группа ИВТ-21  Курс 3 

Тема Шестеренки 

 

  1. Исходные данные для выполнения работы

 

 

  1. Содержание пояснительной записки

стр.3 

  1. Перечень графического материала

Нет 

 

  1. Контрольные точки выполнения курсовой работы:

 

 

 

 

 

 

 

 

 

 

 

 

 

Руководитель работы E.А.Дудник

подпись дата инициалы, фамилия 
ОГЛАВЛЕНИЕ

 

 

 

 

Техническое задание

 

Написать программу  «Шестеренки» с использованием графической библиотеки OpenGl, реализовать алгоритм кручения механизма, реализовать поворот камеры.

  1. ВВЕДЕНИЕ

  1. Библиотека OpenGLпредставляет из себя интерфейс программирования трехмерной графики. Единицей информации является вершины, из них состоят более сложные объекты. Программист создает вершины, указывает, как их соединять (линиями или многоугольниками), устанавливает координаты и параметры камеры и ламп, а библиотека OpenGL берет на себя работу создания изображения на экране. OpenGL идеально подходит для программистов, которым необходимо создать небольшую трехмерную сцену . Для профессионалов, занимающихся программированием трехмерной графики, библиотека тоже будет полезной, т.к. она представляет основные механизмы и выполняет определенную автоматизацию.  
    Конструкторская часть

    1. Входные данные

Обозначение в программе

Предназначение

tGear=class;

Класс для хранения параметров шестеренки

x,y:real;

Координаты угла поворота камеры

Radius:real;

Радиус шестеренки

Color1:real;

Цвет RGB-red(Красный)

Color2:real;

Цвет RGB-green(Зеленый)

Color3:real;

Цвет RGB-blue(Голубой)

Angle:real;

Текущий угол поворота

Speed:real;

Скорость вращения шестеренки

Mouse:integer;

Тип нажатой кнопки мыши

Spisok:tlist;

Список шестеренок

x1, y1:real;

Координаты курсора

Tt:tGear;

Выбранная шестерня

rg:Boolean;

Режим расстановки или осмотра

Procedure init;

Инициализация графики

Procedure reinit;

Деинициализация графики


 

 

 

 

  1. Руководство пользователя

    1. Назначение и условия применения

Программа «Шестеренка» предназначена для реализации создания и кручения шестеренок, управления камерой, а также для ознакомления пользователя с графической библиотекой OpenGl.

Для работы программы необходимо наличие персонального компьютера (ПК), программы «Project1.exe».

Программа осуществляет свою работу в графическом режиме, создавая изображение на экране с разрешением 1024•768 пикселов (если это позволяет дисплей).

    1. Описание операций

После запуска программы на терминал выводится окно программы, где видно поле для создания шестеренок. Добавление новой шестеренки происходит по двойному нажатию ЛКМ, увеличение/уменьшение шестеренок осуществляется при зажатом ПКМ. Переход в режим трёхмерной графики осуществляется по нажатию клавиши «пробел». Перемещение камеры осуществляется в режиме трёхмерной графики путем перемещения курсора. В режиме трёхмерной графики также возможно создание, масштабирование и перемещение шестеренок.

 

    1. Действия при аварийных ситуациях

Если программа при работе “зависла” или выдала сведения об ошибке, то следует обратиться к разработчику программы.

 

  1. Руководство системного программиста

    1. Общие сведения

Минимальные системные требования:

  • процессор Intel® Pentium® или совместимый с частотой не менее 1,6 ГГц (рекомендуется 2 ГГц и выше);
  • 1 ГБ оперативной памяти (рекомендуется 2 ГБ и более);
  • около 30 мб свободного места на жестком диске
  • базовый графический процессор любого поставщика, класса DirectX 9.0 или выше (PixelShader 2.0);
  • монитор с разрешением 1024×768 или выше;
  • мышь или другое указывающее устройство;
  • принтер;
  • ОС Microsoft® WindowsXP (32/64 разрядная) и выше;

Среда разработки Delphi 7

Программа написана на объектно-ориентированном языке ObjectPascal

    1. Состав программы «Project1.exe»

    1. Модули программы:

Unit1.pas – главный модуль программы, в нем содержится описание всех модулей программы.

procedureTForm1.FormCreate(Sender: TObject); - процедура для обработки событий при создании формы

procedure TForm1.FormDestroy(Sender: TObject); - процедура для обработки событий при закрытии формы

procedure TForm1.Panel1Resize(Sender: TObject); - процедура для обработки событий при «растягивании» формы

procedure TForm1.Timer1Timer(Sender: TObject); - процедура для задачи вращения и передачи вращения другим шестеренкам

procedure DrawGear(g: tgear);-процедура рисования и перетаскивания шестеренок

procedure TForm1.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);-процедура описывающая время когда программа свободна(не выполняются действия)

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);-процедура обработки нажатия кнопки мыши

procedure TForm1.Panel1DblClick(Sender: TObject);-процедура добавления шестеренки при двойном клике ЛКМ

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);-процедура обработки движения мыши

procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);-процедура обнуления координат указателя при отжатии кнопок мыши

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);-процедура обработки нажатий клавиш

procedure PixelFormat(hdc: HDC);-процедура задания формата пикселей

procedure TForm1.init;-процедура инициализации графики

procedure TForm1.reinit;-процедура деинициализации графики

 

    1. Настройка программы

Программа не требует настройки. Достаточно запустить файл «Project1.exe», или используя среду Delphi 7 скомпилировать файл «Project1.dproj»

    1. Проверка программы

Если программа «Project1.exe»не выдает сообщений об ошибке, значит программа работает правильно

    1. Сообщения системному программисту

Не предусмотрено

 

 

 

 

  1. Эксперементальная часть

    1. Результаты работы программы

      1. Окно программы

      1. Создание шестеренки и её вращение

      1. Переход в режим трехмерной графики

 

  1. Приложения

    1. Листинг программы

 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, ExtCtrls, OpenGl, StdCtrls, Grids, ScktComp, Math,

  ComCtrls, Sockets;

 

type

  tGear = class   // класс для хранения параметров шестеренки

    x, y: real;   // позиция

    radius: real; // радиус

    color1: real;  // цвет  RGB  red

    color2: real;           //   green

    color3: real;           //   blue

    angle: real;  // текущий угол поворота

    speed: real;  // скорость

  end;

 

  TForm1 = class(TForm)

    Panel1: TPanel;

    Timer1: TTimer;

    procedure FormCreate(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    procedure Panel1Resize(Sender: TObject);

    procedure Timer1Timer(Sender: TObject);

    procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);

    procedure Panel1DblClick(Sender: TObject);

    procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

    procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

    procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

  public

    DC: HDC;

    hrc: HGLRC;

 

    spisok: tlist; // список шестеренок

    x1, y1: real;  // координаты курсора

    mouse: integer; // тип нажатой кнопки мыши

    tt: tGear;       // выбранная шестерня

 

    rg: boolean;   // режим расстановки или осмотра

    procedure init;  // иницилизация графики

    procedure reinit;  // деиницилизация графики

  end;

 

var

  Form1: TForm1;

  //массивы для иницилизации освещения

  pos1: array[0..3] of glfloat = (2, 2, 2, 0);

  dif: array[0..3] of glfloat = (0.5, 0.5, 0.5, 1);

  amb: array[0..3] of glfloat = (0.1, 0.1, 0.1, 1);

 

implementation

 

{$R *.dfm}

//возвращает расстояние между  точками

function Dist2D(x4, y4, x5, y5: real): Real;

begin

  Result := Sqrt(sqr(x4 - x5) + sqr(y4 - y5));

end;

 

//установка начальных значений  при создании формы

procedure TForm1.FormCreate(Sender: TObject);

begin

  Application.OnIdle := ApplicationEventsIdle;  //если приложение свободно то выполнять процедуру ApplicationEventsIdle

  mouse := 0;                             // мышь отжата

  spisok := tlist.Create;  // создаем пустой список шестеренок

  init;              // иницилизируем OpenGL

  randomize;    // чтоб случайные числа неповторялись

end;

 

//выполняется при закрытии программы

procedure TForm1.FormDestroy(Sender: TObject);

var i:integer;

begin

  reinit; // деиницилизируем графический режим

  for i:=0 to spisok.Count-1 do tGear(spisok.Items[i]).Free;  //удаляем шестеренки

  spisok.Free; //удаляем список

end;

 

//при растягивании формы

procedure TForm1.Panel1Resize(Sender: TObject);

begin

//изменяем диапазон рисования

  glViewPort(0, 0, panel1.ClientWidth, panel1.ClientHeight);

end;

 

//событие на таймере, каждые 30 мс

//передача  вращения на другие шестерни

procedure TForm1.Timer1Timer(Sender: TObject);

var i, j, k: integer;

begin

//  сначала всем шестерням  кроме первой(у нее номер в списке=0) обнуляем скорость

  for i := 1 to spisok.Count - 1 do tGear(spisok.Items[i]).speed := 0;

 

 

// потом проходим в цикле для  каждой i-той шестерни по всем  шестерням(j), столько раз (k) сколько всего шестерней

  for k := 0 to spisok.Count - 1 do

 

    for i := 0 to spisok.Count - 1 do

      if tGear(spisok.Items[i]).speed <> 0 then  // если скорость <> нулю ..

        for j := 0 to spisok.Count - 1 do   // то ищем кому ее можно передать

          if j <> i then      // и это не та же шестерня ...

            if Dist2D(tGear(spisok.Items[j]).x, tGear(spisok.Items[j]).y, //и дистанция между шестернями меньше суммы их радиусов..

                      tGear(spisok.Items[i]).x, tGear(spisok.Items[i]).y)

              < (tGear(spisok.Items[j]).radius + tGear(spisok.Items[i]).radius + 0.06) then

              if tGear(spisok.Items[j]).speed = 0 then // ..и скорость = нулю

                tGear(spisok.Items[j]).speed := -tGear(spisok.Items[i]).speed *

                  ((tGear(spisok.Items[i]).radius) / (tGear(spisok.Items[j]).radius));  // ... то устанавливаем скорость пропорционально размерам , и в обратную сторону

 

  for i := 0 to spisok.Count - 1 do  //увеличиваем текущее положение, крутим шестерни

    tGear(spisok.Items[i]).angle := tGear(spisok.Items[i]).angle + tGear(spisok.Items[i]).speed;

end;

 

//рисование

procedure DrawGear(g: tgear);

var quad: gluquadricobj;

  I, n: INTEGER;

  h : real;

begin

  glLoadIdentity;

 

  if form1.rg then   // если режим осмотра то..

  begin

    glrotate(form1.y1 * 100, 1, 0, 0); // устанавливаем поворот

    glrotate(-form1.x1 * 100, 0, 1, 0);

  end else

    glrotate(4, 1, 0, 0); // иначе чуть чуть развлрачиваем чтоб была видна трехмерность

 

  quad := glunewquadric;

  glcolor3f(g.color1, g.color2, g.color3);

  gluquadricdrawstyle(quad, GLU_FILL);

  gluQuadricNormals(quad, GLU_SMOOTH);

  glEnable(GL_COLOR_MATERIAL);

 

  //рисуем цилиндрами и дисками, квадратичными обьектами

  glTranslatef(g.x, g.y, 0);

  glRotate(g.angle, 0, 0, 1);

  h := 0.1;

  gluCylinder(quad, 0.015, 0.015, h, 30, 30);

  gluCylinder(quad, g.radius * 0.2, g.radius * 0.2, h, 30, 30);

  gluCylinder(quad, g.radius * 0.9, g.radius * 0.9, h, 30, 30);

  gluCylinder(quad, g.radius * 1.0, g.radius * 1.0, h, 30, 30);

 

  gludisk(quad, 0.015, g.radius * 0.2, 60, 60);

  gludisk(quad, g.radius * 0.9, g.radius * 1.0, 60, 60);

 

  glTranslatef(0, 0, h * 0.3);

  gludisk(quad, g.radius * 0.2, g.radius * 0.9, 60, 60);

  glTranslatef(0, 0, -h * 0.3);

 

  n := round(g.radius * 180);//считаем кол-во зубчиков

  //в цикле рисуем зубчики

  for i := 1 to n do

  begin

    glPushMatrix;

    glRotate(i * (360 / n), 0, 0, 1);

 

    GLbegin(gl_quads);

    glNormal3f(0, 0, -1);

    GLvertex3f(g.radius, 0.007, 0);

    GLvertex3f(g.radius + 0.03, 0.007, 0);

    GLvertex3f(g.radius + 0.03, -0.007, 0);

    GLvertex3f(g.radius, -0.007, 0);

 

    glNormal3f(0, -1, 0);

    GLvertex3f(g.radius + 0.03, 0.007, 0);

    GLvertex3f(g.radius + 0.03, -0.007, 0);

    GLvertex3f(g.radius + 0.03, -0.007, h);

    GLvertex3f(g.radius + 0.03, 0.007, h);

 

    glNormal3f(-1, 0, 0);

    GLvertex3f(g.radius + 0.03, -0.007, 0);

    GLvertex3f(g.radius, -0.007, 0);

    GLvertex3f(g.radius, -0.007, h);

    GLvertex3f(g.radius + 0.03, -0.007, h);

 

    glNormal3f(1, 0, 0);

    GLvertex3f(g.radius + 0.03, 0.007, 0);

    GLvertex3f(g.radius, 0.007, 0);

    GLvertex3f(g.radius, 0.007, h);

    GLvertex3f(g.radius + 0.03, 0.007, h);

 

    GLend;

 

    glPopMatrix;

  end;

 

  gludeletequadric(quad);

end;

 

//процедура будет выполняться когда программа свободна

procedure TForm1.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);

var I: INTEGER;

begin

  glLoadIdentity;

  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glclearcolor(0.30, 0.30, 1.00, 0);

  for i := 0 to spisok.Count - 1 do  // в цикле отрисовываем шестеренки

    DrawGear(tGear(spisok.Items[i]));

  SwapBuffers(DC);

end;

 

//если нажимаем кнопку мыши

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

Информация о работе Шестеренки в Open GL