一直對OpenCASACDE不滿意的地方就是它的渲染,看起來確實不夠?qū)I(yè)。
前段時間一直想用OpenInventor渲染它的模型拓撲結(jié)構(gòu)TopoDS_Shape,遇到了一個棘手的問題:如何將實體的任意Edge轉(zhuǎn)化成OpenInventor可以識別的Nurbs曲線。
分析了良久還是沒有結(jié)果,不知道是方法不當(dāng)還是OpenCASCADE本身的Bug。
下面的代碼是我寫的轉(zhuǎn)化代碼:
bool TopeEdge2Curve(const TopoDS_Edge& topoEdge, SoSeparator* pRootNode)

{
TopLoc_Location topLoc;
Standard_Real fStart, fEnd;
Handle_Geom_Curve hCurve = BRep_Tool::Curve(topoEdge, topLoc, fStart, fEnd);
if(hCurve.IsNull())
return false;
Handle(Geom_TrimmedCurve) myTrimmed = new Geom_TrimmedCurve(hCurve, fStart, fEnd);
Handle_Geom_BSplineCurve hBSpline = GeomConvert::CurveToBSplineCurve(myTrimmed);
if(hBSpline.IsNull() )
return false;
gp_Trsf transfom;
Standard_Boolean bIdentity = true;
if(!topLoc.IsIdentity())
{
bIdentity = false;
transfom = topLoc.Transformation();
}


// control points
Standard_Integer nCtrlPts = hBSpline->NbPoles();
CString szControl;
SbVec3f* pts = new SbVec3f[nCtrlPts];
for(int ii=1; ii<= nCtrlPts; ++ii)
{
gp_Pnt pt = hBSpline->Pole(ii);
if(!bIdentity)
pt.Transform(transfom);
pts[ii-1] = SbVec3f(pt.X(), pt.Y(), pt.Z());
}
// knots
Standard_Integer nKnots = hBSpline->NbKnots();
float* knots = new float[nKnots];
for( int kk=1; kk <= nKnots; ++kk)
{
knots[kk-1] = hBSpline->Knot(kk);
}
SoSeparator *curveSep = new SoSeparator();
SoDrawStyle* pDrawStyle = new SoDrawStyle;
pDrawStyle->lineWidth.setValue(4.0f);
curveSep->addChild(pDrawStyle);
// and a complexity.
SoComplexity *complexity = new SoComplexity;
SoCoordinate3 *controlPts = new SoCoordinate3;
SoNurbsCurve *curve = new SoNurbsCurve;
complexity->value = 1.0f;
controlPts->point.setValues(0, nCtrlPts, pts);
curve->numControlPoints = nCtrlPts;
curve->knotVector.setValues(0, nKnots, knots);
curveSep->addChild(complexity);
curveSep->addChild(controlPts);
curveSep->addChild(curve);
pRootNode->addChild(curveSep);
delete[] pts;
delete[] knots;
return true;
}

