日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[WorldWind学习]17.视域调度(视域体裁剪)

發布時間:2025/6/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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的視域裁剪采用的是六面體來實現的。

1 using System; 2 using Microsoft.DirectX; 3 using Microsoft.DirectX.Direct3D; 4 5 namespace WorldWind 6 { 7 /// <summary> 8 /// The region of space in the modeled world that may appear on the screen; it is the field of view of the notional camera. 9 /// Used to perform culling of invisible object (prior to rendering) to increase speed. 10 /// See: http://en.wikipedia.org/wiki/Viewing_frustum 11 /// </summary> 12 public class Frustum 13 { 14 public Plane[] planes = new Plane[6]; 15 16 public void Update(Matrix m) 17 { 18 //bottom (down) plane 19 this.planes[0] = new Plane( 20 m.M14 + m.M12, //a 21 m.M24 + m.M22, //b 22 m.M34 + m.M32, //c 23 m.M44 + m.M42 //d 24 ); 25 26 //far plane 27 this.planes[1] = new Plane( 28 m.M14 - m.M13, 29 m.M24 - m.M23, 30 m.M34 - m.M33, 31 m.M44 - m.M43 32 ); 33 34 //right side plane 35 this.planes[2] = new Plane( 36 m.M14 - m.M11, //a 37 m.M24 - m.M21, //b 38 m.M34 - m.M31, //c 39 m.M44 - m.M41 //d 40 ); 41 42 //left side plane 43 this.planes[3] = new Plane( 44 m.M14 + m.M11, //a 45 m.M24 + m.M21, //b 46 m.M34 + m.M31, //c 47 m.M44 + m.M41 //d 48 ); 49 50 //near plane 51 this.planes[4] = new Plane( 52 m.M13, 53 m.M23, 54 m.M33, 55 m.M43); 56 57 //top (up) plane 58 this.planes[5] = new Plane( 59 m.M14 - m.M12, //a 60 m.M24 - m.M22, //b 61 m.M34 - m.M32, //c 62 m.M44 - m.M42 //d 63 ); 64 65 foreach(Plane p in this.planes) 66 p.Normalize(); 67 } 68 69 /// <summary> 70 /// Test if a sphere intersects or is completely inside the frustum. 71 /// </summary> 72 /// <returns>true when the sphere intersects.</returns> 73 public bool Intersects(BoundingSphere c) 74 { 75 foreach(Plane p in this.planes) 76 { 77 float distancePlaneToPoint = p.A * c.Center.X + p.B * c.Center.Y + p.C * c.Center.Z + p.D; 78 if(distancePlaneToPoint < -c.Radius) 79 // More than 1 radius outside the plane = outside 80 return false; 81 } 82 83 //else it's in view 84 return true; 85 } 86 87 /// <summary> 88 /// Test if a point is inside the frustum. 89 /// </summary> 90 /// <returns>true when the point is inside.</returns> 91 /// <param name="v">XYZ in world coordinates of the point to test.</param> 92 public bool ContainsPoint(Vector3 v) 93 { 94 foreach(Plane p in this.planes) 95 if(Vector3.Dot(new Vector3(p.A, p.B, p.C), v) + p.D < 0) 96 return false; 97 98 return true; 99 } 100 101 /// <summary> 102 /// Tests if the view frustum fully contains the bounding box. 103 /// </summary> 104 /// <returns>true when the box is complete enclosed by the frustum.</returns> 105 public bool Contains(BoundingBox bb) 106 { 107 //Code taken from Flip Code Article: 108 // http://www.flipcode.com/articles/article_frustumculling.shtml 109 int iTotalIn = 0; 110 foreach(Plane p in this.planes) 111 { 112 int iInCount = 8; 113 int iPtIn = 1; 114 // TODO: Modify bounding box and only check 2 corners. 115 for(int i = 0; i < 8; i++) 116 { 117 if(Vector3.Dot(new Vector3(p.A,p.B,p.C), bb.corners[i]) + p.D < 0) 118 { 119 iPtIn = 0; 120 --iInCount; 121 } 122 } 123 124 if(iInCount == 0) 125 return false; 126 127 iTotalIn += iPtIn; 128 } 129 130 if(iTotalIn == 6) 131 return true; 132 133 return false; 134 } 135 136 /// <summary> 137 /// Tests if the bounding box specified intersects with or is fully contained in the frustum. 138 /// </summary> 139 /// <returns>true when the box intersects with the frustum.</returns> 140 public bool Intersects(BoundingBox bb) 141 { 142 foreach(Plane p in this.planes) 143 { 144 Vector3 v = new Vector3(p.A,p.B,p.C); 145 bool isInside = false; 146 // TODO: Modify bounding box and only check 2 corners. 147 for(int i = 0; i < 8; i++) 148 { 149 if(Vector3.Dot(v, bb.corners[i]) + p.D >= 0) 150 { 151 isInside = true; 152 break; 153 } 154 } 155 156 if(!isInside) 157 return false; 158 } 159 160 return true; 161 } 162 163 public override string ToString() 164 { 165 string res = string.Format("Near:\n{0}Far:\n{1}", planes[4], planes[1] ); 166 return res; 167 } 168 } 169 }

該類實現的方法主要包括下面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方法中。

轉載于:https://www.cnblogs.com/yhlx125/archive/2013/05/29/3103333.html

總結

以上是生活随笔為你收集整理的[WorldWind学习]17.视域调度(视域体裁剪)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本美女影院 | 色屁屁一区二区三区视频 | 99黄色| 成人欧美在线观看 | 巨乳美女在线 | 日韩综合一区二区 | 国产中文字幕一区 | 一区二区三区四区在线观看视频 | 色av免费| 中文字幕色片 | 黄瓜视频色 | 国产精品7777 | 在线小视频 | 福利久久久 | 爱上av | 在线播放你懂的 | 日日干夜夜爽 | 国产人妖在线 | 亚洲精品在线免费观看视频 | 日本视频黄色 | 欧美69精品久久久久久不卡 | 无码精品一区二区三区在线播放 | 自拍偷拍亚洲一区 | 日韩精品 欧美 | 国精产品99永久一区一区 | 国产91精品一区二区 | 麻豆传媒mv | 99这里只有| 日韩黄色一级大片 | 欧美高清日韩 | 欧美黑人做爰爽爽爽 | 少妇2做爰bd在线意大利堕落 | 蜜臀av性久久久久蜜臀av麻豆 | 一本色道久久88综合无码 | 四虎在线免费播放 | 日韩一区二区三区视频在线观看 | 91caob| 在线视频免费观看 | 高清久久久久久 | 自由 日本语 热 亚洲人 | 精品国产二区三区 | 爱久久 | 中文字幕一区2区3区 | 久草精品视频在线观看 | 国产 欧美 日韩 在线 | 精品视频在线观看一区二区 | 亚洲色图21p | 久久66热这里只有精品 | 91视频www| 午夜欧美激情 | 日本色偷偷 | 国产私拍| 欧美亚洲图片小说 | 狠狠躁夜夜躁人 | 欧美日韩视频网站 | 深夜视频在线观看免费 | 欧美大片黄色 | 欧美日韩亚洲国产 | 国产色91 | 2018自拍偷拍 | 国产精品91在线观看 | 毛片av在线观看 | 99久久久久久 | 国产污视频在线看 | 男人天堂一区二区 | 农村寡妇一区二区三区 | 日韩亚洲区 | 久久99热这里只有精品 | 99在线精品观看 | 女仆乖h调教跪趴1v1 | 亚洲免费视频网站 | 99热精品在线播放 | 国产情侣一区二区 | 欧美性大战久久久 | 韩国三级hd中文字幕有哪些 | 天天看夜夜看 | 久久精品导航 | 午夜爽视频 | 嫩模一区二区三区 | 五月天色综合 | 亚洲av中文无码乱人伦在线观看 | 国产又粗又黄又爽视频 | 成人导航网站 | 丁香婷婷综合激情 | 亚洲黄a | 激情文学欧美 | 美女av一区| 欧美日韩中文字幕视频 | 蜜臀av午夜精品 | 欧美一区欧美二区 | av中文字幕在线免费观看 | 玖玖成人 | 无码国精品一区二区免费蜜桃 | 91免费国产在线观看 | 午夜爱| 贝利弗山的秘密在线观看 | jizz成人| 青青青草国产 | 日韩性网站 |