for(k=0;k<Fnum;k++)//控制点,显示曲面
    {
z0=0.0;
for(i=0;i<t;i++)
{
for(j=0;j<n;j++)
{
ctrlpoints[k][i][j][0]=pView->ptNum[k][0][j][0]*pView->tracedis+pView->ptNum [k][0][j][2]/pView->waveMax*pView->tracedis*pView->waveTimes;
ctrlpoints[k][i][j][1]=pView->ptNum[k][i][j][1]*pView->sampleinterval-400;
ctrlpoints[k][i][j][2]=z0;
}
z0+=20.0;//每次z坐标增加20
}
        gluNurbsSurface(theNurb,t+4,snots,n+4,tnots,3*n,3,&ctrlpoints[k][0][0][0],4,4,GL_MAP2_VERTEX_3);
  如何将一张bmp纹理映射到曲面上?     

解决方案 »

  1.   

    还是自己实现NURBS的代码使用灵活性更大一些!
      

  2.   

    我也刚好要问相同的问题!
    《OpenGL编程指南》上说照下面的方式组织代码可以实现NURBS曲面纹理贴图(设置了纹理和法线)
    gluBeginSurface(nobj);
     gluNurbsSurface(nobj, ..., GL_MAP2_TEXTURE_COORD_2);
     gluNurbsSurface(nobj, ..., GL_MAP2_NORMAL);
     gluNurbsSurface(nobj, ..., GL_MAP2_VERTEX_3);
    gluEndSurface(nobj);
    我经实验没有成功,希望有人能给个成功的例子,一个问题是法线GL_MAP2_NORMAL的那个怎么取值。
    另外,Nurbs和NEHE28课使用的贝齐埃曲面是不一样的,有时无法替代。
    也欢迎楼主讨论!
      

  3.   

    刚才终于成功了。例如代码:
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, gridTex[0]);//*
    float knot[] = {0,0,0,1,1,1};
    float cps[3][3][4] = {{{-1.0,0.0,-1.0,1.0},{0.0,0.0,-1.0,1.0},{1.0,0.0,-1.0,1.0}},
                          {{-1.0,0.0,0.0,1.0},{0.0,0.5,-1.0,1.0},{1.0,0.0,0.0,1.0}},
      {{-1.0,0.0,1.0,1.0},{0.0,0.0,1.0,1.0},{1.0,0.0,1.0,1.0}}};
    float tps[3][3][2] = {{{0,0},{5,0},{10,0}},
                          {{0,5},{5,5},{10,5}},
          {{0,10},{5,10},{10,10}}}; GLUnurbs* nurb = gluNewNurbsRenderer();
    gluNurbsProperty(nurb, GLU_DISPLAY_MODE, GLU_FILL);
    gluNurbsProperty(nurb, GLU_CULLING, GL_TRUE);
    gluBeginSurface(nurb);
    gluNurbsSurface(nurb,6,knot,6,knot,2,3*2,&tps[0][0][0],3,3,GL_MAP2_TEXTURE_COORD_2);
    gluNurbsSurface(nurb,6,knot,6,knot,4,3*4,&cps[0][0][0],3,3,GL_MAP2_VERTEX_4);
    gluEndSurface(nurb);
    不过之前要把纹理先设置好,载入要用的bmp位图。
      

  4.   

    请问,上面楼主们,NURBS纹理坐标是怎样设置的。我设置的纹理贴图环境BEZIER可以实现贴图,而NURBS却无法实现贴图,恳请上面楼主给以指点。谢谢。
      

  5.   

    希望有人能够给个成功的NURBS曲面贴图的例子。非常感谢。
      

  6.   

    GLfloat controlPoint[4][4][3] = {
    {{-0.8f,-0.6f,0.8f},{-0.2f,-0.6f,1.6f},{0.2f,-0.6,-0.4f},{0.6f,-0.6f,0.8f}},
    {{-0.6f,-0.2f,0.8f},{-0.2f,-0.2f,1.6f},{0.2f,-0.2f,-0.4f},{0.6f,-0.2f,0.8f}},
    {{-0.6f,0.2f,0.8f},{-0.2f,0.2f,0.4f},{0.2f,0.2f,0.0f},{0.3f,0.2f,-0.4f}},
    {{-0.6f,0.6f,0.8},{-0.2f,0.6f,0.4},{-0.8f,0.6f,0.0f},{0.8f,0.6f,-0.4f}}
    };
    GLfloat sknots[8] = {0.0f,0.0f,0.0f,0.0f,1.0f,1.0f,1.0f,1.0f};
    GLfloat tknots[8] = {0.0f,0.0f,0.0f,0.0f,1.0f,1.0f,1.0f,1.0f};


    glDepthFunc(GL_LESS);
    glEnable(GL_AUTO_NORMAL);
    glEnable(GL_NORMALIZE);
    glEnable(GL_TEXTURE_2D); glEnable(GL_MAP2_TEXTURE_COORD_2); GLUnurbsObj * theNurb;
    theNurb = gluNewNurbsRenderer();
    gluNurbsProperty(theNurb,GLU_SAMPLING_TOLERANCE,25.0); //纹理
    GLfloat textureCntrlPnt[2][2][2] = {
    {{0.0f,0.0f},{0.0f,0.1f}},
    {{1.0f,0.0f},{1.0f,1.0f}}
    };
    m_pDib = new CDib("a.BMP");
    GLubyte * pTextureBits = (GLubyte*)m_pDib->GetDibBitsPtr();
    GLint width = m_pDib->GetDibWidth();
    GLint height = m_pDib->GetDibHeight();
    glPixelStorei(GL_UNPACK_ALIGNMENT,1);
    glTexImage2D(GL_TEXTURE_2D,0,3,width,height,0,GL_BGR_EXT,GL_UNSIGNED_BYTE,pTextureBits); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
    //gluNurbsProperty(theNurb,GLU_DISPLAY_MODE,GLU_OUTLINE_POLYGON);//现况模型
    gluNurbsProperty(theNurb,GLU_DISPLAY_MODE,GLU_FILL);//实体模型
    Lighting();
    glNewList(1,GL_COMPILE);
    gluBeginSurface(theNurb);
    gluNurbsSurface(theNurb,8,sknots,8,tknots,3,12,
    (float *)textureCntrlPnt,
    4,4,
    GL_MAP2_TEXTURE_COORD_3);
    gluNurbsSurface(theNurb,8,sknots,8,tknots,3,12,
    (float *)controlPoint,
    4,4,
    GL_MAP2_VERTEX_3);

    gluEndSurface(theNurb);
    glEndList();
    glPushMatrix();
    glScalef(1.2f,1.2f,1.2f);
    glRotatef(45.0f,0.0f,0.0f,1.0f);
    glRotatef(45.0f,1.0f,1.0f,1.0f);
    glCallList(1);
    glPopMatrix();
    glDisable(GL_AUTO_NORMAL);
    glDisable(GL_NORMALIZE);
    glDisable(GL_LIGHTING);
      

  7.   

    请问四楼你是一张BMP贴上去成功了么?求教