Помощь в написании студенческих работ
Антистрессовый сервис

Моделирование NURBS-поверхностей

Курсовая Купить готовую Узнать стоимостьмоей работы

Описание процедурprocedure FormCreate (Sender: TObject);Данная процедура выполняет загрузку инициализации gl-компонентов, кнопок и баров напанели формыв момент созданию формыprocedure Panel1MouseDown (Sender: TObject; Button: TMouseButton; Включает функцию фиксирования плоскости для вращения procedure Panel1MouseMove (Sender: TObject; Shift: TShiftState; X, Позволяет вращать плоскость, включается… Читать ещё >

Моделирование NURBS-поверхностей (реферат, курсовая, диплом, контрольная)

Содержание

  • Введение
  • 1. Основы трехмерной графики
    • 1. 1. Трехмерная графика
    • 1. 2. Описание работы программы
    • 1. 3. Процесс преобразования координат
  • 2. Описание классов и методов в программе
    • 2. 1. Описание классов и методов в программе
      • 2. 1. 1. Класс Vector
      • 2. 1. 2. Основной процесс рисования
  • 3. Создание и работа NURBS в компьютерной графике
    • 3. 1. История NURBS
    • 3. 2. NURBS-кривые (Non-Uniform Rational B-Splines)
    • 3. 3. Работа с пакетом NURBS в 3d max
  • 4. Использование NURBS в программе
    • 4. 1. Спецификации программы
    • 4. 2. Реализация NURBS в программе
    • 4. 3. Реализация кривых Безье в программе
    • 4. 4. Обработка мыши
    • 4. 5. Блок-схемы
    • 4. 6. Использование программы
    • 4. 7. Описание процедур
  • Заключение
  • Список литературы

Основной процесс происходит в последнем событии. Если была нажата левая кнопка мыши, а потом она была перемещена, то происходит изменение угла зрения в следующем кадре рисования. Если выбрана анимация (галочка на форме выбрана), то программа каждыйкадр добавляет малый угол к повороту камеры и вызывается перерисовка.

4.5 Блок-схемы.

В программе используется событийная модель обработки сообщений, все процедуры достаточно просты. Передвинуть.

Выбрать способ.

Если нажата кнопка.

К примеру, обработка нажатия и движения мыши представляется такой схемой:

Рисунок 4.1 Блок-схема модели обработки сообщений.

Отрисовка происходит по следующему алгоритму:

Рисунок 4.1 Блок-схема алгоритма отрисовки4.

6 Использование программы.

При запуске появляется основное окно:

Рисунок 4.2 Основное окно.

Для изменения параметров поверхности в правую половину окна в таблицу внесите нужные данные. После этого нажмите на кнопку «построить», при этом пересчитается сплайн и на экране появятся NURBS-кривые.Также при нажатии кнопки «Без выреза» поверхность строится без выреза. Рисунок 4.3 NURBS-кривые на экране4.

7 Описание процедурprocedure FormCreate (Sender: TObject);Данная процедура выполняет загрузку инициализации gl-компонентов, кнопок и баров напанели формыв момент созданию формыprocedure Panel1MouseDown (Sender: TObject; Button: TMouseButton; Включает функцию фиксирования плоскости для вращения procedure Panel1MouseMove (Sender: TObject; Shift: TShiftState; X, Позволяет вращать плоскость, включается зажатием мышиprocedure Panel1MouseUp (Sender: TObject; Button: TMouseButton; Выключает функцию фиксирования плоскости для вращения procedure Button1Click (Sender: TObject); позволяет построить диаграмму кривых согласно заданных параметров с вырезомprocedure Button2Click (Sender: TObject); позволяет построить диаграмму кривых согласно заданных параметров без вырезаprocedure Idle (Sender: TObject; var done: boolean); Процедура построения моделиprocedure reset; Процедура сброса моделиprocedure vector (var v: TVector; x, y, z: real); Процедура загрузки вектора, участвует в построении модели procedure sub (var r: TVector; const v1, v2: TVector); Процедура получения разницы векторов, участвует в построении моделиprocedure Norm (var r: TVector; const v1, v2, v3: TVector); Процедура нормализации, участвует в построении моделиprocedure SetDCPixelFormat (dc: HDC); Процедура установки формата пикселейprocedure glVertex (v: TVector); glVertex используется между парой glBegin/glEnd и устанавливает точки, вершины линий и полигонов. procedure mul_v (var r: TVector; const v1, v2: TVector); Процедура перемножения разности векторов, участвует в построении моделиprocedure init_light; Процедура инициализации света на плоскости (сцене) procedure glu_err (err: GLEnum); stdcall; Вывод ошибок при рендере{ procedure TForm1. Button3Click (Sender: TObject);Запускает пример — данная процедура не выполняется.

Заключение

В ходе данной работы были изучены основы пакета NURBS для последующего использования в реализации программы. Также мы научились использовать функции OpenGL для построения NURBSкак частного случая для кривых Безье, а также Безье-поверхностей.Это реализовано с помощью соответствующих методов, которые были описаны в предыдущих пунктах, такие как gluNurbsSurface и glEvalCoord2f. Также были изучен способ запуска OpenGL, как начальный процесс инициализации окна, так и запуск графического конвейера отрисовки. В том числе применение графических трансформаций к модели, освещения моделей путем расстановки источников света и правильного указания нормалей. Были изучены способы построения моделей, как с помощью специальных функций, так и путем прямого рисования треугольников.

Список литературы

OpenGL. Графика в проектах Delphi, Краснов, BHV, 2005. Delphi, Хомоненко, BHV, 2008. Delphi Справочное пособие, Архангельский, Бином, 2001

Программирование графики в Delphi, Тюкачев, BHV, 2008.OpenGL.Официальный справочник, Шрайнер, Диасофт, 2003.

Приложение А. Исходный кодunit Unit1;{nurbs, íî ñ÷èòàåòñÿ íåïðàâèëüíî, âåðíåå ïðàâèëüíî òîëüêî ïðè îïðåäåëåííûõðàçìåðàõ }interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, opengl, StdCtrls, Grids, ComCtrls;type // Çàïèñü âåêòîð TVector = record x, y, z: single; end; TForm1 = class (TForm) Panel1: TPanel; StringGrid1: TStringGrid; Button1: TButton; Button2: TButton; Button3: TButton; TrackBar1: TTrackBar; TrackBar2: TTrackBar; TrackBar3: TTrackBar; procedure FormCreate (Sender: TObject); procedure Panel1MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Panel1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Panel1MouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button1Click (Sender: TObject); procedure Button2Click (Sender: TObject); private { Private declarations } public // Îáüåêò opengl äëÿ ðèñîâàíèÿ DC: HDC; hrc: HGLRC; nurb: GLUnurbsObj; in_drag: boolean; { Public declarations } procedure Idle (Sender: TObject; var done: boolean); procedure reset; end;var knots: array [0.11] of GLFloat = (0,0,0,0,0,0, 1,1,1,1,1,1);var Form1: TForm1; rx, ry: single; f: array [0.(100*3)] of GLFloat; pc: integer; knot: array [0.10] of single;procedure vector (var v: TVector; x, y, z: real);procedure sub (var r: TVector; const v1, v2: TVector);// Ïîñ÷èòàòü íîðìàëüíî íà îñíîâàíèè òðåõ òî÷åêprocedure Norm (var r: TVector; const v1, v2, v3: TVector);implementation{$R *.dfm}var knot_s: integer;// Óñòàíîâèòü ôîðìàò ïèêñåëÿ äëÿ îïåíãëprocedure SetDCPixelFormat (dc: HDC);var pfd: TPixelFormatDescriptor; nPixelFormat: Integer;begin FillChar (pfd, SizeOf (pfd), 0); with pfd do begin nSize:= sizeof (pfd); nVersion:= 1; dwFlags:= PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; iPixelType:= PFD_TYPE_RGBA; cColorBits:= 16; cDepthBits:= 64; iLayerType:= PFD_MAIN_PLANE; end; nPixelFormat:=ChoosePixelFormat (DC,@pfd); SetPixelFormat (DC, nPixelFormat,@pfd);end;// Âûçâàòü ôóíêöèþ ðèñîâàíèÿ îäíîé âåðøèíûprocedure glVertex (v: TVector);begin glVertex3f (v.x, v. y, v. z);end;// Óñòàíîâèòü òåêóùóþ íîðìàëüprocedure glNormal (v: TVector);begin glNormal3f (v.x, v. y, v. z);end;// Ñîçäàòü âåêòîðprocedure vector (var v: TVector; x, y, z: real);beginv.x := x;v.y := y;v.z := z;end;// Âû÷åñòüprocedure sub (var r: TVector; const v1, v2: TVector);beginr.x := v1. x — v2. x;r.y := v1. y — v2. y;r.z := v1. z — v2. z;end;// Óìíîæèòü 2 âåêòîðà âåêòîðíîprocedure mul_v (var r: TVector; const v1, v2: TVector);beginr.x := v1. y * v2. z — v2. y * v1. z;r.y :=-v1.x * v2. z + v2. x * v1. z;r.z := v1. x * v2. y — v2. x * v1. y;end;// Ïîñ÷èòàòü íîðìàëüprocedure Norm (var r: TVector; const v1, v2, v3: TVector);var e1, e2: TVector;beginsub (e1, v2, v1);sub (e2, v3, v1);mul_v (r, e1, e2);end;procedure init_light;const p: array [0.3] of single = (3,3,-3,1); d: array [0.2] of single = (1,1,1);begin glEnable (GL_LIGHTING); glEnable (GL_LIGHT0); // glEnable (GL_LIGHT1); glEnable (GL_NORMALIZE); glLightfv (GL_LIGHT0, GL_POSITION, @p); glLightfv (GL_LIGHT0, GL_SPOT_DIRECTION, @d);end;procedure TForm1. FormCreate (Sender: TObject);var i, j, k: integer;begin // Èíèöèàëèçèðóåì îïåíãë DC := GetDC (Panel1.Handle); SetDCPixelFormat (DC); hrc := wglCreateContext (DC); wglMakeCurrent (DC, hrc); // Óñòàíàâëèâàåì ïàðàìåòðû glClearColor (0.2,0.2,0.2,1.0); glEnable (GL_DEPTH_TEST); glEnable (GL_COLOR_MATERIAL); // glEnable (GL_CULL_FACE); // glCullFace (GL_CW); // glEnable (GL_AUTO_NORMAL); glEnable (GL_NORMALIZE); glMatrixMode (GL_PROJECTION); glLoadIdentity; gluPerspective (45, Panel1. Width / (1.0 * Panel1. Height), 0.1, 10); rx := 0; ry := 0; nurb := gluNewNurbsRenderer (); gluNurbsProperty (nurb, GLU_SAMPLING_TOLERANCE, 25.0); gluNurbsProperty (nurb, GLU_DISPLAY_MODE, GLU_FILL); pc := 6; for i := 0 to pc-1 do for j := 0 to pc-1 do begin k := i * pc + j; f[ k * 3 ] := i; f[ k * 3+1 ] := j; f[ k * 3+2 ] := 0; end; init_light; // Button2Click (nil); reset; Button1Click (nil); Application. OnIdle := Idle;end;procedure TForm1. Idle (Sender: TObject; var done: boolean);var i, j, vi, k: integer; v00, v01, v10, v11, n: TVector; t: single;begin glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); glTranslatef (0,0, -5); // glScalef (0.7, 0.7, 0.7); t := TrackBar1. Position / 10.0; glScalef (t, t, t); // Ïîâåðíóòü ñöåíó glRotatef (rx, 0,1,0); glRotatef (ry, 1,0,0); // Êâàäðàòèê glBegin (GL_LINE_LOOP); glColor3f (0,1,0); glVertex3f (2, 2,0); glVertex3f (2,-2,0); glVertex3f (-2,-2,0); glVertex3f (-2, 2,0); glEnd (); // Êàðòà âûñîò glPushMatrix (); glScalef (0.5, 0.5, 0.5); glTranslatef (-pc/2, -pc/2, 0); glBegin (GL_LINES); glColor3f (1,0,0); for i := 0 to pc-1 do for j := 0 to pc-1 do begin if (i < pc-1) then begin k := i * pc + j; glVertex3f (i, j, f[k*3+2]); k := (i+1) * pc + j; glVertex3f (i+1, j, f[k*3+2]); end; if (j < pc-1) then begin k := i * pc + j; glVertex3f (i, j, f[k*3+2]); k := i * pc + j+1; glVertex3f (i, j+1, f[k*3+2]); end; end; glEnd (); glPopMatrix (); // NURBS glScalef (0.5, 0.5, 2.5); glTranslatef (-pc/2, -pc/2, 0); glColor3f (0,1,0); glCallList (1); SwapBuffers (dc); done := true;end;procedure TForm1. Panel1MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);begin in_drag := true;end;var mxo, myo: integer;procedure TForm1. Panel1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);begin if (in_drag) then begin rx := rx + (x — mxo); ry := ry + (y — myo); end; mxo := x; myo := y;end;procedure TForm1. Panel1MouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);begin in_drag := false;end;var trim: array [0.5*2−1] of GLFloat = (-2,-2, 3,-2, 3,3, -2,3, -2,-2); trim2: array [0.4*2−1] of GLFloat = (0.1, 0.2, 0.3, 0.5, 0.5, 0.2, 0.1, 0.2); {}procedure glu_err (err: GLEnum); stdcall;begin MessageBox (0, PChar ('Error: ' + IntToHex (err, 8)), 'OpenGL error', 0);end;procedure TForm1. Button1Click (Sender: TObject);var i, j, k, x, y: integer; s, tx, ty, ts, n, t1, t2: single;begin { xèòàåì îñíîâíûå òî÷êè } for x := 0 to pc-1 do for y := 0 to pc-1 do begin k := y * pc + x; f[ k*3 + 2 ] := StrToFloat (StringGrid1.Cells[x, y]); {} end; gluNurbsCallback (nurb, 100 103, @glu_err); // GLU_NURBS_ERROR glNewList (1, GL_COMPILE); t1 := -TrackBar2.Position / 20.0 + 0.25; t2 := TrackBar3. Position / 20.0; trim2[0] := 0.5 — t1; trim2[1] := 0.5 + t2; trim2[2] := 0.5 + t2 — t1; trim2[3] := 0.5 — t2; trim2[4] := 0.5 — t2 — t1; trim2[5] := 0.5 — t2; trim2[6] := 0.5 — t1; trim2[7] := 0.5 + t2; gluBeginSurface (nurb); { gluNurbsSurface (nurb, 12, @knots, 12, @knots, pc * 3, 3, @f, pc, pc, GL_MAP2_NORMAL); {} if (sender = Button1) then begin gluBeginTrim (nurb); gluPwlCurve (nurb, 5, @trim, 2, GLU_MAP1_TRIM2); gluEndTrim (nurb); {} gluBeginTrim (nurb); gluPwlCurve (nurb, 4, @trim2, 2, GLU_MAP1_TRIM2); gluEndTrim (nurb); {} end; gluNurbsSurface (nurb, 12, @knots, 12, @knots, pc * 3, 3, @f, pc, pc, GL_MAP2_VERTEX3); gluEndSurface (nurb); {} glEndList ();end;procedure TForm1. Button2Click (Sender: TObject); procedure c (x, y: integer; v: single); begin StringGrid1. Cells[x, y] := FloatToStr (v); end;begin reset; c (1, 1, 2); c (1, 2, 1); c (1, 3, 2); c (2, 3, 3); c (2, 4, 2); c (2, 5, 1); c (3, 5, 2); c (4, 5, 4); c (5, 5, 1); c (4, 6, 3);end;procedure TForm1. reset;var x, y: integer;begin for x := 0 to pc-1 do for y := 0 to pc-1 do StringGrid1. Cells[x, y] := '0';end;{ procedure TForm1. Button3Click (Sender: TObject);begin // Ðèñóåì ïîâåðõíîñòü ïî àëãîðèòìó áåçüå (òî÷êè ðàññ÷èòûâàþòñÿ ÷åðåç îïåíãë) // xèòàåì îñíîâíûå òî÷êè for x := 0 to pc-1 do for y := 0 to pc-1 do begin k := y * pc + x; f[ k*3 + 2 ] := StrToFloat (StringGrid1.Cells[x, y]); end; glNewList (1, GL_COMPILE); glMap2f (GL_MAP2_VERTEX3, 0, 1, 3, 6, 0, 1, 3*6, 6, @f[0]); glEnable (GL_MAP2_VERTEX3); glEnable (GL_MAP2_NORMAL); glBegin (GL_TRIANGLES); for x := 0 to 6*5−1 do for y := 0 to 6*5−1 do begin glEvalCoord2f (x / 30.0, y / 30.0); glEvalCoord2f ((x+1) / 30.0, (y+1) / 30.0); glEvalCoord2f ((x+1) / 30.0, y / 30.0); glEvalCoord2f (x / 30.0, y / 30.0); glEvalCoord2f (x / 30.0, (y+1) / 30.0); glEvalCoord2f ((x+1) / 30.0, (y+1) / 30.0); end; glEnd (); glEndList ();end; }end.

Показать весь текст

Список литературы

  1. OpenGL. Графика в проектах Delphi, Краснов, BHV, 2005.
  2. Delphi, Хомоненко, BHV, 2008.
  3. Delphi Справочное пособие, Архангельский, Бином, 2001.
  4. Программирование графики в Delphi, Тюкачев, BHV, 2008.
  5. OpenGL.Официальный справочник, Шрайнер, Диасофт, 2003.
Заполнить форму текущей работой
Купить готовую работу

ИЛИ