美好的一天,
我现在已经和Cesium合作过了一段时间,当我开始使用Primitive Collections时,我就开始了。我点击并拖动原始渲染工作,但现在我想升级Cesium并转移到实体。我移动了代码,重构了,可以点击并拖动来绘制形状;然而,在我能够翻转异步标志之前,它会在我移动鼠标时呈现。现在,我无法做到这一点。我尝试设置' allowDataSourcesToSuspendAnimation'在观众身上虚假,但无济于事。任何帮助都将非常感激。
在我天真的时候,我忘记在我的问题中添加一个代码段。这是一个时钟滴答事件监听器,仅在发生鼠标停止时触发(布尔值设置为true)
var radius = Cesium.Cartesian3.distance(cartesianStartMousePosition, cartesianMousePosition);
if (radius > 0) {
if (currentEntity && currentEntity.id) {
currentEntity.position = cartesianStartMousePosition;
currentEntity.ellipse = {
semiMinorAxis: radius,
semiMajorAxis: radius,
material: new Cesium.ColorMaterialProperty(myColor)
};
currentEntity.label = {
text: 'New Overlay',
scale: 0.35
};
overlayEntities.resumeEvents();
}
else {
currentEntity = new Cesium.Entity({
position: cartesianStartMousePosition,
ellipse: {
semiMinorAxis: radius,
semiMajorAxis: radius,
material: new Cesium.ColorMaterialProperty(myColor)
},
label: {
text: 'New Overlay',
scale: 0.35
},
isSaved: false
});
overlayEntities.add(currentEntity);
}
bDrewPrim = true;
}
答案 0 :(得分:0)
在我看来,你做了太多工作来更新实体。您只需要设置已更改的值,并且只有在更改足够大以保证图形更新时才应该这样做。尝试使用以下内容替换if
语句的上半部分:
var lastRadius = 0;
...
if (radius > 0 && !Cesium.Math.equalsEpsilon(radius, lastRadius, Cesium.Math.EPSILON2)) {
lastRadius = radius;
if (currentEntity && currentEntity.id) {
currentEntity.ellipse.semiMinorAxis = radius;
currentEntity.ellipse.semiMajorAxis = radius;
} else {
// Same as before...
我相信椭球原语是在工作线程上构建的,所以这段代码试图避免在每次滴答时设置新的radius
,除非对它进行了真正的更改。
此外,您不会显示鼠标按下处理程序,但如果您尚未设置此标记,请确保设置此标记:
viewer.scene.screenSpaceCameraController.enableInputs = false;
当您拖动选择椭圆时,这会阻止地球旋转。您可以在鼠标移动时将其重置为true
。