?1.左鍵拾取經緯度坐標
const handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas)// 監聽鼠標點擊事件handler.setInputAction(function (click) {// 使用pick函數獲取點擊位置的實際位置var cartesian = viewer.scene.pickPosition(click.position);if (Cesium.defined(cartesian)) {// 將笛卡爾坐標轉換為經緯度坐標var cartographic = Cesium.Cartographic.fromCartesian(cartesian);var longitudeString = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);var latitudeString = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);var heightString = cartographic.height.toFixed(2);console.log('經度:' + longitudeString + ',緯度:' + latitudeString + ',高度:' + heightString)}// 使用Scene.pick來獲取3D Tiles的實際高度var pickedObject = viewer.scene.pick(click.position);if (Cesium.defined(pickedObject)) {// 獲取到3D Tiles的高度const cartographic = Cesium.Cartographic.fromCartesian(cartesian);const height = cartographic.height;const lon=Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);const lat =Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);console.log('點擊位置的經度是: ' + lon);console.log('點擊位置的緯度是: ' + lat);console.log('點擊位置的高度是: ' + height);}}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
2.獲取當前視角heading\pitch\roll?
function getPostion() {const camera = viewer.scene.cameraconst cartographic = Cesium.Cartographic.fromCartesian(camera.position)const x = Cesium.Math.toDegrees(cartographic.longitude)const y = Cesium.Math.toDegrees(cartographic.latitude)const z = cartographic.heightlet pt = Cesium.Cartographic.fromDegrees(x, y, z);let ellipsoid = viewer.scene.globe.ellipsoid;let cartesian3 = ellipsoid.cartographicToCartesian(pt);let objinfo = {"經度": x,"維度": y,"高度": z,"x": cartesian3.x,"y": cartesian3.y,"z": cartesian3.z,"heading": camera.heading,"pitch": camera.pitch,"roll": camera.roll}console.log(objinfo)}
3.設置視角至指定位置(相機)
setView
方法:用于設置相機的位置、朝向和視角。可以一次性設置相機的目標位置(destination
)和朝向(orientation
)flyTo
方法:與setView
類似,但它是平滑地飛到指定位置,可以設置飛行時間(duration
)和完成后的回調函數。lookAt
方法:使相機對準指定的位置或實體,但不改變相機的當前高度。它也可以接受一個orientation
參數來設置相機的朝向。zoomTo()
方法的基本形式接受一個目標參數(如實體、數據源等)和一個可選的HeadingPitchRange
對象,用于指定相機的姿態。目標參數可以是Entity
、Entity[]
(實體數組)、EntityCollection
或DataSource
等。
//flyto()
viewer.camera.flyTo({ destination: position, orientation: { heading: Cesium.Math.toRadians(0.0), // 正北 pitch: Cesium.Math.toRadians(-10.0), // 稍微向下傾斜以更好地觀察地面 roll: 0.0 }, duration: 5000
});//zoomtTo()var headingPitchRange = new Cesium.HeadingPitchRange(heading, pitch, range);
viewer.zoomTo(entity, headingPitchRange);//setViewer()
viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(lon, lat, height), // 相機目標位置 orientation: { // 相機朝向 heading: Cesium.Math.toRadians(heading), // 偏航角 pitch: Cesium.Math.toRadians(pitch), // 俯仰角 roll: Cesium.Math.toRadians(roll) // 翻滾角 }
});
//lookAt()
var target = Cesium.Cartesian3.fromDegrees(lon, lat, height);
viewer.camera.lookAt(target, new Cesium.HeadingPitchRange(heading, pitch, range));
3.設置視角至指定位置(實體)
- 如果你正在添加一個實體(如模型、點、線等)到Cesium中,并且想要設置它的方向(即視角),你可以通過設置該實體的
orientation
屬性來實現。這通常涉及到使用四元數(Quaternion)來表示旋轉,但Cesium也提供了HeadingPitchRoll
類來簡化這個過程。
//orientation屬性
var position = Cesium.Cartesian3.fromDegrees(lon, lat, height);
var entity = viewer.entities.add({ position: position, model: { uri: 'path/to/model.gltf', scale: 1.0 }, orientation: Cesium.Transforms.headingPitchRollQuaternion(position, new Cesium.HeadingPitchRoll(heading, pitch, roll))
});
Cesium中的四元數(Quaternion)是一種用于表示三維空間中旋轉的數學工具,它由四個分量組成,通常表示為(w, x, y, z),其中w是實部,x、y、z是虛部。在Cesium中,四元數主要用于描述物體的旋轉和姿態,具有精確、高效和穩定的特點。以下是對Cesium中四元數的詳細解釋:
一、四元數的基本概念
- 組成:四元數由一個實部和三個虛部組成,表示為(w, x, y, z)。
- 旋轉表示:在Cesium中,四元數常用于表示物體的旋轉。通過四元數,可以精確地描述物體在三維空間中的旋轉,且相比歐拉角,四元數沒有萬向鎖問題,能夠避免由于旋轉順序引起的計算錯誤。
二、四元數的應用
- 旋轉表示:
- 在Cesium中,通過四元數可以精確地描述物體在三維空間中的旋轉方向和角度。
- 使用Transforms.headingPitchRollQuaternion(position, hpr)等方法,可以根據物體的位置(position)和歐拉角(hpr,包括航向heading、俯仰pitch、橫滾roll)來計算朝向四元數。
- 插值計算:
- 四元數可以用于實現旋轉的平滑插值計算。通過對兩個四元數進行插值運算,可以實現物體在旋轉過程中的平滑過渡,提升視覺效果和用戶體驗。
- 姿態控制:
- 在飛行器模擬、虛擬現實和游戲開發等領域,四元數常用于控制物體的姿態。通過調整四元數的參數,可以精確地控制物體的旋轉和姿態,使其符合預期的運動軌跡和角度變化。
- 坐標變換:
- 在Cesium中,四元數也常用于實現坐標系之間的變換。通過四元數的乘法運算,可以方便地實現不同坐標系之間的旋轉變換,從而實現物體在不同坐標系下的準確定位和旋轉。
三、四元數的計算與轉換
- 從歐拉角到四元數:可以使用Cesium提供的Transforms.headingPitchRollQuaternion等方法,根據物體的歐拉角和位置來計算朝向四元數。
- 從四元數到歐拉角:雖然Cesium直接提供了從歐拉角到四元數的轉換方法,但從四元數反推歐拉角可能需要手動計算或使用特定的函數庫。
- 四元數的乘法和歸一化:在進行四元數運算時,需要注意四元數的乘法和歸一化操作,以確保旋轉的正確性和穩定性。
四、結論
Cesium中的四元數作為一種用于描述旋轉的數學工具,具有廣泛的應用價值。掌握四元數在Cesium中的應用,對于開發基于Cesium的三維應用具有重要意義。通過合理使用四元數,可以精確地描述和控制物體的旋轉、姿態和坐標變換,提升三維場景中物體運動的真實感和視覺效果。