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纹理映射到曲面上?
{
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纹理映射到曲面上?
解决方案 »
- VC 各位大神求助啊 代码同步显示
- 控件初始化的小问题
- 我想用GetProcAddress获取用CreateProcess创建的进程里的一个函数地址,但是GetProcAddress要求的是进程的HMODULE/HINSTANCE,所以我要取得
- 我想做一张光盘,用户不用安装就能使用,程序中有Ado或dataGrid控件, 请高手们支着!!!!
- 如何在com或者dll的入口函数dllmain里面创建线程??
- 有关查询数据的算法,
- ###如何删除指定目录的文件呢?
- 如何在CDialog上使用CDialogBar
- 谁能帮忙解释一下setsockopt()?
- 前辈们看看我的第一个VC代码,有一事不明,请指教!
- ODBC
- MFC单文档 记事本 程序。CStudioFile写入文本文件时出错,ASSERT(m_pStream != NULL); 求解决办法
《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课使用的贝齐埃曲面是不一样的,有时无法替代。
也欢迎楼主讨论!
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位图。
{{-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);