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

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

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

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

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

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

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

var i: integer;

    dd: real;

begin

  if Button = mbleft then mouse := 1;  //сохраняем код нажатой кнопки:   1- левая,  2 правая

  if Button = mbright then mouse := 2;

  tt := nil;

  for i := 0 to spisok.Count - 1 do  //проверяем есть ли под курсором шестерня

  begin

    dd := Dist2D(x1, y1, tGear(spisok.Items[i]).x, tGear(spisok.Items[i]).y);

    if dd < tGear(spisok.Items[i]).radius then  // если есть...

      tt := tGear(spisok.Items[i]); //.. то сохраняем в tt  ссылку на выбранную шестерню

  end;

end;

 

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

procedure TForm1.Panel1DblClick(Sender: TObject);

var temp: tGear;

begin

  temp := tGear.create; // создаем экземпляр класса

  // и устанавливаем параметры

  temp.x := x1;  // координаты

  temp.y := y1;

  temp.radius := 0.1; // радиус

  temp.color1 := random;  // цвет

  temp.color2 := random;

  temp.color3 := random;

  temp.angle := 1;  // угол

  temp.speed := 0;  // скорость =нулю

  if spisok.Count = 0 then temp.speed := 3; //если первая шестеренка то ее срость =3

  spisok.Add(temp); //добавляем шестерню в список

end;

 

//если двигаем мышью....

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

begin

//переводим координаты на форме  в координаты сцены

  x1 := (x - panel1.Width div 2) / (panel1.Width div 2);

  y1 := (-(y - (panel1.Height div 2)) / (panel1.Height div 2));

 

  if (mouse = 1) and (tt <> nil) then  // если при этом нажата ЛЕВАЯ кнопка и выбрана шестерня то..

  begin

    tt.x := x1;  //.... изменяем ее координаты

    tt.y := y1;

  end;

 

  if (mouse = 2) and (tt <> nil) then  //если при этом нажата ПРАВАЯ кнопка и выбрана шестерня то..

    tt.radius := Dist2D(x1, y1, tt.x, tt.y); // .... изменяем ее радиус

end;

 

//если отжимаем кнопку мыши, то обнуляем переменные

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

begin

  mouse := 0;

  tt := nil;

end;

 

//обработка нажатий клавиатуры

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

begin

  if key = 32 then rg := not rg;  //если нажали пробел то смена режима - расстановка, просмотр

 

  if key = 112 then   // если нажали F1   томеняем режим , полноэкранный - обычный

  if BorderStyle= bsNone then

  begin

    reinit;

    BorderStyle := bsSizeable;

    WindowState := wsNormal;

    init;

  end else

  begin

    reinit;

    BorderStyle := bsNone;

    WindowState := wsMaximized;

    init;

  end;

end;

 

// установка формата пикселей

procedure PixelFormat(hdc: HDC);

var

  pfd: TPixelFormatDescriptor;

  nPixelFormat: integer;

begin

  with pfd do

  begin

    nsize := sizeof(TPixelFormatDescriptor); nVersion := 1; dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; iPixelType := PFD_TYPE_RGBA; cColorBits := 16; credbits := 0; credshift := 0; cgreenbits := 0; cgreenshift := 0; cbluebits := 0;

    cblueshift := 0; calphabits := 0; calphashift := 0; caccumbits := 0; caccumredbits := 0; caccumgreenbits := 0; caccumbluebits := 0; caccumalphabits := 0;

    cdepthbits := 32; cstencilbits := 0; cauxbuffers := 0; ilayertype := PFD_MAIN_PLANE; breserved := 0; dwlayermask := 0; dwvisiblemask := 0; dwdamagemask := 0;

  end;

  npixelformat := choosepixelformat(hdc, @pfd); setpixelformat(hdc, npixelformat, @pfd);

end;

 

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

procedure TForm1.init;

begin

  dc := getdc(panel1.Handle);

  pixelformat(dc);

  hrc := wglcreatecontext(dc);

  wglmakecurrent(dc, hrc);

  glenable(GL_DEPTH_TEST);

  glenable(GL_AUTO_NORMAL);

  glenable(GL_NORMALIZE);

  glEnable(GL_COLOR_MATERIAL);

  gllightmodel(gl_light_model_two_side, 1);

  glEnable(GL_LIGHTING);

  gllightfv(gl_light1, gl_position, @pos1);

  gllightfv(gl_light1, gl_diffuse, @dif);

  gllightfv(gl_light1, gl_ambient, @amb);

  glEnable(GL_LIGHT1);

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

end;

 

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

procedure TForm1.reinit;

begin

  wglMakeCurrent(0, 0);

  wglDeleteContext(hrc);

  ReleaseDC(Handle, DC);

  DeleteDC(DC);

end;

 

end.

 

 

 

 

 

 

СПИСОК ЛИТЕРАТУРЫ

  1. Снижко, Е.А. Программирование компьютерной графики с использованием библиотеки openGL: Лабораторный практикум / Е.А.Снижко, Н.А.Флерова, А.В.Воронцов; Балт. гос. техн. ун-т. – СПб., 2005.     с.
  2. Шикин А. В., Боресков А. В. Компьютерная графика. Динамика, реалистические изображения. - M.: ДИАЛОГ-МИФИ, 1998. - 288 с.
  3. Delphi 7 / Под общ. ред. А.Д. Хомоненко. – СПб.: БХВ-Петербург, 2008. – 1216 с.: ил.
  4. http://www.opengl.org.ru/lesson/nehe06.htm
  5. https://code.google.com/p/gl33lessons/

 

 

 

 

 


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