цезий - движущиеся рекламные щиты

Я тестирую Cesiumjs, чтобы увидеть, может ли он отражать опыт почти в реальном времени, например: положение самолетов.

Для этого мне нужно нарисовать рекламные щиты и заставить их двигаться — я знаю, что это возможно с цезием, но не знаю, как это сделать.

Код выглядит следующим образом:

var billboards = scene.primitives.add(new Cesium.BillboardCollection());
var billboard = {
    image : '/path/to/logo.png',
    position : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)
};
billboards.add(billboard);

Мой вопрос заключается в том, как изменить положение рекламного щита. Я не мог найти документацию муравья, которая объясняла бы.

Я думал делать:

billboard.position = ... //new position

но как цезий узнает, что я изменил атрибут положения, если он каким-то образом не превратит эту ссылку в наблюдаемый объект.

Итак, как мне обновить местоположение?

Спасибо.


person user967710    schedule 14.07.2015    source источник


Ответы (1)


Cesium действительно прослушивает изменения в billboard.position (исходный код здесь), поэтому приложения должны просто писать новую позицию.

Обратите внимание, что вы должны указать всю позицию сразу, то есть вы не можете не писать в billboard.position.x. Вместо этого держите «скретч» Cartesian3 (не создавайте new один для каждого кадра анимации со скоростью 60 кадров в секунду), напишите в свойствах x,y,z вашей скретч-переменной, а затем назначьте свою скретч-переменную billboard.position. Вы можете видеть в исходном коде, что назначенное значение будет клонировано в другой ранее существовавший Cartesian3, так что вы можете сразу повторно использовать временную переменную.

Вот пример:

// Just once at app startup.  Don't call "new" at 60fps.
var scratchCartesian3 = new Cesium.Cartesian3();

var ellipsoid = viewer.scene.mapProjection.ellipsoid;

function onTick() {
    // This is safe to call at 60fps.
    billboard.position = Cesium.Cartesian3.fromDegrees(
        lon, lat, alt, ellipsoid, scratchCartesian3);
}

Также обратите внимание, что ваш вопрос и приведенный выше ответ сосредоточены на слое «Graphics Primitive» Cesium API. У Cesium есть один более высокий уровень, называемый API Entity, который вы можете использовать. если вы хотите, чтобы Cesium обрабатывал концепцию выбираемых пользователем объектов с всплывающими описаниями и т. д. Вот демонстрация Sandcastle, показывающая, как добавить рекламный щит как свойство объекта, а не как примитив. Это позволяет вам добавлять другие свойства к одному и тому же объекту, например, имя, описание, метку, 3D-модель и т. д., и управлять ими всеми из одного и того же свойства положения, а Cesium позаботится о всплывающих описаниях. Свойство position более сложное для сущностей, чем для примитивов, например, оно может быть constant или по выборке. Это позволяет сущностям изменять положение с течением времени, когда отображается временная шкала.

person emackey    schedule 14.07.2015
comment
Только система виджетов Cesium использует Knockout, она нигде не используется в Primitive или Entity API. Установка позиции рекламного щита приводит к установке грязного флага, поэтому Cesium знает, как его обновить. - person Matthew Amato; 14.07.2015
comment
Спасибо за разъяснение, я отредактировал формулировку в ответе. - person emackey; 15.07.2015