游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6058|回复: 5

请问gluNurbsSurface中的第三个和第五个参数有什么意义?

[复制链接]

7

主题

20

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2006-7-8 06:24:00 | 显示全部楼层 |阅读模式
请问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;
}

7

主题

20

帖子

20

积分

注册会员

Rank: 2

积分
20
 楼主| 发表于 2006-7-8 06:24:00 | 显示全部楼层

Re:请问gluNurbsSurface中的第三个和第五个参数有什么意义?

麻烦高手解答,谢谢

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2006-7-10 10:54:00 | 显示全部楼层

Re:请问gluNurbsSurface中的第三个和第五个参数有什么意义?

找图形学书中的Nurbs仔细看看,gluNurbsSurface是对图形学中的实现。第三个和第五个参数跟你要的nurbs阶次有关系,都是可以算出来的。

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2007-12-16 20:30:00 | 显示全部楼层

Re: 请问gluNurbsSurface中的第三个和第五个参数有什么意义?

我也是这里不会,同命相怜啊 [em17]

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2007-12-16 20:39:00 | 显示全部楼层

Re: 请问gluNurbsSurface中的第三个和第五个参数有什么意义?

  NURBS曲面的方程为:



式中di,j(u,v)i=0,l…m;j=0,l…n为控制顶点,wi,j是与控制顶点dij相联系的权因子,Ni,k,i=0,l…,m和Ni,j,j=0,1,……,n分别为u向k次和v向l次的规范B样条基。他们分别由u项与v向的节点矢量
  U=[u0,u1…um+k+l]与V=[vo,v1,…,vn+l+1]
按德布尔递推公式决定。
关键是这个德布尔递推公式啊,我再去查查去
sf_20071216203857.jpg

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-7-5 18:14:00 | 显示全部楼层

Re:请问gluNurbsSurface中的第三个和第五个参数有什么意义?

ftkghost,您好!我想请教您一个关于gluNurbsSurface的问题,您能给我您的邮箱或者QQ号么?以便联系。
谢谢!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 10:05

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表