ArcGIS3D分析高级可视化和定制_第1页
ArcGIS3D分析高级可视化和定制_第2页
ArcGIS3D分析高级可视化和定制_第3页
ArcGIS3D分析高级可视化和定制_第4页
ArcGIS3D分析高级可视化和定制_第5页
已阅读5页,还剩66页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ArcGIS 3D Analyst高级可视化和客户化高级可视化和客户化内内 容容u 客户化简介客户化简介u 基本的基本的3D对象模型对象模型u 3D几何模型和定制对象几何模型和定制对象u 定制渲染定制渲染u 动画动画u 3D View控件控件客户化简介客户化简介3D Analyst 对象是对象是ArcObjects的一部分的一部分通过简单的脚本进行定制:通过简单的脚本进行定制:Visual Basic for Applications(VBA)创建新的创建新的3D工具和组件工具和组件: VB,VC等等ArcScene 扩展扩展 3D 3D 分析对象模型分析对象模型SceneISceneIBas

2、icMapSceneGraphISceneGraphIDisplay3DSceneViewerISceneViewerCameraICameraApplication(ArcScene)ISxApplicationIApplicationSxDocumentISxDocumentIApplicationArcSceneSxDocumentSceneArcMapMxDocumentMapSceneGraphDisplay3D 分析对象模型分析对象模型GraphicsLayer3DIGraphicsContainer3DIGraphicsLayerSceneLayersILayerITinLaye

3、r | IRasterLayer3DPropertiesI3DPropertiesIDataLayerExtension SceneGraph 用来处理用来处理3D3D可视化可视化:3D 分析对象模型分析对象模型 SceneViewer 实现和实现和Viewer相关的功能相关的功能 影像导出,快照影像导出,快照 Camera 定义了每一个定义了每一个3D Viewer的视角,的视角,方向和位置等方向和位置等3D 分析对象模型分析对象模型切入点切入点 (简单的(简单的 VBA 脚本)脚本) Dim pSxDoc As ISxDocument Dim pScene As IScene Dim pS

4、G As ISceneGraph Dim pViewer As ISceneViewer Dim pCamera As ICamera Set pSxDoc = ThisDocument VBA Set pScene = pSxDoc.Scene Set pSG = pScene.SceneGraph Set pViewer = pSG.ActiveViewer Or use pSG.GetAllViewers Set pCamera = pViewer.Camera also possible Set pCamera = pScene.SceneGraph.ActiveViewer.Came

5、ra切入点切入点 (命令(命令/工具工具 VB )Implements ICommandPrivate m_pApp as esriCore.IapplicationPrivate m_pDoc as ISxDocumentPrivate Sub ICommand_OnCreate(ByVal Hook As Object) Set m_pApp = Hook Set m_pDoc = m_pApp.Document End Sub3D 几何模型几何模型l所有支持所有支持Z值的几何要素值的几何要素lPoints, lines, polygons(点,线,面)lMultiPatches(多片):

6、l(Z-awareness) MultiPatch(多片)多片)V2V1V3V4V5V6V7V8V9Triangle Strip(三角条带)V2V1V3V4V5V6V7Triangle Fan(三角扇)Outer RingInner RingsRingFirstRingRing生成生成MultiPatch定制对象定制对象l创建创建:几何形状法向量纹理坐标l开发人员参考实例开发人员参考实例: VB 例子例子: MultiPatchDim pMultiPatch As esriCore.IMultiPatchSet pMultiPatch = New MultiPatchDim pGeoCol A

7、s esriCore.IGeometryCollectionSet pGeoCol = pMultiPatchDim pPoints As esriCore.IPointCollectionDim pPoint As IPoint 创建屋顶创建屋顶 Set pPoints = New esriCore.TriangleFan Set pPoint = New Point pPoint.PutCoords 5, 4 pPoint.Z = 10 pPoints.AddPoint pPoint Set pPoint = New Point pPoint.PutCoords 0, 0 pPoint.Z

