2016-11-01 3 views
1

Je suis un total noob à Cesium alors pardonnez-moi pour toute bêtise. J'essaie d'écrire une application qui transmet les données de position et d'orientation au Césium, où elle est tracée en temps réel avec un chemin montrant où elle a été. J'ai un problème où il y a un bégaiement visuel de l'entité, presque certainement causé par le fait que la propriété entity.position est mise à jour plus rapidement que l'appel draw peut s'exécuter. J'avais le même problème avec le chemin polyligne, mais trouvé un extrait de code qui fixe pour moi:Césium Mise à jour dynamique des entités à partir de flux de données externes

var pathtrace = new Cesium.PolylineCollection(); 

primitives = viewer.scene.primitives; 

var objpath = pathtrace.add({ 
name : 'Path', 
polyline : { 
     positions : Cesium.Cartesian3.fromDegreesArrayHeights([0, 0, 0, 
                  0, 0, 0]) 
    } 
}); 
primitives.add(pathtrace); 

...Inside loop... 

data = JSON.parse(result.data); 
objpos = data.concat(objpos); 
objpath.positions = Cesium.Cartesian3.fromDegreesArrayHeights(objpos); 

Cependant, je suis incapable de trouver quoi que ce soit avec les mêmes fonctionnalités que PolylineCollection pour optimiser l'entité dynamique mise à jour. En ce moment j'emploie:

var vehicle = viewer.entities.add({ 
    name : "Vehicle", 
    position : Cesium.Cartesian3.fromDegrees(0, 0), 
    orientation : orientation, 
    model : { 
     url : url, 
     minimumPixelSize : 50 
    } 
}); 

...Inside loop... 

vehicle.position = Cesium.Cartesian3.fromDegrees(data[0], data[1], data[2]); 

... qui fait que l'entité saute d'avant en arrière pendant qu'elle se déplace. Y a-t-il une meilleure manière de faire cela?

Répondre

0

La solution la plus simple serait d'utiliser callbackProperty. Quelque chose comme ceci:

// init somewhere 
var vehiclesPositions = {}; 

// when you parse the data for each vhicle 
... init loop ... 
let vhicle = vhicles[i]; // use let to make sure vhicle is always the same for this loop scope 
vehiclesPositions[vhicle.id] = Cesium.Cartesian3.fromDegrees(vhicle.longitude, vhicle.latitude); 

var vehicle = viewer.entities.add({ 
    name : "Vehicle", 
    position : new Cesium.CallbackProperty(function() { return vehiclesPositions[vhicle.id]; }, // I can't cover all of the issues that might arise with the scope here. See note for the let vhicle line 
    orientation : orientation, 
    model : { 
     url : url, 
     minimumPixelSize : 50 
    } 
}); 

... end init loop ... 

Ensuite, vous faites la boucle de mise à jour:

... dans la boucle de mise à jour ...

// I assume you get the right ID somehow 
vehiclesPositions[vhicle.id] = Cesium.Cartesian3.fromDegrees(data[0], data[1], data[2]); 

... boucle de mise à jour de fin ...

Ensuite, vous devriez arrêter de voir le bégaiement.