|
请问gluNurbsSurface中的第三个和第五个参数有什么意义?这个节点是什么意思?我修改它的值以后可以控制曲面绘制的区域,但是不知道是怎样控制的,而且当我修改值时还可能出现减少节点序列的错误,而且用16个控制点,u,v方向各4个,第2个和第四个参数的值也不能随便修改。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include "gl/glut.h"
const char* szCaption = "Nurbs.c";
GLfloat ctrlpoints[4][4][3];
int bShowPoints = 0;
GLUnurbsObj *theNurbs;
void init_Surface(void)
{
int u, v;
for(u=0; u<4; u++) {
for(v=0; v<4; v++) {
ctrlpoints[v][0] = 2.0*((GLfloat)u-1.5);
ctrlpoints[v][1] = 2.0*((GLfloat)v-1.5);
if((u==1 || u==2)&&(v==1 || v==2))
ctrlpoints[v][2] = 3.0;
else
ctrlpoints[v][2] = -5.0;
}
}
}
void CALLBACK errorCallback(GLenum errorCode)
{
const GLubyte * estr;
estr = gluErrorString(errorCode);
fprintf(stderr, "Nurbs Error : %s\n",estr);
exit(0);
}
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);
init_Surface();
theNurbs = gluNewNurbsRenderer();
gluNurbsProperty(theNurbs, GLU_SAMPLING_TOLERANCE, 25.0);
gluNurbsProperty(theNurbs, GLU_DISPLAY_MODE, GLU_OUTLINE_POLYGON);
gluNurbsCallback(theNurbs, GLU_ERROR, errorCallback);
}
void reshape(GLsizei w, GLsizei h)
{
if(0 == h)
h=1;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w>h)
gluPerspective(40.0, (GLfloat)w/(GLfloat)h, 0.1, 100.0);
else
gluPerspective(40.0*(GLfloat)h/(GLfloat)w, (GLfloat)h/(GLfloat)w, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(-1.0, 0.0, -10.0);
}
void display(void)
{
GLfloat knots[8] = {0.0, 0.1, 0.3, 0.4, 0.5, 0.5, 0.7, 5.0}; ///这里
int i, j;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(330.0, 1.0, 0.0, 0.0);
glScalef(0.8, 0.8, 0.8);
gluBeginSurface(theNurbs);
gluNurbsSurface(theNurbs,
8, knots, 8, knots,
4*3, 3, &ctrlpoints[0][0][0],
4, 4, GL_MAP2_VERTEX_3);
gluEndSurface(theNurbs);
if(bShowPoints) {
glPointSize(5.0);
glDisable(GL_LIGHTING);
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_POINTS);
for(i=0; i<4; i++)
for(j=0; j<4; j++)
glVertex3fv(ctrlpoints[j]);
glEnd();
glEnable(GL_LIGHTING);
}
glPopMatrix();
glFlush();
}
void keyboard(GLubyte key, GLint x, GLint y)
{
switch(key){
case 'c':
case 'C':
bShowPoints = !bShowPoints;
glutPostRedisplay();
break;
case 27:
exit(0);
break;
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(400, 300);
glutInitWindowPosition(0, 0);
glutCreateWindow(szCaption);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
|
|