Occt的visualization模块:如何使用MFC和Occt显示一个Bspline曲线

OcctVisualization 提供了显示和渲染功能,应用这些功能,可以方便的显示图形对象。该模块基于 OpenGL 实现。

这这里首先就要显示一个对象的步骤做一个简单的总结。具体可参加 Occt 附带例子,这里以 MFCSamples 中的Common 为例来说明。

首先,在 CwinApp 类中初始化一个设备对象的类: Graphic3d_WNTGraphicDevice 的实例。这个设备对象提供了图形设备管理功能,主要管理颜色显示和底层的 GraphicDriver 。其包含一个 Graphic3d_GraphicDriver 对象,该Driver 对象的功能,主要是加载 Occt 自身的 openglTKOpenGl.dll ,使用动态加载。加载成功,则可以使用 OpenGl 库中的功能了。

其次,在 Cdocument 派生类中声明两个类的实例: V3d_ViewerAIS_InteractiveContext 类。V3d_Viewer 是一个 V3d_View3d 视图)的管理器,可以管理多个 viewAIS_InteractiveContext 类是 Occt 提供的对显示对象的管理封装类,管理从 AIS_InteractiveObject 类派生类的对象,允许对象的显示、选择、高亮显示等。 AIS_InteractiveObject 类是一个高层的封装类,表示一个可交换的图形对象,提供:图形对象显示功能、图形对象选择功能等。通过上述 ContextObject 两个类,显示一个对象的代码将很简单,例如:已经有一个 TopoDS_Shape 对象 aShape ,显示其代码很简单:

Handle(AIS_Shape) aObj = new AIS_Shape(aShape);

M_AISContext->Display(aObj);

当然,底层的实现是, Contextobj 对象添加到 viewer 对象,由 viewer 对象通过其 view 对象来进行具体的显示功能。

这个初始代码也比较简单:

myViewer = new V3d_Viewer(theGraphicDevice,(short *) "Visu3D");

myViewer->SetDefaultLights();

myViewer->SetLightOn();

myAISContext =new AIS_InteractiveContext(myViewer);

只是要注意最后一行 ContextViewer 的关联。

 

最后,在 Cview 的派生类中,声明 V3d_View 类的对象,并初始化。 V3d_view 对象代表了一个 3d 视图,通常和一个窗口管理,允许通过该 view 在窗口中显示图形对象,并提供视图的旋转、缩放、平移等功能和一些相关的显示功能例如:灯光等。通常对象初始化如下实现:

myView = GetDocument()->GetViewer()->CreateView();

获取 doc 中声明的 viewer 对象,并尤其创建一个新的 v3d_View 对象,并将该视图对象记录下。

Handle(WNT_Window) aWNTWindow = new WNT_Window(theGraphicDevice,GetSafeHwnd ());

myView->SetWindow(aWNTWindow);

这一步将窗口和视图关联起来,具体到内部的实现,就是以窗口的 HDC 创建 OpenGL 对于的 HDRC ,从而允许后续的 Opengl 功能作用到该窗口中。

注意: Occt 是跨平台的。

至此,一切就绪,可以简单的调用 contextdisplay 显示对象了。

从一组点生成 Bspline 曲线并显示,代码很简单:

//2d 逼近:

TColgp_Array1OfPnt2d array (1,5); // sizing array                   

array.SetValue(1,gp_Pnt2d (0,0));                                   

array.SetValue(2,gp_Pnt2d (1,2));                                   

array.SetValue(3,gp_Pnt2d (2,3));                                   

array.SetValue(4,gp_Pnt2d (4,3));                                   

array.SetValue(5,gp_Pnt2d (5,5));                                   

Handle(Geom2d_BSplineCurve) SPL =                                  

    Geom2dAPI_PointsToBSpline(array);            

Handle(ISession2D_Curve) aCurve = new ISession2D_Curve(SPL1);

aCurve->SetColorIndex(3);

myContext->Display(aCurve, Standard_False);

3d 插值:

Handle(TColgp_HArray1OfPnt) harray =                                                   

    new TColgp_HArray1OfPnt (1,5); // sizing harray                                    

harray->SetValue(1,P1.Translated(gp_Vec(4,0,0)));                                       

harray->SetValue(2,P2.Translated(gp_Vec(4,0,0)));                                      

harray->SetValue(3,P3.Translated(gp_Vec(4,0,0)));                                      

harray->SetValue(4,P4.Translated(gp_Vec(4,0,0)));                                       

harray->SetValue(5,P5.Translated(gp_Vec(4,0,0)));                                      

                                                                                       

GeomAPI_Interpolate anInterpolation(harray,Standard_False,Precision::Approximation()); 

anInterpolation.Perform();                                                                                                                                                    

Handle(Geom_BSplineCurve) SPL2 = anInterpolation.Curve();;                                                        

Handle(ISession_Curve) aCurve = new ISession_Curve(SPL1);

myContext ->SetDisplayMode(aCurve,1);

myContext ->Display(aCurve, Standard_False);

 

可见,代码还是很简单的。如果应用 Occt 实现一些简单的功能,例如:创建 Bspline 曲线、编辑曲线等,还是比较简单的。

 

 

你可能感兴趣的:(visualization,mfc,图形,跨平台,object)