我将Nurbs曲面数据点读入后,画曲面没有问题,但在增加裁剪过程的时候发现被裁剪曲面的方向不对,如图所示:
原本应该是上面的平面和下面的环拼接在一起的,但是画出来以后就错位,检查后发现数据点没问题,所以应该是裁剪中的错误,很急,恳请会的大神帮助一下,谢谢了!!
下面是我的绘制程序:
void COpenGLDC::DrawNurbsSurface(const CVector3D* pts,int uSize,int vSize,int uOrder,int vOrder,float* Weight,CNurbsCurve* OuterTrimCurve,vectorInerTrimCurve,float* uKnots , float* vKnots ,bool Trim ) //参数pts:曲面组),uSize:u向节点矢量个数,vSize:v向节点矢量个数
//uOrder:u向阶数,vOrder:v向阶数, Weight:曲面的权因子(一维数组)
//OuterTrimCurv:外圈裁剪曲线,InerTrimCurve:内圈裁剪曲线,uKnots:u向节点矢量
//vKnots:v向节点矢量
{
glDisable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
//glCullFace( GL_BACK );
glEnable(GL_AUTO_NORMAL);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
int iner_size = InerTrimCurve.size();
int size = uSize*vSize;
GLfloat* ctrlPts = new GLfloat[size*3];
for(int i=0; i<size; i++) {
ctrlPts[i*3] = pts[i].dx;
ctrlPts[i*3+1] = pts[i].dy;
ctrlPts[i*3+2] = pts[i].dz;
}
int a=sizeof(ctrlPts);
GLUnurbsObj *pNurbsObj = gluNewNurbsRenderer();
gluNurbsProperty(pNurbsObj,GLU_SAMPLING_TOLERANCE,100);
gluNurbsProperty(pNurbsObj,GLU_DISPLAY_MODE,(GLfloat) GLU_FILL);
gluBeginSurface(pNurbsObj);
gluNurbsSurface(pNurbsObj, //绘制曲面
vSize+vOrder, vKnots,
uSize+uOrder, uKnots,
uSize*3,
3,
ctrlPts,
vOrder,
uOrder,
GL_MAP2_VERTEX_3);
if(Trim == TRUE) //如果曲面被裁剪,绘制裁剪曲面
{
int Trim_size = OuterTrimCurve->m_Size;
GLfloat* Trim_ctrlPts = new GLfloat[Trim_size*3];
for(int i=0; i<Trim_size; i++) {
Trim_ctrlPts[i*3] = OuterTrimCurve->m_ctrlPts[i].dx;
Trim_ctrlPts[i*3+1] = OuterTrimCurve->m_ctrlPts[i].dy;
Trim_ctrlPts[i*3+2] = OuterTrimCurve->m_ctrlPts[i].dz;
}
gluBeginTrim(pNurbsObj);
gluNurbsCurve(pNurbsObj, //外圈裁剪曲线
OuterTrimCurve->m_Size+OuterTrimCurve->m_Order,
OuterTrimCurve->m_Knots,
3,
(float*) Trim_ctrlPts,
OuterTrimCurve->m_Order,
GLU_MAP1_TRIM_2);
gluEndTrim(pNurbsObj);
delete [] Trim_ctrlPts;
/*for(int j=0;j<iner_size;j++)
{
int Trim1_size = InerTrimCurve[j]->m_Size;
GLfloat* Trim1_ctrlPts = new GLfloat[Trim1_size*3];
for(int i=0; i<Trim1_size; i++) {
Trim1_ctrlPts[i*3] = InerTrimCurve[j]->m_ctrlPts[i].dx;
Trim1_ctrlPts[i*3+1] = InerTrimCurve[j]->m_ctrlPts[i].dy;
Trim1_ctrlPts[i*3+2] = InerTrimCurve[j]->m_ctrlPts[i].dz;
}
gluBeginTrim(pNurbsObj);
//gluNurbsProperty(pNurbsObj,GLU_SAMPLING_TOLERANCE,25.0);
gluBeginCurve(pNurbsObj);
gluNurbsCurve(pNurbsObj,
InerTrimCurve[j]->m_Size+InerTrimCurve[j]->m_Order,
InerTrimCurve[j]->m_Knots,
3,
(float*) Trim1_ctrlPts,
InerTrimCurve[j]->m_Order,
GL_MAP1_VERTEX_3);
gluEndCurve(pNurbsObj);
gluEndTrim(pNurbsObj);
delete [] Trim1_ctrlPts;
}*/
}
gluEndSurface(pNurbsObj);
if(pNurbsObj)
gluDeleteNurbsRenderer(pNurbsObj);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_FALSE);
glCullFace(GL_BACK|GL_FRONT);
glEnable(GL_CULL_FACE);
glFlush();
delete [] ctrlPts;
}