0

大家好,

我已经使用 Cesium 工作了一段时间,并且在使用 Primitive Collections 时就开始了。我曾经单击并拖动原始渲染工作,但现在我想升级 Cesium 并继续使用实体。我移动了代码,重构了,可以点击和拖动来绘制形状;但是,在我能够翻转异步标志之前,它会在我移动鼠标时呈现。现在,我无法做到这一点。我尝试将查看器上的“allowDataSourcesToSuspendAnimation”设置为 false,但无济于事。任何帮助将不胜感激。

在我的天真中,我忘记在我的问题中添加代码片段。这是一个时钟滴答事件侦听器,仅在鼠标按下时触发(布尔值设置为 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;
                                }
4

1 回答 1

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鼠标向上。

于 2015-03-11T18:48:13.203 回答