2015-06-12 7 views
5

Я хотел динамически перемещать модель с помощью сочетаний клавиш. Я не мог найти соответствующую статью.Как перемещать 3D-модель на Cesium

Итак, теперь я пытаюсь переместить модель нажатием. При нажатии на модель. Модель должна двигаться в одном направлении (приращение значения 1 по тику). Найдите ниже код песочного замка для этого.

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);

Когда я нажимаю, модель движется в первый раз. После этого Он остается на том же месте. Я напечатал значение в консоли. Кажется, что значение не меняется. Я не уверен в этой проблеме. или я неправильно реализую трансформацию.

ответ

2

Если вы отслеживаете текущие lat и lon объекта и отрегулируете этот лат и lon на основе пользовательского ввода, все, что вам нужно сделать, это обновить ориентацию объекта.

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); 

Тогда вам просто нужно обновить ориентацию объекта.

entity.orientation = orientation; 

Изменив значение, ориентация модели и, следовательно, положение будут обновлены.

Смежные вопросы