Cesium学习笔记(五):3D 模型 (http://blog.csdn.net/umgsoil/article/details/74572877)
生活随笔
收集整理的這篇文章主要介紹了
Cesium学习笔记(五):3D 模型 (http://blog.csdn.net/umgsoil/article/details/74572877)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Cesium支持3D模型,包括關(guān)鍵幀動(dòng)畫,皮膚的改變還有單個(gè)節(jié)點(diǎn)的選擇等,Cesium還提供了了一個(gè)基于網(wǎng)絡(luò)的工具,將COLLADA模型轉(zhuǎn)換為glTF,方便和優(yōu)化模型添加
還記得我們?cè)趯?shí)體添加的時(shí)候添加過一個(gè)3D模型么,具體是這樣的
var viewer = new Cesium.Viewer('cesiumContainer'); var entity = viewer.entities.add({position : Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706), model : { uri : '../../SampleData/models/CesiumGround/Cesium_Ground.gltf' } }); viewer.trackedEntity = entity;- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
我們將3D模型直接以實(shí)體的形式添加進(jìn)去,效果很不錯(cuò),這次我們換種形式
var viewer = new Cesium.Viewer('cesiumContainer'); var scene = viewer.scene; var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame( Cesium.Cartesian3.fromDegrees(-75.62898254394531, 40.02804946899414, 0.0)); var model = scene.primitives.add(Cesium.Model.fromGltf({ url : '../Apps/SampleData/models/CesiumGround/Cesium_Ground.gltf', modelMatrix : modelMatrix, minimumPixelSize : 512, maximumScale : 200000 }));- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
你會(huì)發(fā)現(xiàn)這個(gè)模型卻沒有自帶動(dòng)畫效果,讓我們來給他加上動(dòng)畫
Cesium.when(model.readyPromise).then(function(model) {model.activeAnimations.addAll({ //永久重復(fù) loop : Cesium.ModelAnimationLoop.REPEAT }); });- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
這時(shí)候就有動(dòng)畫效果了,這個(gè)動(dòng)畫效果我們也是可以控制的,比如讓它慢一點(diǎn)或者回放一遍
model.activeAnimations.addAll({loop : Cesium.ModelAnimationLoop.REPEAT,//這個(gè)半速是相對(duì)于Cesium的clock來說的speedup : 0.5, reverse : true });- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
那么這兩種方法有什么區(qū)別呢?
追溯一下源碼可以發(fā)現(xiàn),其實(shí)用實(shí)體(entities)創(chuàng)建的3D模型最終通過GeometryInstance轉(zhuǎn)化成了primitives,也就是說兩者根本上是一樣的,不過用實(shí)體方式創(chuàng)建會(huì)更簡(jiǎn)單一點(diǎn)。
順帶稍微查了下,用實(shí)體方式創(chuàng)建因?yàn)樵谟肎eometryInstance會(huì)進(jìn)行一個(gè)分類處理,能夠充分利用GPU性能,所以在性能上還會(huì)更優(yōu)化一些
我們還可以精準(zhǔn)的選擇3D模型上的一個(gè)個(gè)小的部件
//獲得當(dāng)前鼠標(biāo)在模型上觸碰位置的名字 var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas); handler.setInputAction(function (movement) { //當(dāng)鼠標(biāo)移動(dòng)時(shí)獲取移動(dòng)的末位置 var pick = scene.pick(movement.endPosition); //簡(jiǎn)單來說就是這個(gè)點(diǎn)上有東西,那就打log if (Cesium.defined(pick) && Cesium.defined(pick.node) && Cesium.defined(pick.mesh)) { console.log('node: ' + pick.node.name + '. mesh: ' + pick.mesh.name); } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE );- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
可以看到控制臺(tái)把每個(gè)部件的名字都打印出來了
Cesium還為我們提供了一個(gè)檢查器,我們可以通過這個(gè)檢查器來查看我們模型的邊界、軸坐標(biāo)等,當(dāng)前這個(gè)檢查器的功能不止在3D模型上,還有拾取當(dāng)前點(diǎn)的經(jīng)緯度等其他功能
viewer.extend(Cesium.viewerCesiumInspectorMixin);- 1
- 1
只需要一行就可以開啟
點(diǎn)開primitives,pick我們這個(gè)模型就可以了
我們還可以給模型改變一下屬性
var viewer = new Cesium.Viewer('cesiumContainer') var entity = viewer.entities.add({position : Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706), model : { uri : '../../SampleData/models/CesiumGround/Cesium_Ground.gltf', //模型顏色,透明度 color : Cesium.Color.fromAlpha(Cesium.Color.RED, parseFloat(0.5)), //輪廓線 silhouetteColor : Cesium.Color.fromAlpha(Cesium.Color.GREEN, parseFloat(0.5)), //模型樣式['Highlight', 'Replace', 'Mix'] colorBlendMode : Cesium.ColorBlendMode.MIX, //colorBlendAmount需要選擇mix后將colorBlendAmountEnabled設(shè)置為true才能使用 colorBlendAmountEnabled : true, colorBlendAmount : parseFloat(0.8) } }); viewer.trackedEntity = entity;- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
轉(zhuǎn)載于:https://www.cnblogs.com/yanan-boke/p/7422863.html
總結(jié)
以上是生活随笔為你收集整理的Cesium学习笔记(五):3D 模型 (http://blog.csdn.net/umgsoil/article/details/74572877)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】内置方法pop
- 下一篇: Android -- TouchEven