8、 = 5 pPoints.AddPoint pPoint 屋顶的其它顶点屋顶的其它顶点: . . . (10, 0, 5) . . . (10, 8, 5) . . . ( 0, 8, 5) . . . ( 0, 0, 5)将扇加到将扇加到MultiPatchpGeoCol.AddGeometry pPoints 为没有窗户的墙创建条带为没有窗户的墙创建条带Set pPoints = New esriCore.TriangleStrip 添加条带顶点添加条带顶点: . . . (10, 0, 5); (10, 0, 0); (10, 8, 5) . . . (10, 8, 0); ( 0, 8

9、, 5); ( 0, 8, 0) . . . ( 0, 0, 5); ( 0, 0, 0)将条带添加到将条带添加到MultiPatchpGeoCol.AddGeometry pPoints为前面的墙创建外环为前面的墙创建外环Set pPoints = New esriCore.Ring 添加外环顶点添加外环顶点: . . . (10, 0, 5); (10, 0, 0); (10, 8, 5) . . . (10, 8, 0); ( 0, 8, 5); ( 0, 8, 0) . . . ( 0, 0, 5); ( 0, 0, 0)将外环添加到将外环添加到MultiPatchpGeoCol.Ad

10、dGeometry pPointspMultiPatch.PutRingType pPoints, esriMultiPatchOuterRingVB 例子例子: MultiPatch 为前面的墙创建内环为前面的墙创建内环 Set pPoints = New esriCore.Ring 添加内环顶点添加内环顶点: . . .(1, 0, 2);(3, 0, 2);(3, 0, 4);(1, 0, 4);(1, 0, 2) pGeoCol.AddGeometry pPoints pMultiPatch.PutRingType pPoints, esriMultiPatchInnerRing Se

11、t pPoints = New esriCore.Ring 添加内环顶点添加内环顶点: . . .(7, 0, 2);(9, 0, 2);(9, 0, 4);(7, 0, 4);(7, 0, 2) pGeoCol.AddGeometry pPoints pMultiPatch.PutRingType pPoints, esriMultiPatchInnerRing设置设置Z和和M坐标坐标awareness Dim pZAware As esriCore.IZAware Set pZAware = pMultiPatch pZAware.ZAware = True Dim pMAware As

12、esriCore.IMAware Set pMAware = pMultiPatch pMAware.MAware = FalseVB 例子例子: MultiPatch 球能够通过用一组球能够通过用一组三角条带的集合来三角条带的集合来构造构造 平面明暗(平面明暗(Flat shading)显示了)显示了三角条带的不同部三角条带的不同部分分MultiPatch构造构造 使用相邻的条带进行使用相邻的条带进行平滑平滑: 预先计算顶点的法向预先计算顶点的法向量量 用几何存储法向量用几何存储法向量平滑明暗平滑明暗平滑比较平滑比较存储法向量的好处存储法向量的好处存储顶点的法向量存储顶点的法向量 使用使用M

13、坐标存储法向量坐标存储法向量: 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 pVertex.M = mSample: custom multipatch纹理坐标纹理坐标(0,0)(1,1)(1,0)(0,1)(1,0.2)(1,0.8)(0,0.

14、8)(0.4,0.2)(0.4,0.8)(0.6,0.8)(0.6,0.2)有纹理的3D 几何形状F:worksdemohouse.sxd有纹理的3D 几何形状存储纹理坐标存储纹理坐标 使用使用M坐标存储坐标存储 (s,t) 坐标坐标: Dim s As Double Dim t As Double Dim m As Double Dim pVertex As esriCore.Ipoint m = 0 . . . Dim pEncoder As IEncode3DProperties Set pEncoder = New GeometryEnvironment pEncoder.PackTe

15、xture2D s, t, m pVertex.M = m使用图片填充符号使用图片填充符号l能用来符号化面状要素和能用来符号化面状要素和TIN 与与Geometry一起形成特征对象一起形成特征对象 从从BMP或或EMF创建创建 可用透明的颜色可用透明的颜色IPictureFillSymbol:BitmapTransparencyColor(如果不用将它设置成如果不用将它设置成NULL!) 影像的大小受到影像的大小受到OpenGL驱动的最大值限制。这个驱动的最大值限制。这个缺省值可以在系统注册表中修改缺省值可以在系统注册表中修改 ArcSceneSettingsmaxTextureWidth(和

16、和 maxTextureHeight)使用图片填充符号使用图片填充符号Sample:通过面拉伸生成建筑物:通过面拉伸生成建筑物 每一个面生成不同的每一个面生成不同的 multipatch 根据面的外表形状自根据面的外表形状自动赋予一个图片填充动赋予一个图片填充符号符号Dev sample: facades create symbolDim pSym As IPictureFillSymbolSet pSym = New PictureFillSymbol load from filepSym.CreateFillSymbolFromFile esriIPictureBitmap, “myTex

