力为的技术博客

联系 聚合 管理
  154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks

一直对OpenCASACDE不满意的地方就是它的渲染,看起来确实不够专业。
前段时间一直想用OpenInventor渲染它的模型拓扑结构TopoDS_Shape,遇到了一个棘手的问题:如何将实体的任意Edge转化成OpenInventor可以识别的Nurbs曲线。

分析了良久还是没有结果,不知道是方法不当还是OpenCASCADE本身的Bug。
下面的代码是我写的转化代码:


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];
    
forint 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;
}
posted on 2007-07-02 21:44 力为 阅读(1858) 评论(4)  编辑 收藏 引用 所属分类: 9.OpenCASCADE

评论

# re: 未解之谜---Edge到Nurbs曲线的转化 2007-07-03 23:05 SmartPtr
楼主好像对C++和CAD这一块很有兴趣与研究,我对这方面也有所了解,曾组队自行研发学习过CAD系统。刚来CppBlog,楼主今后多多指教了。  回复  更多评论
  

# re: 未解之谜---Edge到Nurbs曲线的转化 2007-07-04 22:33 力为
终于找到错误所在了:

// knots
Standard_Integer nKnots = hBSpline->NbPoles() + hBSpline->Degree() + 1; // hBSpline->NbKnots();
TColStd_Array1OfReal knodSequ(1, nKnots);
hBSpline->KnotSequence(knodSequ);

float* knots = new float[nKnots];
for( int kk=1; kk <= nKnots; ++kk)
{
knots[kk-1] = knodSequ.Value(kk);//hBSpline->Knot(kk);

}
  回复  更多评论
  

# re: 未解之谜---Edge到Nurbs曲线的转化 2007-10-20 16:31 斌伯
想问lz一个很莱的问题:
请问lz是怎样能够使网页上显示的代码像vs那一能够收缩起来,能够教教我吗  回复  更多评论
  

# re: 未解之谜---Edge到Nurbs曲线的转化 2007-10-21 22:09 力为
我也想知道呀  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理