Occt 的 Visualization 提供了显示和渲染功能,应用这些功能,可以方便的显示图形对象。该模块基于 OpenGL 实现。
这这里首先就要显示一个对象的步骤做一个简单的总结。具体可参加 Occt 附带例子,这里以 MFCSamples 中的Common 为例来说明。
首先,在 CwinApp 类中初始化一个设备对象的类: Graphic3d_WNTGraphicDevice 的实例。这个设备对象提供了图形设备管理功能,主要管理颜色显示和底层的 GraphicDriver 。其包含一个 Graphic3d_GraphicDriver 对象,该Driver 对象的功能,主要是加载 Occt 自身的 opengl 库 TKOpenGl.dll ,使用动态加载。加载成功,则可以使用 OpenGl 库中的功能了。
其次,在 Cdocument 派生类中声明两个类的实例: V3d_Viewer 和 AIS_InteractiveContext 类。V3d_Viewer 是一个 V3d_View ( 3d 视图)的管理器,可以管理多个 view 。 AIS_InteractiveContext 类是 Occt 提供的对显示对象的管理封装类,管理从 AIS_InteractiveObject 类派生类的对象,允许对象的显示、选择、高亮显示等。 AIS_InteractiveObject 类是一个高层的封装类,表示一个可交换的图形对象,提供:图形对象显示功能、图形对象选择功能等。通过上述 Context 和 Object 两个类,显示一个对象的代码将很简单,例如:已经有一个 TopoDS_Shape 对象 aShape ,显示其代码很简单:
Handle(AIS_Shape) aObj = new AIS_Shape(aShape);
M_AISContext->Display(aObj);
当然,底层的实现是, Context 将 obj 对象添加到 viewer 对象,由 viewer 对象通过其 view 对象来进行具体的显示功能。
这个初始代码也比较简单:
myViewer = new V3d_Viewer(theGraphicDevice,(short *) "Visu3D");
myViewer->SetDefaultLights();
myViewer->SetLightOn();
myAISContext =new AIS_InteractiveContext(myViewer);
只是要注意最后一行 Context 和 Viewer 的关联。
最后,在 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 是跨平台的。
至此,一切就绪,可以简单的调用 context 的 display 显示对象了。
从一组点生成 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 曲线、编辑曲线等,还是比较简单的。