17、ture.bmp“ set transparent color to nullDim pColor As IRgbColorSet pColor = New RgbColorpColor.NullColor = TruepSym.BitmapTransparencyColor = pColor add graphics element with geometry and pSymSample:植树:植树 使用透明的十字交使用透明的十字交叉的树木图片叉的树木图片 交互地植树或用作交互地植树或用作一个一个3D点状符号点状符号Dev sample: planting trees优化图片填充符号显示时

18、间优化图片填充符号显示时间 如果使用许多纹理对象(即使使用同样的纹理),如果使用许多纹理对象(即使使用同样的纹理),内存的使用量和显示时间将增加内存的使用量和显示时间将增加 解决方案解决方案: a) 将几何形状相同的对象(例如树木)的所有部分使用将几何形状相同的对象(例如树木)的所有部分使用相同的图片填充符号,或者相同的图片填充符号,或者 b) 随图形元素一起添加图片填充符号,并将图片放置在随图形元素一起添加图片填充符号,并将图片放置在最前面最前面定制渲染定制渲染l3D分析对象内部调用了分析对象内部调用了OpenGL图形库图形库l定制的组件能够用定制的组件能够用OpenGL:l创建特殊的渲染效

19、果l添加修饰和定制对象l转换缺省的投影定制渲染:如何工作?定制渲染:如何工作?SceneGraph:Redraw Setup projection bHandled Send BeforeDraw event if (not bHandled) Draw scene layers Sends AfterDraw eventExternal event handler:OnBeforeDraw / pre-render effects, define display list / draw additional objectsExternal event handler:OnAfterDraw

20、/ post-render effects, draw objects / 2D overlaySGEventHandler 类Public WithEvents SGEvents As esri3DExt.SceneGraphPrivate Function SGEvents_BeforeDraw(ByVal pViewer As esri3DExt.ISceneViewer) As Boolean . SGEvents_BeforeDraw = FalseEnd FunctionPrivate Sub SGEvents_AfterDraw(ByVal pViewer As esri3DEx

21、t.ISceneViewer) .End Sub定制渲染:如何工作?定制渲染:如何工作?关联SceneGraph事件 (VBA):Dim g_pHandler As SGEventHandler Public Sub HookEvents() Dim pDoc As ISxDocument Set pDoc = ThisDocument hook to the scene graph: Set g_pHandler = New SGEventHandler Set g_pHandler .SGEvents = pDoc.Scene.SceneGraphEnd Sub定制渲染:如何工作?定制渲染

