NURBS OpenGL

Модератор: Модераторы разделов

Аватара пользователя
Ink-85
Сообщения: 222
Статус: полный привет
ОС: Mac OS, Ubuntu 8.04

NURBS OpenGL

Сообщение Ink-85 »

Скажите правильно я понимаю? Что в OpenGL уже есть функции NURBS кривых, поверхностей, и операций с ними (отрезание, сшивка и т.д)
И знание математики только поможет в программировании, но не кретично?
И я так понял, что велосипед изобретать мне не прийдеться, все функции для работы с NURBS уже написаны в GL , надо их просто применить правильно?
Если все так, тогда зачем написали библиотеку OpenNurbs, Nurbana и в чем их принципиальные отличия от GL ?

Я вот в умной книге прочитал что одним из хороших правил программиста - это использование уже готового кода! Может взять функции GL и испоьзовать для своей проги? Есть ли в GL функции по подсчету , площади, сил которые приложены на поверхность или кривую и т.д.?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: NURBS OpenGL

Сообщение NickLion »

OpenGL не содержит функций по работе с NURBS. Однако там есть evalutor (glMap*, glEvalCoord*) для работы с кривыми Безье. В дополнительной библиотеке GLU содержатся уже и функции по работе с NURBS (они основаны на преобразовании в кривые и порции Безье, но это всё скрыто). В том числе там есть и базовые вещи, совершаемые над несколькими NURBS.
Но нужно учесть, что эти функции ориентированы на отрисовку, а не пересчёт. Т.е. возможно для Вашей задачи (я так понимаю, всё то же - архитектура?) функциональность GLU не будет подходить.
Спасибо сказали:
Аватара пользователя
Ink-85
Сообщения: 222
Статус: полный привет
ОС: Mac OS, Ubuntu 8.04

Re: NURBS OpenGL

Сообщение Ink-85 »

ok
Спасибо сказали:
Аватара пользователя
begin2009
Сообщения: 349
Статус: Ламер со стажем
ОС: без глюков

Re: NURBS OpenGL

Сообщение begin2009 »

Оно не совсем так.
NURBS-поверхности
Один из классов В-сплайнов, рациональные В-сплайны, задаваемые на неравномерной сетке (Non-Uniform Rational B-Spline, NURBS), является стандартным для компьютерной графики способом определения параметрических кривых и поверхностей.
Библиотека glu предоставляет набор команд, позволяющих использовать этот класс поверхностей.
Для работы с NURBS-поверхностями в библиотеке glu имеются переменные специального типа, используемые для идентификации объектов:
theNurb: gluNurbsObj;
При создании окна объект, как обычно, создается:
theNurb: = gluNewNurbsRenderer;
А в конце работы приложения память, занимаемая объектом, высвобождается:
gluDeleteNurbsRenderer (theNurb);

Этот кусок я взял из главы 3 в книге Краснова "OpenGL в проектах delphi". Там есть примеры кода.

Код: Выделить всё

{**********************************************************************}
{* Иллюстрация к книге "OpenGL в проектах Delphi"                     *}
{* Краснов М.В. softgl@chat.ru                                        *}
{**********************************************************************}

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  OpenGL;

type
  TfrmGL = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormResize(Sender: TObject);
  private
    DC : HDC;
    hrc: HGLRC;
  end;

var
  frmGL: TfrmGL;
  theNurb : GLUnurbsObj;

implementation

{$R *.DFM}

const
 ctrlpoints : Array [0..3, 0..2] of GLfloat =
       (( -4.0, -4.0, 0.0), (-2.0, 4.0, 0.0),
    (2.0, -4.0, 0.0), (4.0, 4.0, 0.0));
 curveKnots : Array [0..7] of GLfloat =
      (0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0);

{=======================================================================
Перерисовка окна}
procedure TfrmGL.FormPaint(Sender: TObject);
var
 i : GLint;
begin
 glClear (GL_COLOR_BUFFER_BIT);      // очистка буфера цвета

 glColor3f(1.0, 1.0, 1.0);

 gluNurbsCurve (theNurb, 8, @curveKnots, 3,
                     @ctrlpoints, 4, GL_MAP1_VERTEX_3);

 glPointSize(5.0);
 glColor3f(1.0, 1.0, 0.0);
 glBegin(GL_POINTS);
   For i := 0 to 3 do
     glVertex3fv(@ctrlpoints[i][0]);
 glEnd;

 SwapBuffers(DC);
end;

{=======================================================================
Формат пикселя}
procedure SetDCPixelFormat (hdc : HDC);
var
 pfd : TPixelFormatDescriptor;
 nPixelFormat : Integer;
begin
 FillChar (pfd, SizeOf (pfd), 0);
 pfd.dwFlags  := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
 nPixelFormat := ChoosePixelFormat (hdc, @pfd);
 SetPixelFormat (hdc, nPixelFormat, @pfd);
end;

{=======================================================================
Создание формы}
procedure TfrmGL.FormCreate(Sender: TObject);
begin
 DC := GetDC (Handle);
 SetDCPixelFormat(DC);
 hrc := wglCreateContext(DC);
 wglMakeCurrent(DC, hrc);

 theNurb := gluNewNurbsRenderer;
 gluNurbsProperty (theNurb, GLU_SAMPLING_TOLERANCE, 25.0);
end;

{=======================================================================
Конец работы приложения}
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
 gluDeleteNurbsRenderer(theNurb);
 wglMakeCurrent(0, 0);
 wglDeleteContext(hrc);
 ReleaseDC (Handle, DC);
 DeleteDC (DC);
end;

procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 If Key = VK_ESCAPE then Close;
end;

procedure TfrmGL.FormResize(Sender: TObject);
begin
 glViewport(0, 0, ClientWidth, ClientHeight);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity;
 If ClientWidth <= ClientHeight
   then glOrtho(-5.0, 5.0, -5.0*ClientHeight / ClientWidth,
               5.0*ClientHeight / ClientWidth, -5.0, 5.0)
   else glOrtho(-5.0*ClientWidth / ClientHeight,
               5.0*ClientWidth / ClientHeight, -5.0, 5.0, -5.0, 5.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity;

 InvalidateRect(Handle, nil, False);
end;


end.
Получается горбатая поверхность. Если есть пример, то переписать для другого языка можно.
Пессимист видит темный туннель, оптимист видит свет в конце туннеля, реалист видит свет, туннель и поезд.
И только машинист видит этих трех идиотов, сидящих на рельсах.
Спасибо сказали:
Аватара пользователя
Ink-85
Сообщения: 222
Статус: полный привет
ОС: Mac OS, Ubuntu 8.04

Re: NURBS OpenGL

Сообщение Ink-85 »

Спасибо за пример. Я сейчас читаю:
Интерактивня комп. графика. Эдвард Эйннджел
The NURBS Book
Ну и СУПЕР книга по GL

Хорошие книги
Спасибо сказали: