На главную

On-line справка по OpenGL

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-L-M-N-O-P-R-S-T-U-V-W | Скачать Вниз

Porting NURBS Surfaces



The following table lists the IRIS GL functions for drawing NURBS surfaces and their OpenGL equivalents.

IRIS GL Function OpenGL Function Meaning
bgnsurface gluBeginSurface Begin a surface definition.
nurbssurface gluNurbsSurface Specify surface attributes.
endsurface gluEndSurface End a surface definition.


The following table lists IRIS GL parameters for surface types and their OpenGL equivalents.

IRIS GL Type OpenGL Type Meaning
N_V3D GL_MAP2_VERTEX_3 Polynomial curve.
N_V3DR GL_MAP2_VERTEX_4 Rational curve.
N_C4D GL_MAP2_COLOR_4 Control points define color surface in (R,G,B,A) form.
N_C4DR ѕ ѕ
N_T2D GL_MAP2_TEXTURE_COORD_2 Control points are texture coordinates.
N_T2DR GL_MAP2_TEXTURE_COORD_3 Control points are texture coordinates.
ѕ GL_MAP2_NORMAL Control points are normals.


For more information on available evaluator types, see glMap2.
This sample program draws a trimmed NURBS surface:

/*
* trim.c
* This program draws a NURBS surface in the shape of a
* symmetrical hill, using both a NURBS curve and pwl
* (piecewise linear) curve to trim part of the surface.
*/
#include
#include
#include "aux.h"

GLfloat ctlpoints[4][4][3];

GLUnurbsObj *theNurb;

/*
* Initializes the control points of the surface to
* a small hill. The control points range from -3 to
* +3 in x, y, and z
*/
void init_surface(void)

{
int u, v;
for (u = 0; u < 4; u++) {
for (v = 0; v < 4; v++) {
ctlpoints[u][v][0] = 2.0*((GLfloat)u - 1.5);
ctlpoints[u][v][1] = 2.0*((GLfloat)v - 1.5);

if ( (u == 1 || u == 2) && (v == 1 || v == 2))
ctlpoints[u][v][2] = 3.0;
else
ctlpoints[u][v][2] = -3.0;
}
}
}

/* Initialize material property and depth buffer.
*/
void myinit(void)
{
GLfloat mat_diffuse[] = { 0.6, 0.6, 0.6, 1.0 };

GLfloat mat_specular[] = { 0.9, 0.9, 0.9, 1.0 };
GLfloat mat_shininess[] = { 128.0 };

glClearColor (0.0, 0.0, 0.0, 1.0);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);


init_surface();

theNurb = gluNewNurbsRenderer();
gluNurbsProperty(theNurb, GLU_SAMPLING_TOLERANCE, 50.0);
gluNurbsProperty(theNurb, GLU_DISPLAY_MODE, GLU_FILL);
}

void display(void)
{
GLfloat knots[8] = {0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0};
GLfloat edgePt[5][2] = /* counter clockwise */
{{0.0, 0.0}, {1.0, 0.0}, {1.0, 1.0}, {0.0, 1.0},
{0.0, 0.0}};
GLfloat curvePt[4][2] = /* clockwise */
{{0.25, 0.5}, {0.25, 0.75}, {0.75, 0.75}, {0.75, 0.5}};

GLfloat curveKnots[8] =
{0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0};
GLfloat pwlPt[4][2] = /* clockwise */
{{0.75, 0.5}, {0.5, 0.25}, {0.25, 0.5}};

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(330.0, 1.,0.,0.);
glScalef (0.5, 0.5, 0.5);

gluBeginSurface(theNurb);
gluNurbsSurface(theNurb,
8, knots,
8, knots,
4 * 3,
3,
&ctlpoints[0][0][0],

4, 4,
GL_MAP2_VERTEX_3);
gluBeginTrim (theNurb);
gluPwlCurve (theNurb, 5, &edgePt[0][0], 2,
GLU_MAP1_TRIM_2);
gluEndTrim (theNurb);
gluBeginTrim (theNurb);
gluNurbsCurve (theNurb, 8, curveKnots, 2,
&curvePt[0][0], 4, GLU_MAP1_TRIM_2);
gluPwlCurve (theNurb, 3, &pwlPt[0][0], 2,
GLU_MAP1_TRIM_2);
gluEndTrim (theNurb);
gluEndSurface(theNurb);


glPopMatrix();
glFlush();
}

void myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective (45.0, (GLdouble)w/(GLdouble)h, 3.0, 8.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (0.0, 0.0, -5.0);
}

/* Main Loop
*/
int main(int argc, char** argv)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA | AUX_DEPTH);
auxInitPosition (0, 0, 500, 500);

auxInitWindow (argv[0]);
myinit();
auxReshapeFunc (myReshape);
auxMainLoop(display);
}


Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Перенесение NURBS Всплывает



Следующий стол включает функциям ИРИСА GL для чертежа поверхностей NURBS и их эквивалентов OpenGL.

