资源描述:
《第三章 图 形 对 象》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第三章图形对象即使人们不知道苹果和梨是怎么种植的,也可以吃掉它们。那么能否不必知道构造细节,也可以绘制出复杂的图形呢?可以,图形对象就干这种事情。Intra3D的图形对象隐藏了几何造型与绘制的细节,用户使用简单的几个接口函数就可以绘制出图形。Intra3D2.0版提供了三类图形对象:(1)常用几何对象,如长方体、锥体、圆柱体、球体、圆环体、Swept形体等对象;(2)多边形模型对象,用于绘制Autodesk公司.3ds模型和Wavefront公司的.obj模型;(3)商业统计图形对象,如柱形图、带状图、条形图、折线图、面积图、饼图、塔形图、曲线图、曲面图
2、、进程图、股票图等对象。Intra3D将“图形对象”和“形体节点”(见第四章)分层设计。图形对象负责绘制,形体节点则处理3D交互。形体节点可以动态地引用图形对象,从而实现交互式绘制。这种分层设计可使Intra3D核心库具有良好的可扩展性,并使交互式3D应用程序的开发更加灵活。3.1图形对象的基类与COM接口图形对象的基类为GraphicalObject,相应的COM接口为IGraphicalObject。在C++类库中,几何图形对象如BoxObject、ConeObject、CylinderObject、SphereObject与TorusObject,
3、多边形模型对象如Model3DS与ModelOBJ,商业统计图形对象如ColumnChart3D、RibbonChart3D、LineChart2D与BartChar2D等,均为GraphicalObject的派生类。在COM库中,上述对象均继承接口IGraphicalObject。C++类库中GraphicalObject是Container的派生类,应使用AddRef与Release函数来管理内存。源程序见Intra3D-DLLIncludeLayer2GraphicalObject.h。其定义如下:classGraphicalObject:p
4、ublicContainer{public:virtualvoidDraw(void){}//图形绘制函数//获取对象的包围盒,(dx,dy,dz)为长方体的幅值,(cx,cy,cz)为中心坐标,virtualvoidGetBoundBox(float*dx,float*dy,float*dz,float*cx,float*cy,float*cz){*dx=*dy=*dz=0;*cx=*cy=*cz=0;}//获取对象的包围球,(cx,cy,cz)为中心坐标,radius为半径virtualvoidGetBoundSphere(float*radius,
5、float*cx,float*cy,float*cz){*cx=*cy=*cz=0;*radius=0;}//获取对象的最小坐标值(minx,miny,minz)与最大坐标值(maxx,maxy,maxz)virtualvoidGetMinMax(float*minx,float*miny,float*minz,float*maxx,float*maxy,float*maxz){*minx=*miny=*minz=-0;*maxx=*maxy=*maxz=0;}64};其中公有函数Draw、GetBoundBox、GetBoundSphere与GetMi
6、nMax均为虚函数,具体行为由派生类定义。COM接口IGraphicalObject的定义如下(见Intra3D-COMIntra3D.idl文件):interfaceIGraphicalObject:IDispatch{HRESULTDraw();HRESULTGetMinMax([out]float*minX,[out]float*minY,[out]float*minZ,[out]float*maxX,[out]float*maxY,[out]float*maxZ);HRESULTGetBoundSphere([out]float*radius,
7、[out]float*cx,[out]float*cy,[out]float*cz);HRESULTGetBoundBox([out]float*dx,[out]float*dy,[out]float*dz,[out]float*cx,[out]float*cy,[out]float*cz);};3.2常用几何图形对象Intra3D2.0C++类库与COM库中的常用几何图形对象有BoxObject、ConeObject、CylinderObject、SphereObject与TorusObject。由于这几种图形对象的设计非常相似,本节仅以SphereO
8、bject为例讲述程序设计。程序的重点是AddRef、Release与Final