【55gps.com资讯】
‘设置Z和M坐标awareness
Dim pZAware As esriCore.IZAware
Set pZAware = pMultiPatch
pZAware.ZAware = True
Dim pMAware As esriCore.IMAware
Set pMAware = pMultiPatch
pMAware.MAware = False
通常,多片是用来描述阴影平面集合,并且可以在其上粘贴影像,也就是贴图。为了粘贴影像,需要在Multipatch的每一个定点上记录纹理坐标。纹理坐标记录为s和t,值为0到1,表示了从x到y方向影像的起点到终点。在ArcObjects中将s和t编码存储在定点的M值中。另外,如果要用Multipatch表达复杂连续的几何对象,比如球体,为了平滑阴影平面之间的转折,需要在Multipatch的每一个顶点上记录它的法向量,同样法向量也是编码后存储在定点的M值中。如下面的代码:
Dim pNormal As esriCore.IVector3D
Dim pVertex As esriCore.Ipoint
Dim m As Double
m = 0
. . .
Dim pEncoder As IEncode3DProperties
Set pEncoder = New GeometryEnvironment
pEncoder.PackNormal vNormal, m
pEncoder.PackTexture2D s, t, m
pVertex.M = m
四、3D渲染和动画功能定制简介
在ArcObjects中的3D对象内部调用了OpenGL图形库,所以有关3D渲染方面的开发是基于OpenGL图形库方面的知识。在ArcObjects中的定制渲染工作原理如下图,在SceneGraph::Redraw绘制开始和结束时分别会激活SceneGraph或其它外部事件处理器的OnBeforeDraw和OnAfterDraw事件,我们可以在这两个事件添加自己的渲染效果,比如在OnBeforeDraw事件中添加雾化效果等,而可以在OnAfterDraw事件中添加三维文字标注等。

动画使得场景有动态的感觉,我们可以通过对视角、图层的可见性、以及场景的属性进行定制来达到动画的效果。下图是在动画定制中将会涉及到的部分类和接口。

从此对象模型图我们可以看出在Scene对象中可以访问动画轨迹对象(AnimationTrack),而动画轨迹是由关键帧组成的,关键帧分成场景的、图层的和书签(照相机)的。同时动画类型也分为场景、图层和照相机三种。这些类都是CoClass,可以通过创建的方式实例化,从而来控制动画的定制。另外,在ArcObjects中提供了控制动画演播和录制的相应方法,具体参考帮助文档中AnimationTrack类和ScreenViewer类。
五、三维控件
在ArcObjects中包含一个ActiveX viewer控件,它为ActiveX控件容器如Microsoft Word、Microsoft PowerPoint等提供了显示三维文档、图层及图形数据的功能。下面的代码显示了如何在VB中使用此控件:
‘ 引用ArcScene文档
SceneViewerCtrl1.DocName = “c:\temp\myscene.sxd”
或者
‘ 添加一个图层
SceneViewerCtrl.SceneGraph.Scene.AddLayer pLayer
或者
‘添加一个图形元素
Dim pMap As IBasicMap
Set pMap = SceneViewerCtrl1.SceneGraph.Scene
Dim pGCon As IGraphicsContainer3D
Set pGCon = pMap.BasicGraphicsLayer
Set pGCon = pGLayer
pGCon.AddElement pElement
Viewer.Redraw False
六、总结
本文旨在对ArcObjects?中有关3D的部分做一个简单的介绍,具体详细的3D对象描述及所涉及的具体方法和属性等可参考《Exploring ArcObjects》一书,以及随机开发人员帮助。