一、可視域分析介紹
包括地形、建築等自然和人造物體會對視線產生遮擋,而對於部分應用場景,比如軍事、城市規劃等領域,需要進行可視域分析。可視域分析可以得到一個點或者某一區域的可見性,進而做到一系列的應用,比如軍事作戰中的掩護和微微,城市規劃中的最優視覺塔及攝影點的選擇等。
由於3D模型具有真實感,因此,在3D模型上進行可視域分析比在2D圖像上分析更加直觀,能夠更好的提高分析的效果。而Cesium是一款基於WebGL的開源虛擬地球儀,能夠提供瀏覽器端的3D模型可視化功能,因此,Cesium作為3D可視化工具之一,提供額外的API來進行3D場景下的可視域分析。
二、Cesium的可視域分析原理
Cesium的可視域分析API是基於射線追蹤算法實現的,具體算法如下:
// 輸入
var origin = Cesium.Cartesian3.fromDegrees(-95.0, 40.0, 0.0);
var heading = Cesium.Math.toRadians(0.0);
var pitch = Cesium.Math.toRadians(0.0);
var roll = Cesium.Math.toRadians(0.0);
var hfov = Cesium.Math.toRadians(60.0);
// 輸出
var visibleWindow = camera.computeViewRectangle(scene.globe.ellipsoid);
// 射線追蹤算法
var ray = new Cesium.Ray(origin, camera.direction);
var intersection = scene.globe.pick(ray, scene);
if (intersection) {
var range = Cesium.Cartesian3.distance(intersection, origin);
var aspectRatio = canvas.width / canvas.height;
var verticalFov = Cesium.Math.atan(Cesium.Math.tan(hfov*0.5) / aspectRatio);
var horizontalFov = 2 * Cesium.Math.atan(Cesium.Math.tan(verticalFov*0.5) * aspectRatio);
var fov = Math.min(hfov, horizontalFov);
var angle = 2 * Cesium.Math.atan(viewHeight / (2 * range));
var radius = range * Math.sin(fov*0.5) / Math.sin(angle*0.5);
visibleWindow = getCorners(origin, camera.direction, radius, aspectRatio, scene.globe.ellipsoid);
}
該算法首先獲取相機的位置和視角參數,然後獲取以該位置和相機參數為輸入的可視範圍,接着根據射線追蹤算法計算可視域範圍。該算法根據相機位置和視角參數計算出一條射線,然後在地球模型上進行碰撞檢測,獲取射線與地球模型的交點,然後根據交點和相機位置計算出可視域範圍。
三、Cesium可視域分析功能實現
1、顯示可視域
利用Cesium內置的Primitive類型來應用的位置的範圍來可視化可視域。代碼如下:
var target = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
var radius = Cesium.Cartesian3.distance(camera.position, target);
var visibleArea = new Cesium.Primitive({
geometryInstances: new Cesium.GeometryInstance({
geometry: new Cesium.CircleGeometry({
center : target,
radius : radius,
vertexFormat : Cesium.VertexFormat.POSITION_ONLY
})
}),
appearance: new Cesium.EllipsoidSurfaceAppearance({
aboveGround : false
}),
show : true
});
scene.primitives.add(visibleArea);
2、計算可視域範圍
獲取可視域範圍的方法是根據射線追蹤算法,計算射線與地球模型的交點,也就是獲取在地球模型上的可視區域。
var pickRay = camera.getPickRay(new Cesium.Cartesian2(0, 0)); var intersection = scene.globe.pick(pickRay, viewer.scene); var position = Cesium.Ellipsoid.WGS84.cartesianToCartographic(intersection);
3、計算測量高度角
根據可視域向量來確定測量高度角。
var globe = viewer.scene.globe;
var ellipsoid = globe.ellipsoid;
var positionCartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position);
var positionHeight = positionCartographic.height;
var cameraCartographic = globe.ellipsoid.cartesianToCartographic(camera.position);
var cameraHeight = cameraCartographic.height;
var relativeHeight = positionHeight - cameraHeight;
// 補償半徑高度
var offsetHeight = relativeHeight + ellipsoid.radii.x;
if (offsetHeight < 0) {
offsetHeight = relativeHeight - ellipsoid.radii.x;
}
// 計算高度角
var maxAngle = Math.atan2(offsetHeight, positionCartographic.distance(cameraCartographic));
4、計算水平範圍
根據可視域向量計算水平範圍。
// 計算方位角
var cameraHeading = camera.heading;
if (cameraHeading < 0) cameraHeading += 2 * Math.PI;
var targetPos = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
var targetPosCartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(targetPos);
var bearing = getBearing(cameraCartographic, targetPosCartographic);
if (bearing 360.0) left -= 360.0;
if (right > 360.0) right -= 360.0;
if (right < left) {
var tmp = left;
left = right;
right = tmp + 360.0;
}
四、Cesium可視域分析應用場景
1、軍事作戰
軍事作戰中,敵軍的可視域是非常重要的信息。因此,通過Cesium對3D模型進行可視域分析,可以更加直觀地顯示敵人的視野範圍,從而更好地做出反應。
2、城市規劃
在城市規劃領域中,3D模型中的可視域分析可以幫助規劃者更好地確定市區的建築和道路的布局,找到最優的視覺塔和攝影點,使得城市布局更加合理和完美。
3、自然資源管理
在自然資源管理領域中,可視域分析可以幫助環保人員更好地解決難題。舉個例子,德州市林業部門利用可視域分析方法來監測野生大熊貓棲息地的違法行為,包括非法伐木和非法盜貓情況。
結論
總的來說,Cesium的可視域分析API是基於射線追蹤算法實現的,可以幫助用戶更加方便地完成可視域分析,適用于軍事作戰、城市規劃、自然資源管理等領域。
原創文章,作者:LVRZM,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/333854.html
微信掃一掃
支付寶掃一掃