22、:如何工作? 3D放大镜(改变投影)放大镜(改变投影) 裁减面裁减面 在在 Samples 3DVisualization: 3D Text: labels Fog and haze toolbar定制渲染:定制渲染:OpenGL实例实例Dev sample: labelingDev sample: layered fog, Sun动画(动画(Animation) 能够通过脚本生成能够通过脚本生成 8.2的动画对象使得制作相机动画,图层动的动画对象使得制作相机动画,图层动画和场景属性动画更容易画和场景属性动画更容易 内置导出成内置导出成AVI的功能的功能 可以创建定制的动画工具和动画类型可以创

23、建定制的动画工具和动画类型Demo: 3D animationCamera动画动画观测点观测点 和和/或或目标点目标点位置位置倾角、方位角倾角、方位角和和转角转角 观测距离观测距离视域角度视域角度 围绕目标点旋转,有一个方便的方法:围绕目标点旋转,有一个方便的方法:pCamera.PolarUpdate(distFactor, incAzimuth, incInclination, bLimitInclination)Demo: Spin图层属性动画图层属性动画 改变单一图层的属性:改变单一图层的属性: 某些需要重建显示缓存某些需要重建显示缓存:基高,拉伸,渲染中的符号化(纹基高,拉伸,渲染中

24、的符号化(纹理等)理等) 其它不需要重建缓存其它不需要重建缓存:透明度,符号,渲染选项透明度,符号,渲染选项 顺序动画(顺序动画(sequence animation): 创建图层的版本,每一个有不同的属性并且创建一个循环创建图层的版本,每一个有不同的属性并且创建一个循环来改变它的可视性来改变它的可视性Demo: 中国各省拉伸(GDP)Demo: 环境、气象图层属性动画图层属性动画 通过通过Basic3DProperties (图层扩展)改变(图层扩展)改变: 查找正确的图层扩展查找正确的图层扩展(参考Samples/3DAnalyst/Framework/ Layer 3D Properti

25、es) 设置基高,拉伸,设置基高,拉伸,Z偏移和比例尺,渲染属性偏移和比例尺,渲染属性(亮度,优先级(亮度,优先级)等值等值 应用属性(如果需要,图层将自动刷新)应用属性(如果需要,图层将自动刷新)Dev sample: fading animation find the extension with 3D propertiesDim pLayerExt As ILayerExtensions Dim p3DProps As I3DProperties If (Not pFLayer Is Nothing) Then Set pLayerExt = pLayer If (Not pLayerE

26、xt Is Nothing) Then Dim ext As Long For ext = 0 To pLayerExt.ExtensionCount - 1 Set p3DProps = pLayerExt.Extension(ext) If (Not p3DProps Is Nothing) Then Exit For End If Next ext End If End If set properties p3DProps.PropertyX = ValueOfX apply/invalidate p3DProps.Apply3DProperties get symbols of the

27、 layer Dim pSymArray As IArray Dim pDisplayListIDs As ILongArray pSG.GetOwnerSymbols pLayer, pSymArray, pDisplayListIDs change transparency of symbols (inside animation loop) Dim pSym As ISymbol Dim listID As Long Dim nSyms As Long nSyms = pSymArray.Count For s = 0 To nSyms - 1 symbol recording loop

28、 Set pSym = pSymArray.Element(s) listID = pDisplayListIDs.Element(s) pSG.RecordSymbol pSym, listID, bExtruded, bLighting, transp, False Next s 改变透明度和符号仅仅需要重建符号的缓存(改变透明度和符号仅仅需要重建符号的缓存(record)Dev sample: fading animation几何动画几何动画 对复杂几何无效对复杂几何无效 如果几何的结构是已知的并且脚本已获得,可更新顶如果几何的结构是已知的并且脚本已获得,可更新顶点坐标点坐标 否则,最好

29、让否则,最好让ArcScene为每一个动画框架重建几何为每一个动画框架重建几何Demo: mesh animation典型的动画脚本循环典型的动画脚本循环 使用消息分配器(使用消息分配器(message dispatcher)对象对象允许在动画过程中交互允许在动画过程中交互 在动画过程中使得在动画过程中使得 gestures 失效失效 pSceneViewer.GestureEnabled = False 如果需要重建显示缓存如果需要重建显示缓存 将将 “准备显示(准备显示(preparing display)”状态条信息设为状态条信息设为失效失效 使需要重建的图层刷新使需要重建的图层刷新 刷

30、新活动视窗刷新活动视窗(或全部视窗)或全部视窗)动画脚本动画脚本 Dim pDsp As IMessageDispatcher Set pDsp = New MessageDispatcher Dim bCancelled As Boolean bCancelled = False pSceneGraph.IsRecordingMessageEnabled = False disable message Do While (Not bCancelled) perform changes pSceneGraph.Invalidate pGLayer, True, False invalidate

31、 layers pSceneViewer.Redraw True refresh viewer(s) pDsp.Dispatch pViewer.hWnd, False, bCancelled Loop pSG.IsRecordingMessageEnabled = TrueCategory: DddAnimationTypesSceneIAnimationTracksAnimationTrackIAnimationTrackBookmark3D(camera keyframe)IKeyframeIBookmark3DIBookmarkToKeyframeLayerKeyframeIKeyfr

32、ameSceneKeyframeIKeyframeAnimationTypeCameraIAnimationTypeAnimationTypeLayerIAnimationTypeAnimationTypeSceneIAnimationType动画对象模型动画对象模型定制动画定制动画 我们可以从不同层次控制我们可以从不同层次控制 使用自由(使用自由(unbound)帧)帧 创建动画轨迹创建动画轨迹 将轨迹添加到文档将轨迹添加到文档 创建定制的播放创建定制的播放/导出工具导出工具 创建定制的动画类型创建定制的动画类型Demo: layer move动画的帧动画的帧 定义了一个对象在某一特定时刻的

33、状态定义了一个对象在某一特定时刻的状态 每种动画类型有一个帧类每种动画类型有一个帧类 基本的操作有基本的操作有 get/set 属性属性 从当前的对象状态捕捉从当前的对象状态捕捉 应用到对象应用到对象 在帧间插值在帧间插值 Example : 自由帧旋转图层KeyframeX 1ObjectX 1pKeyframe1.Apply动画的帧动画的帧 Example : 自由帧旋转图层 create keyframeDim pKeyframe as esri3Dext.LayerKeyframeSet pKeyframe = new LayerKeyframe set Z rotation valu

34、eDim pAngles As IPointSet pAngles = New PointpAngles.X = 0pAngles.Y = 0pAngles.Z = anglepKeyframe.PropertyValuePoint(4) = pAngles activate only that property (optional)Dim pProps As ILongArraySet pProps = New LongArraypProps.Add (4)pKeyframe.ActiveProperties = pProps apply itpKeyframe.Apply pScene,

35、pLayer 动画的帧动画的帧 Example : 用两帧制作旋转动画KeyframeX 1KeyframeX 2ObjectX 1t1t2tpKeyframe1.Interpolate动画的帧动画的帧 Example : 用两帧制作旋转动画 pKey1.TimeStamp = 0.2 start time pKey2.TimeStamp = 0.7 end time Dim pAnimType As IAnimationType get ref to animation type Set pAnimType = New AnimationTypeLayer LOOP TIME between

36、 start and end pAnimType.ResetObject pScene, pLayer reset object interpolate state of the object pKey1.Interpolate pScene, pLayer, 4, time, pKey2, pKey1, pKey2 refresh object If (pKey1.ObjectNeedsRefresh) Then pKey1.RefreshObject pScene, pLayer End If pSG.RefreshViewers END TIME LOOP动画的帧动画的帧动画轨迹动画轨迹

37、 处理多帧的一种更方便的方法 为所有的属性内置插值 轨迹是和一类动画相关的 轨迹绑定到一个或多个对象上 能被添加到场景,所以轨迹对于ArcScene GUI工具是可访问的SceneAnimationTrack 1KeyframeX 1KeyframeX n3ObjectX 1ObjectX n2AnimationTypeXAnimationTrack n1(Binding)动画轨迹动画轨迹SceneAnimationTrack 1KeyframeX 1KeyframeX n3ObjectX 1ObjectX n2t1tn3ti 0,1tpTrack1.InterpolateObjectProp

38、erties动画轨迹动画轨迹 Example: 创建一个轨迹并将它添加到场景 create an animation track Dim pAnimTrack As IAnimationTrack Set pAnimTrack = New AnimationTrack set the type before adding keyframes Dim pAnimType As IAnimationType Set pAnimType = New AnimationTypeLayer Set pAnimTrack.AnimationType = pAnimType add the track to

39、 the scene Dim pSceneTracks As IAnimationTracks Set pSceneTracks = pScene pSceneTracks.AddTrack pAnimTrack send event to inform GUI pActiveView.ContentsChanged 动画轨迹动画轨迹 Example: 创建一个轨迹,添加帧 Dim pKeyframe As iKeyframe Dim nKeyframes As Integer nKeyframes = 4 pAnimTrack.EvenTimeStamps = False to overri

40、de even time stamps Dim iKeyframe As Integer For iKeyframe = 0 To nKeyframes 1 add keyframes to the track Set pKeyframe = New LayerKeyframe pAnimTrack.InsertKeyframe pKeyframe, -1 insert last set time stamps pKeyframe.TimeStamp = 1# * iKeyframe / (nKeyframes - 1) set property values . Next iKeyframe

41、 动画轨迹动画轨迹 Example:创建轨迹 set active properties in the track (e.g. only rotation) Dim pProps As ILongArray Set pProps = New LongArray pProps.Add (4) pAnimTrack.ActiveProperties = pProps bind the track to the layer pAnimTrack.AttachObject pLayer动画轨迹动画轨迹 Example :演播单个轨迹(控制框架个数) Dim time As Double Dim ite

42、ration As Integer For iteration = 0 To 100 number of frames time = iteration / 100# reset object pAnimType.ResetObject pScene, pLayer interpolate object by using track pAnimTrack.InterpolateObjectProperties pScene, time pSG.RefreshViewers Next iteration 定制动画播放定制动画播放定制动画播放定制动画播放 Example :在场景中演播所有的轨迹(控制动画的持续时间) Dim duration As Double duration = 10 duration in sec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论