2015-06-12 14 views
5

Volevo spostare il modello dinamicamente utilizzando le scorciatoie da tastiera. Non sono riuscito a trovare un articolo pertinente al riguardo.Come spostare il modello 3D su Cesio

Quindi, per ora, sto cercando di spostare il modello sul clic. Quando clicchi sul modello. Il modello deve muoversi in una direzione (incrementare il valore 1 in tick). Trova sotto il codice sandcastle per quello.

var selectedMesh; var i=0; 
 

 
var viewer = new Cesium.Viewer('cesiumContainer', { 
 
    infoBox: false, 
 
    selectionIndicator: false 
 
}); 
 

 
var handle = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); 
 

 
function createModel(url, height) { 
 
    viewer.entities.removeAll(); 
 

 
    var position = Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706, height); 
 
    var heading = Cesium.Math.toRadians(135); 
 
    var pitch = 0; 
 
    var roll = 0; 
 
    var orientation = Cesium.Transforms.headingPitchRollQuaternion(position, heading, pitch, roll); 
 

 
    var entity = viewer.entities.add({ 
 
     name: url, 
 
     position: position, 
 
     orientation: orientation, 
 
     model: { 
 
      uri: url, 
 
      minimumPixelSize: 128 
 
     } 
 
    }); 
 
    viewer.trackedEntity = entity; 
 

 

 
    viewer.clock.onTick.addEventListener(function() { 
 
     if (selectedMesh) { 
 
      console.log("Before 0 : " + selectedMesh.primitive.modelMatrix[12]); 
 
      selectedMesh.primitive.modelMatrix[12] = selectedMesh.primitive.modelMatrix[12] + 1; 
 
      console.log("After 0 : " + selectedMesh.primitive.modelMatrix[12]); 
 
     } 
 
    }); 
 
} 
 

 
handle.setInputAction(function (movement) { 
 
    console.log("LEFT CLICK"); 
 
    var pick = viewer.scene.pick(movement.position); 
 
    if (Cesium.defined(pick) && Cesium.defined(pick.node) && Cesium.defined(pick.mesh)) { 
 

 
     if (!selectedMesh) { 
 
      selectedMesh = pick; 
 
     } 
 
    } 
 
}, Cesium.ScreenSpaceEventType.LEFT_CLICK); 
 

 
var options = [{ 
 
    text: 'Aircraft', 
 
    onselect: function() { 
 
     createModel('../../SampleData/models/CesiumAir/Cesium_Air.bgltf', 5000.0); 
 
    } 
 
}, { 
 
    text: 'Ground vehicle', 
 
    onselect: function() { 
 
     createModel('../../SampleData/models/CesiumGround/Cesium_Ground.bgltf', 0); 
 
    } 
 
}, { 
 
    text: 'Milk truck', 
 
    onselect: function() { 
 
     createModel('../../SampleData/models/CesiumMilkTruck/CesiumMilkTruck.bgltf', 0); 
 
    } 
 
}, { 
 
    text: 'Skinned character', 
 
    onselect: function() { 
 
     createModel('../../SampleData/models/CesiumMan/Cesium_Man.bgltf', 0); 
 
    } 
 
}]; 
 

 
Sandcastle.addToolbarMenu(options);

Quando scatto, il modello si muove per la prima volta. Dopodiché, rimane nello stesso posto. Ho stampato il valore nella console. Sembra che il valore non stia cambiando. Non sono sicuro del problema qui. o sto implementando la trasformazione in modo errato.

risposta

2

Se si tiene traccia dell'attuale lat e lon dell'entità e si regola quel lat e lon in base all'input dell'utente, tutto ciò che è necessario fare è aggiornare l'orientamento dell'entità.

var lon = // the updated lon 
var lat = // updated lat 
var position = Cesium.Cartesian3.fromDegrees(lon, lat, height); 

var heading = Cesium.Math.toRadians(135); 
var pitch = 0; 
var roll = 0; 

// create an orientation based on the new position 
var orientation = Cesium.Transforms.headingPitchRollQuaternion(position, heading, pitch, roll); 

Quindi è sufficiente aggiornare l'orientamento dell'entità.

entity.orientation = orientation; 

Cambiando il valore, l'orientamento dei modelli e quindi la posizione verranno aggiornati.

Problemi correlati