ИРИС GL Функциональной Функции OpenGL, означающий, что bgnsurface gluBeginSurface Начинает поверхностное определение.
nurbssurface gluNurbsSurface Определяет поверхностные атрибуты.
endsurface gluEndSurface Заканчивает поверхностное определение.


Следующий стол включает параметрам IRIS GL для поверхностных типов и их эквивалентов OpenGL.

ТИП ИРИСА GL Типа OpenGL, означающий Полиномиальную кривую N_V3D GL_MAP2_VERTEX_3.
Рациональная кривая N_V3DR GL_MAP2_VERTEX_4.
точки Управления N_C4D GL_MAP2_COLOR_4 определяют цветную поверхность в форме (R,G,B,A).
N_C4DR U U
точки Управления N_T2D GL_MAP2_TEXTURE_COORD_2 являются координатами текстуры.
точки Управления N_T2DR GL_MAP2_TEXTURE_COORD_3 являются координатами текстуры.
U точки Управления GL_MAP2_NORMAL - нормально.


Более подробно в доступных типах вычислителя, смотри glMap2.
Эта программа образца делает приспособленной поверхностью NURBS:

/*
* trim.c
* Эта программа делает поверхностью NURBS в форме a
* симметричный холм, использовавший оба NURBS изгибают и pwl
* кривая (piecewise линейный), чтобы приспосабливать часть поверхности.
*/
#include #include #include "aux.h"

GLfloat ctlpoints[4][4][3];

GLUnurbsObj *theNurb;

/*
* Инициализирует управляющие точки поверхности, чтобы
* небольшой холм. Управление указывает дипазон из -3, чтобы
* +3 в x, y, и z
*/
пустота init_surface(пустота)

{
int u, v;
для (u = 0; u < 4; u++) { для (v = 0; v < 4; v++) { ctlpoints[u][v][0] = 2.0*((GLfloat)u - 1.5);
ctlpoints[u][v][1] = 2.0*((GLfloat)v - 1.5);

если ( (u == 1 || u == 2) && (v == 1 || v == 2)) ctlpoints[u][v][2] = 3.0;
еще
ctlpoints[u][v][2] = -3.0;
}
}
}

/* Инициализируйте материальную собственность и глубинный буфер.
*/
пустота myinit(пустота)
{
GLfloat mat_diffuse[] = { 0.6, 0.6, 0.6, 1.0 };

GLfloat mat_specular[] = { 0.9, 0.9, 0.9, 1.0 };
GLfloat mat_shininess[] = { 128.0 };

glClearColor (0.0, 0.0, 0.0, 1.0);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);


init_surface();

theNurb = gluNewNurbsRenderer();
gluNurbsProperty(theNurb, GLU_SAMPLING_TOLERANCE, 50.0);
gluNurbsProperty(theNurb, GLU_DISPLAY_MODE, GLU_FILL);
}

недействительный показ(пустота)
{
УЗЛЫ GLfloat[8] = {0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0};
GLfloat edgePt[5][2] = /* СЧЕТЧИК по часовой стрелке */
{{0.0, 0.0}, {1.0, 0.0}, {1.0, 1.0}, {0.0, 1.0},
{0.0, 0.0}};
GLfloat curvePt[4][2] = /* ПО ЧАСОВОЙ СТРЕЛКЕ */
{{0.25, 0.5}, {0.25, 0.75}, {0.75, 0.75}, {0.75, 0.5}};

GLfloat curveKnots[8] =
{0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0};
GLfloat pwlPt[4][2] = /* ПО ЧАСОВОЙ СТРЕЛКЕ */
{{0.75, 0.5}, {0.5, 0.25}, {0.25, 0.5}};

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(330.0, 1.,0.,0.);
glScalef (0.5, 0.5, 0.5);

gluBeginSurface(theNurb);
gluNurbsSurface(theNurb, 8, УЗЛЫ, 8, узлы,
4 * 3,
3,
&ctlpoints[0][0][0],

4, 4,
GL_MAP2_VERTEX_3);
gluBeginTrim (theNurb);
gluPwlCurve (theNurb, 5, &edgePt[0][0], 2, GLU_MAP1_TRIM_2);
gluEndTrim (theNurb);
gluBeginTrim (theNurb);
gluNurbsCurve (theNurb, 8, curveKnots, 2, &curvePt[0][0], 4, GLU_MAP1_TRIM_2);
gluPwlCurve (theNurb, 3, &pwlPt[0][0], 2, GLU_MAP1_TRIM_2);
gluEndTrim (theNurb);
gluEndSurface(theNurb);


glPopMatrix();
glFlush();
}

пустота myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective (45.0, (GLdouble)w/(GLdouble)h, 3.0, 8.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (0.0, 0.0, -5.0);
}

/* Основной Цикл
*/
int основа(int argc, символ** argv)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA | AUX_DEPTH);
auxInitPosition (0, 0, 500, 500);

auxInitWindow (argv[0]);
myinit();
auxReshapeFunc (myReshape);
auxMainLoop(ПОКАЗ);
}


Вверх Version 1.1, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод Win32 API  Русский перевод OpenGL
 
Hosted by uCoz