如何控制 Cesium3DTileset 中图元的可见性
How to control visibility of primitives from Cesium3DTileset
如何正确控制来自Cesium3DTileset
的图元的可见性?
首先,我在 HTML
中创建了一个复选框元素,并创建了一个复选框 addEventListener
来控制本地 geojson
文件中 DataSource 的可见性。而且进展顺利。
然后我做了同样的事情来控制是否需要显示我的 Cesium ion 帐户中的 3DTile
。在第一次检查和取消检查时,一切顺利。但是当我第二次选中该框时,场景中什么也没有出现。并且第二次取消选中时什么也不做,也没有错误。
//this is my checkbox elements
<input type="checkbox" id="showCheckbox1" > geojson1<br>
<input type="checkbox" id="showCheckbox2" > geojson2<br>
<input type="checkbox" id="showCheckbox_1" > ion_1<br>
<input type="checkbox" id="showCheckbox_2" > ion_2<br>
//this is my first try to control the visibility of geojson, and it goes well
var obj1 = new Cesium.GeoJsonDataSource();
obj.load('../DataSource/GeoJson/airport_cesium2.geojson')
var obj2 = new Cesium.GeoJsonDataSource();
obj2.load('../DataSource/GeoJson/LiangMau.geojson')
function handleCheckbox(id,datasource){
var checkbox = document.getElementById(id);
checkbox.addEventListener('change', function() {
// Checkbox state changed.
if (checkbox.checked) {
// Show if not shown.
if (!viewer.dataSources.contains(datasource)) {
viewer.dataSources.add(datasource);
}
} else {
// Hide if currently shown.
if (viewer.dataSources.contains(datasource)) {
viewer.dataSources.remove(datasource);
}
}
}, false);
}
handleCheckbox('showCheckbox1',obj1)
handleCheckbox('showCheckbox2',obj2)
//then I try to control the visibility of 3DTile
var obj_1 = new Cesium.Cesium3DTileset({
url: Cesium.IonResource.fromAssetId(35386)
})
var obj_2 = new Cesium.Cesium3DTileset({
url: Cesium.IonResource.fromAssetId(35381)
})
function handleCheckbox_(id,datasource){
var checkbox = document.getElementById(id);
checkbox.addEventListener('change', function() {
// Checkbox state changed.
if (checkbox.checked) {
// Show if not shown.
if (!scene.primitives.contains(datasource)) {
scene.primitives.add(datasource);
}
} else {
// Hide if currently shown.
if (scene.primitives.contains(datasource)) {
scene.primitives.remove(datasource);
}
}
}, false);
}
handleCheckbox_('showCheckbox_1',obj_1)
handleCheckbox_('showCheckbox_2',obj_2)
我可以在第一次选中和取消选中时控制3DTile
的可见性,但是第二次没有任何反应。真的很困惑,因为没有错误显示,我不知道下一步该怎么做。
正如评论中提到的,答案是设置 dataSource.show
标志来切换可见性。多次添加和删除相同的数据源是问题所在,因为通常在删除数据源时它会被销毁。因此,首选使用 show
标志切换可见性。
如何正确控制来自Cesium3DTileset
的图元的可见性?
首先,我在 HTML
中创建了一个复选框元素,并创建了一个复选框 addEventListener
来控制本地 geojson
文件中 DataSource 的可见性。而且进展顺利。
然后我做了同样的事情来控制是否需要显示我的 Cesium ion 帐户中的 3DTile
。在第一次检查和取消检查时,一切顺利。但是当我第二次选中该框时,场景中什么也没有出现。并且第二次取消选中时什么也不做,也没有错误。
//this is my checkbox elements
<input type="checkbox" id="showCheckbox1" > geojson1<br>
<input type="checkbox" id="showCheckbox2" > geojson2<br>
<input type="checkbox" id="showCheckbox_1" > ion_1<br>
<input type="checkbox" id="showCheckbox_2" > ion_2<br>
//this is my first try to control the visibility of geojson, and it goes well
var obj1 = new Cesium.GeoJsonDataSource();
obj.load('../DataSource/GeoJson/airport_cesium2.geojson')
var obj2 = new Cesium.GeoJsonDataSource();
obj2.load('../DataSource/GeoJson/LiangMau.geojson')
function handleCheckbox(id,datasource){
var checkbox = document.getElementById(id);
checkbox.addEventListener('change', function() {
// Checkbox state changed.
if (checkbox.checked) {
// Show if not shown.
if (!viewer.dataSources.contains(datasource)) {
viewer.dataSources.add(datasource);
}
} else {
// Hide if currently shown.
if (viewer.dataSources.contains(datasource)) {
viewer.dataSources.remove(datasource);
}
}
}, false);
}
handleCheckbox('showCheckbox1',obj1)
handleCheckbox('showCheckbox2',obj2)
//then I try to control the visibility of 3DTile
var obj_1 = new Cesium.Cesium3DTileset({
url: Cesium.IonResource.fromAssetId(35386)
})
var obj_2 = new Cesium.Cesium3DTileset({
url: Cesium.IonResource.fromAssetId(35381)
})
function handleCheckbox_(id,datasource){
var checkbox = document.getElementById(id);
checkbox.addEventListener('change', function() {
// Checkbox state changed.
if (checkbox.checked) {
// Show if not shown.
if (!scene.primitives.contains(datasource)) {
scene.primitives.add(datasource);
}
} else {
// Hide if currently shown.
if (scene.primitives.contains(datasource)) {
scene.primitives.remove(datasource);
}
}
}, false);
}
handleCheckbox_('showCheckbox_1',obj_1)
handleCheckbox_('showCheckbox_2',obj_2)
我可以在第一次选中和取消选中时控制3DTile
的可见性,但是第二次没有任何反应。真的很困惑,因为没有错误显示,我不知道下一步该怎么做。
正如评论中提到的,答案是设置 dataSource.show
标志来切换可见性。多次添加和删除相同的数据源是问题所在,因为通常在删除数据源时它会被销毁。因此,首选使用 show
标志切换可见性。