天天看點

[WorldWind學習]17.視域排程(視域體裁剪)

視域排程(視域體裁剪)

  在WW中使用者改變自己的的視角,紋理影像和高程會動态加載,在視野範圍内的影像和DEM顯示,超出視域範圍的瓦片則不顯示。不僅是瓦片,太陽、大氣網格、三維模型ModelFeature等都會相應的進行剔除。

  看了ROAM相關的的視域體裁剪論文,有好多采用的是将視域體投影的簡化算法。WW是否也是這樣?我原來以為是,後來在群裡和别人聊,說到了Frustum,才知道這個東西的作用。

  這裡涉及的類主要是World_Wind_1.4.0_Source\PluginSDK\ViewFrustum.cs檔案中的Frustum類。

  檢視Frustum類,包含公有字段public Plane[] planes = new Plane[6];可以知道WW的視域裁剪采用的是六面體來實作的。

該類實作的方法主要包括下面5個,後面四個主要是進行相交檢測和包含檢測:

public void Update(Matrix m);

public bool Intersects(BoundingSphere c);

public bool ContainsPoint(Vector3 v);

public bool Contains(BoundingBox bb);

public bool Intersects(BoundingBox bb);

調用了Frustum對象的類其實不多,不過Frustum的重要程度和CameraBase捆綁在一起。

  QuadTileSet類中的調用方式主要是通過調用camera.ViewFrustum來擷取并進行相關的判斷。在QuadTileSet中總共有3處地方可以查見camera.ViewFrustum,一個是在Update方法中,一個是在GetClosestDownloadRequest,還有一個是在ResetCacheForCurrentView方法中。

  QuadTile類中調用方式通過調用camera.ViewFrustum實作,主要在在Update方法中和Render方法中。