Cesium — Entity 拖拽蜂筹、屬性修改

簡介

目標(biāo)

  1. 通過鼠標(biāo)拖拽改變 Entity 模型的位置;
  2. 選中 Entity 芦倒,獲取其姿態(tài)艺挪、比例等屬性信息,實現(xiàn)對其屬性修改兵扬。

思路

  • 鼠標(biāo)左鍵按下選中模型麻裳,鼠標(biāo)移動改變所選模型的位置,鼠標(biāo)左鍵抬起結(jié)束拖拽器钟,實現(xiàn)目標(biāo)1津坑。
  • 鼠標(biāo)左鍵點擊選中模型,獲取該對象相應(yīng)屬性信息傲霸,進(jìn)而做到對其修改疆瑰,實現(xiàn)目標(biāo)2。

1. 選中Entity

Cesium 中使用 scene.pick 或 scene.drillPick 方法選中 Entity 對象昙啄;當(dāng)多個 Entity 互相覆蓋時穆役,前者選中的是最上層的 Entity,后者選中的是鼠標(biāo)下所有的 Entity跟衅。

let picked = viewer.scene.pick(windowPosition);
let pickedArray = viewer.scene.dillPick(windowPosition);

2. 拖拽Entity

這里主要實現(xiàn)GLTF三維模型的拖拽,其它類型Entity的拖拽可作參考播歼。
(1)首先定義三個函數(shù)伶跷,分別對應(yīng)左鍵按下掰读、鼠標(biāo)移動、左鍵抬起叭莫。

let leftDownFlag = false; // 鼠標(biāo)左鍵是否按下
let pickedEntity = null; //被選中的Entity

// 拖拽模型-左鍵按下
function leftDownAction(e) {
  leftDownFlag = true;
  let picked = viewer.scene.pick(e.position);
  if (picked) {
    document.body.style.cursor = 'move';
    pickedEntity = Cesium.defaultValue(picked.id, picked.primitive.id);
    if (pickedEntity instanceof Cesium.Entity && pickedEntity.model) {
      //鎖定相機(jī)
      viewer.scene.screenSpaceCameraController.enableRotate = false;
    }
  }
}

// 拖拽模型-鼠標(biāo)移動
function mouseMoveAction(e) {
  if (leftDownFlag && pickedEntity) {
    // let ray = viewer.camera.getPickRay(e.endPosition);
    // let cartesian = viewer.scene.globe.pick(ray, viewer.scene);
    let cartesian = viewer.scene.camera.pickEllipsoid(
      e.endPosition,
      viewer.scene.globe.ellipsoid
    );
    pickedEntity.position = cartesian;
  }
}

// 拖拽模型-左鍵抬起
function leftUpAction(e) {
  document.body.style.cursor = 'default';
  leftDownFlag = false;
  pickedEntity = null;
  // 解除相機(jī)鎖定
  viewer.scene.screenSpaceCameraController.enableRotate = true;
}

注意兩點:

  • 左鍵按下后鎖定相機(jī)蹈集,防止拖拽時相機(jī)視角改變,左鍵抬起后解除鎖定雇初。
  • 鼠標(biāo)按下和抬起事件中拢肆,獲取屏幕坐標(biāo)的屬性是 position, 而鼠標(biāo)移動時獲取屏幕坐標(biāo)的屬性是 endPosition靖诗。

(2) 給 Viewer 添加相應(yīng)鼠標(biāo)事件

viewer.screenSpaceEventHandler.setInputAction((e) => {
  leftDownAction(e);
}, Cesium.ScreenSpaceEventType.LEFT_DOWN);

viewer.screenSpaceEventHandler.setInputAction((e) => {
  mouseMoveAction(e);
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

viewer.screenSpaceEventHandler.setInputAction((e) => {
  leftUpAction(e);
}, Cesium.ScreenSpaceEventType.LEFT_UP);

3. 修改屬性

選中 Entity 后郭怪,即可獲取相應(yīng)的屬性信息。下面的 pickModel 函數(shù)傳入windowPosition刊橘,返回一個 Entity 對象鄙才。

function pickModel(windowPosition) {
  let picked = viewer.scene.pick(windowPosition);
  if (Cesium.defined(picked)) {
    let entity = Cesium.defaultValue(picked.id, picked.primitive.id);
    if (entity instanceof Cesium.Entity) {
      if (entity.model) {
        console.log('model');
        return entity;
      }
    }
  }
}

獲取到 Entity 對象后,可對其屬性進(jìn)行修改:

viewer.screenSpaceEventHandler.setInputAction((e) => {
  let entity = pickModel(e.position);
  // 獲取模型的比例
  let scale = entity.model.scale.getValue();
  // 設(shè)置模型的比例
  entity.model.scale.setValue(2.0);
  
  // 獲取模型(當(dāng)前)的位置
    let position = entity.position.getValue(Cesium.JulianDate.fromDate(new Date()));
  // 設(shè)置模型的位置
  let position2 = Cesium.Cartesian3.fromDegrees(114.08, 23.55, 1000);
  entity.position.setValue(position2);
  
  // 設(shè)置模型的方位
    let heading = Cesium.Math.toRadians(90);
    let pitch = Cesium.Math.toRadians(0);
    let roll = Cesium.Math.toRadians(0);
    let orientation = Cesium.Transforms.headingPitchRollQuaternion(
        position,
        new Cesium.HeadingPitchRoll(heading, pitch, roll)
    );
    entity.orientation = orientation;
  
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末促绵,一起剝皮案震驚了整個濱河市攒庵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌败晴,老刑警劉巖浓冒,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尖坤,居然都是意外死亡稳懒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門糖驴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來僚祷,“玉大人,你說我怎么就攤上這事贮缕≌廾眨” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵感昼,是天一觀的道長装哆。 經(jīng)常有香客問我,道長定嗓,這世上最難降的妖魔是什么蜕琴? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮宵溅,結(jié)果婚禮上凌简,老公的妹妹穿的比我還像新娘。我一直安慰自己恃逻,他們只是感情好雏搂,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布藕施。 她就那樣靜靜地躺著,像睡著了一般凸郑。 火紅的嫁衣襯著肌膚如雪裳食。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天芙沥,我揣著相機(jī)與錄音诲祸,去河邊找鬼。 笑死而昨,一個胖子當(dāng)著我的面吹牛救氯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播配紫,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼径密,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了躺孝?” 一聲冷哼從身側(cè)響起享扔,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎植袍,沒想到半個月后惧眠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡于个,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年氛魁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厅篓。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡秀存,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出羽氮,到底是詐尸還是另有隱情或链,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布档押,位于F島的核電站澳盐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏令宿。R本人自食惡果不足惜叼耙,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粒没。 院中可真熱鬧筛婉,春花似錦、人聲如沸癞松。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匆浙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厕妖,已是汗流浹背首尼。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留言秸,地道東北人软能。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像举畸,于是被迫代替她去往敵國和親查排。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容