Javascript 如何使铯点随地图旋转?

Javascript 如何使铯点随地图旋转?,javascript,angularjs,html,cesium,Javascript,Angularjs,Html,Cesium,我正在构建铯应用程序,我需要我的点来指示旋转航向。我正在使用广告牌来显示我创建的用于显示此标题的图像;但是,当我旋转地球仪时,这些点不会随地球仪一起旋转,这使得航向指示器不正确 换句话说,我的广告牌的旋转与屏幕空间保持一致,但与地球仪不一致 这是纽约的鸟瞰图。讨论中的点位于图像的左下角。请注意,航向指示器指向东北方向 这是同一个视图,但旋转了180度,所以上面是南方。现在,航向指示器仍然指向屏幕的西北部,但我需要它指向地球的东北部,即曼哈顿 以下是显示点的代码: var entity = {

我正在构建铯应用程序,我需要我的点来指示旋转航向。我正在使用广告牌来显示我创建的用于显示此标题的图像;但是,当我旋转地球仪时,这些点不会随地球仪一起旋转,这使得航向指示器不正确

换句话说,我的广告牌的旋转与屏幕空间保持一致,但与地球仪不一致

这是纽约的鸟瞰图。讨论中的点位于图像的左下角。请注意,航向指示器指向东北方向

这是同一个视图,但旋转了180度,所以上面是南方。现在,航向指示器仍然指向屏幕的西北部,但我需要它指向地球的东北部,即曼哈顿

以下是显示点的代码:

var entity = {
    id: data.cluster_number + '_' + point.id,
    name: point.id,
    position: Cesium.Cartesian3.fromDegrees(point.lon, point.lat),
    billboard: {
        image: 'assets/img/point.png',
        color: color,
        rotation: -1 * toRadians(point.heading),
        scale: point.size * 0.07
    }
};

if (!angular.isDefined(viewer.entities.getById(entity.id))) {
    viewer.entities.add(entity);
}

让点随地球仪/地图旋转的最简单/最有效的方法是什么?

您需要做一些事情

1-将布告牌的旋转属性更新为“旋转”

2-需要根据点的标题更新点的标题属性

3-您需要在某个时间间隔内更新该点,或者使用铯时钟:

mapContext.clock.onTick.addEventListener(function() {...});
或者使用JavaScripts
setInterval

一旦在这里设置好了,它就是如何工作的。 地图上的广告牌将继续从该点拉动旋转,如果旋转发生变化,它将更新地图上的广告牌。每次间隔或时钟滴答作响时,所使用的值都会根据相机的航向发生变化


注意:相机上的标题属性以弧度为单位。

将广告牌的对齐轴设置为Cesium.Cartesian3.UNIT_Z,而不是默认的屏幕上方向向量。在SandCastle中运行以下示例以演示其工作原理:

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

var position = Cesium.Cartesian3.fromDegrees(-111.572177, 40.582083);

var cesiumTerrainProviderMeshes = new Cesium.CesiumTerrainProvider(
{ url : '//assets.agi.com/stk-terrain/world' } 
);
 //viewer.terrainProvider = cesiumTerrainProviderMeshes;
 //viewer.scene.globe.depthTestAgainstTerrain = true;

var ellipsoid = viewer.scene.globe.ellipsoid;
 var billboardCollection = viewer.scene.primitives.add(new Cesium.BillboardCollection(
{ scene : viewer.scene } 
));

billboardCollection.add(
{ position : position, image : '../images/facility.gif', //heightReference : Cesium.HeightReference.CLAMP_TO_GROUND, rotation: Cesium.Math.PI/4, alignedAxis : Cesium.Cartesian3.UNIT_Z } 
);

我对铯一无所知,但从数学上看,
-1*角度
与旋转半圈不同。这是一个反射角,所以1度变成-1,45度变成-45,等等。你可能想要
旋转:Cesium.Math.PI+toRadians(point.heading)
(因为2π是全旋转,所以加上π会增加半旋转)铯元素广告牌的旋转特性是从北开始,逆时针旋转。我的角度表示从北开始顺时针方向的角度。-1用于说明该冲销。角度是正确的,我只是有旋转的问题。这真的能以最好的方式解决问题吗?每次强制重画可能会在几点上奏效,但如果你有一百个,你就有可能减慢应用程序的速度。铯api就是这样编写的。它的性能非常好。
mapContext.clock.onTick.addEventListener(function() {...});
var viewer = new Cesium.Viewer('cesiumContainer');

var position = Cesium.Cartesian3.fromDegrees(-111.572177, 40.582083);

var cesiumTerrainProviderMeshes = new Cesium.CesiumTerrainProvider(
{ url : '//assets.agi.com/stk-terrain/world' } 
);
 //viewer.terrainProvider = cesiumTerrainProviderMeshes;
 //viewer.scene.globe.depthTestAgainstTerrain = true;

var ellipsoid = viewer.scene.globe.ellipsoid;
 var billboardCollection = viewer.scene.primitives.add(new Cesium.BillboardCollection(
{ scene : viewer.scene } 
));

billboardCollection.add(
{ position : position, image : '../images/facility.gif', //heightReference : Cesium.HeightReference.CLAMP_TO_GROUND, rotation: Cesium.Math.PI/4, alignedAxis : Cesium.Cartesian3.UNIT_Z } 
);