gpt4 book ai didi

javascript - Cesium DataSourceCollection层排序

转载 作者:数据小太阳 更新时间:2023-10-29 06:10:33 26 4
gpt4 key购买 nike

我有多个 GeoJsonDataSource 对象,我想将它们放在 Cesium 地球仪上。问题是,如果它们重叠,我会遇到一些 z-fighting 问题,我无法调整它们的顺序。

有没有一种方法可以指定DataSourceCollectionDataSource 对象的顺序?

例如,我想使用以下代码将绿色多边形置于红色多边形之上:

var viewer = new Cesium.Viewer('cesiumContainer');

var red = Cesium.GeoJsonDataSource.load('map1.geojson', {
fill: new Cesium.Color(1, 0, 0, 1.0)
});

var green = Cesium.GeoJsonDataSource.load('map2.geojson', {
fill: new Cesium.Color(0, 1, 0, 1.0)
});

viewer.dataSources.add(red);
viewer.dataSources.add(green);

但是,结果是这样的:

Cesium screenshot showing z-fighting

我注意到,如果我将 alpha 参数调整为小于 1.0,我可以修复 z-fighting,但顺序仍然没有得到解决。

最佳答案

12/2019 更新:

Cesium 已经在 PolygonGraphics 中添加了一个 zIndex 属性,因为这最初是被问到的。它仅对“地面基元”有效,例如直接位于地形上且未分配给它们的 heightextrudedHeight 属性的多边形。对于那些,请使用下面我的原始答案。但是对于地面图元,您现在可以像这样分配一个 zIndex:

var viewer = new Cesium.Viewer('cesiumContainer');

var redPolygon = viewer.entities.add({
name : 'Red polygon',
polygon : {
hierarchy : Cesium.Cartesian3.fromDegreesArray([-115.0, 37.0,
-115.0, 32.0,
-102.0, 31.0,
-102.0, 38.0]),
material : new Cesium.Color(1, 0, 0),
zindex : 1
}
});

var greenPolygon = viewer.entities.add({
name : 'Green polygon',
polygon : {
hierarchy : Cesium.Cartesian3.fromDegreesArray([-118.0, 42.0,
-100.0, 42.0,
-104.0, 32.0]),
material : new Cesium.Color(0, 1, 0),
zIndex : 2
}
});

viewer.zoomTo(viewer.entities);

原答案:

在问题的底部,您提到了 z-fighting 的快速修复是通过设置一些透明度来简单地关闭这些多边形的 Z 缓冲区。透明度发生在 8 位 Alpha channel 中,所以我最喜欢使用的值是 254.0/255.0,或 0.996

但是您可能想要关闭另一个选项,那就是 orderIndependentTranslucency。这是 Scene 的属性,可以从 Viewer 的构造函数中的选项参数进行初始化。当启用时,支持它的系统的默认设置,无论不透明度如何,都可以始终“看到”其他半透明对象后面的半透明对象,当然渲染顺序不会影响结果。但在这种情况下,如果您希望一个多边形遮挡另一个多边形,您希望渲染顺序影响结果。

这是一个例子。单击底部的“运行代码片段”,或仅将 JavaScript 部分粘贴到 Sandcastle 中。

var viewer = new Cesium.Viewer('cesiumContainer', {
navigationInstructionsInitiallyVisible: false, animation: false, timeline: false,

// The next line is the important option for this demo.
// Test how this looks with both "true" and "false" here.
orderIndependentTranslucency: false
});

var redPolygon = viewer.entities.add({
name : 'Red polygon',
polygon : {
hierarchy : Cesium.Cartesian3.fromDegreesArray([-115.0, 37.0,
-115.0, 32.0,
-102.0, 31.0,
-102.0, 38.0]),
// The alpha of 0.996 turns off the Z buffer.
material : new Cesium.Color(1, 0, 0, 0.996)
}
});

var greenPolygon = viewer.entities.add({
name : 'Green polygon',
polygon : {
hierarchy : Cesium.Cartesian3.fromDegreesArray([-118.0, 42.0,
-100.0, 42.0,
-104.0, 32.0]),
// The alpha of 0.996 turns off the Z buffer.
material : new Cesium.Color(0, 1, 0, 0.996)
}
});

viewer.zoomTo(viewer.entities);
html, body, #cesiumContainer {
width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden;
font-family: sans-serif;
}
<link href="http://cesiumjs.org/releases/1.19/Build/Cesium/Widgets/widgets.css" 
rel="stylesheet"/>
<script src="http://cesiumjs.org/releases/1.19/Build/Cesium/Cesium.js">
</script>
<div id="cesiumContainer"></div>

关于javascript - Cesium DataSourceCollection层排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36133013/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com