Cesium 计算模型部分体积

有时我们加载成功一个3dtiles模型之后,有时会有对模型体积进行计算的需求。今天花了点时间来写了这个功能,目前还没测试误差有多大。后面测试了再完善一下。说到原理其实和填挖方的原理差不多。

先看下效果:目前是在模型上绘制完面之后,alert了一下体积。

再看下模型侧面:

核心思想就是微分,webgl里的最小图元是三角形,故将这个面微分成多个三角形,然后计算每个三角形的面及每个三角形对应的高,即计算出对应的体积了。

重点是在将多边形转化为三角形。

以下晒出部分代码:

for (var index = 0; index < indices.length; index = index + 3) {//计算图元三个点的坐标var first = indices[index];var second = indices[index + 1];var third = indices[index + 2];var cartesian1 = new Cesium.Cartesian3(attrPosition.values[first * 3], geom.attributes.position.values[first * 3 + 1], attrPosition.values[first * 3 +2]);var h1 = viewer.scene.sampleHeight(Cesium.Cartographic.fromCartesian(cartesian1));var cartesian2 = new Cesium.Cartesian3(attrPosition.values[second * 3], geom.attributes.position.values[second * 3 + 1],attrPosition.values[second *3 + 2]);var h2 = viewer.scene.sampleHeight(Cesium.Cartographic.fromCartesian(cartesian2));var cartesian3 = new Cesium.Cartesian3(geom.attributes.position.values[third * 3], geom.attributes.position.values[third * 3 + 1],attrPosition.values[third * 3 +2]);var h3 = viewer.scene.sampleHeight(Cesium.Cartographic.fromCartesian(cartesian3));//计算每个图元的平均高度var height = (h1 + h2 + h3 - 3 * minHeight) / 3;console.log(height);var area = computeAreaOfTriangle(cartesian1, cartesian2, cartesian3);var v = area * height;totalArea += area;totalV += v;var cartographic = Cesium.Cartographic.fromCartesian(cartesian1);var newC3 = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, (h1 +h2 + h3) / 3);viewer.entities.add({position: newC3,point: {color: new Cesium.Color.fromCssColorString("#3388ff"),pixelSize: 10,outlineColor: new Cesium.Color.fromCssColorString("#ffffff"),outlineWidth: 2,}})}

此处受多方面因素影响,测量的体积肯定是有一定的误差的,至于误差的大小,可以通过调整微分的程度来进行优化。

有需要或者想研究的小伙伴可以私聊我:q 951973194 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部