1.模拟飞机坠毁
2.粒子火焰模拟
//测试生成模型和粒子
var lon = 115.405419;
var lat = 40.918034;
var height = 1000;
var pos = { longitude: lon, latitude: lat, height: height }
// 创建测试飞机
var airplaneEntity = cm.CreateSingleModel(pos, "Airplane", '../Apps/SampleData/models/CesiumAir/Cesium_Air.glb', 64, "飞机测试");
var startTime;//当前时间
// 定义飞机坠毁函数
function simulateCrash() {
airplaneEntity.position=Cesium.Cartesian3.fromDegrees(pos.longitude, pos.latitude, pos.height);
var startPos = cm.GetPosHeight(airplaneEntity);//开始位置
var startlon = startPos.longitude;//开始经度
var startlat = startPos.latitude;//开始纬度
var startHeight = startPos.height;//开始高度
console.log("飞机坠毁开始", startlon, startlat, startHeight);
var endpos = GetDirectPos(airplaneEntity, 1000);//坠毁点
var endlon = endpos.longitude;//坠毁点经度
var endlat = endpos.latitude;//坠毁点纬度
var endHeight = 0; // 坠毁后的高度
var duration = 30; // 坠毁过程的持续时间(秒)
console.log("飞机坠毁开始1", endlon, endlat, endHeight);
var targetLatLngHeight = { longitude: endlon, latitude: endlat, height: endHeight }
setEntityModelOrientationToLatLngHeight(airplaneEntity, targetLatLngHeight);//飞机朝向坠毁点
startTime = viewer.clock.currentTime;
console.log("获取当前时间:",startTime);
//viewer.clock.startTime = startTime.clone();
//viewer.clock.currentTime = startTime.clone();
viewer.clock.stopTime = Cesium.JulianDate.addSeconds(startTime, duration, new Cesium.JulianDate());
viewer.clock.onTick.addEventListener(ZhuiHui);
function ZhuiHui(clock) {
var elapsedTime = Cesium.JulianDate.secondsDifference(clock.currentTime, startTime);
if (viewer.clock.shouldAnimate) {
var progress = elapsedTime / duration;
var currentHeight = Cesium.Math.lerp(startHeight, endHeight, progress);
var currentlon = Cesium.Math.lerp(startlon, endlon, progress);
var currentlat = Cesium.Math.lerp(startlat, endlat, progress);
console.log("飞机坠毁中", currentlon, currentlat, currentHeight);
airplaneEntity.position = Cesium.Cartesian3.fromDegrees(
currentlon,
currentlat,
currentHeight
);
console.log("进度", progress);
if ( progress <0||progress>startHeight) {
viewer.clock.onTick.removeEventListener(ZhuiHui);
}
}
}
}
// 获取Entity的方向
function getEntityDirection(entity) {
// 获取实体的姿态矩阵
var modelMatrix = entity.computeModelMatrix(Cesium.JulianDate.now());
// 提取实体的旋转矩阵
var rotationMatrix = new Cesium.Matrix3();
Cesium.Matrix4.getMatrix3(modelMatrix, rotationMatrix);
// 提取方向向量
var direction = new Cesium.Cartesian3();
Cesium.Matrix3.getColumn(rotationMatrix, 0, direction);
// 将方向向量归一化
direction = Cesium.Cartesian3.normalize(direction, direction);
return direction;
}
// 获取给定方向前1000米处的点的位置
function getPointInDirection(position, direction, distance) {
// 将方向向量归一化
var normalizedDirection = Cesium.Cartesian3.normalize(direction, new Cesium.Cartesian3());
// 计算偏移向量
var offset = Cesium.Cartesian3.multiplyByScalar(normalizedDirection, distance, new Cesium.Cartesian3());
// 计算目标点的位置
var targetPoint = Cesium.Cartesian3.add(position, offset, new Cesium.Cartesian3());
return targetPoint;
}
// 将点的笛卡尔坐标转换为经纬度
function cartesianToDegrees(cartesian) {
var ellipsoid = Cesium.Ellipsoid.WGS84;
var cartographic = ellipsoid.cartesianToCartographic(cartesian);
var longitude = Cesium.Math.toDegrees(cartographic.longitude);
var latitude = Cesium.Math.toDegrees(cartographic.latitude);
var height = cartographic.height;
return {
longitude: longitude,
latitude: latitude,
height: height
};
}
//获取entity模型正前方某一距离的点
function GetDirectPos(airplaneEntity, dis) {
var position = airplaneEntity.position.getValue(Cesium.JulianDate.now()); // 获取实体的位置
var direction = getEntityDirection(airplaneEntity); // 获取实体的方向向量
var distance = dis; // 距离1000米
var targetPoint = getPointInDirection(position, direction, distance);
var pos1 = cartesianToDegrees(targetPoint);
console.log('给定方向前1000米处的点的位置:', pos1);
return pos1;
}
// 使实体模型朝向一个经纬度点,并考虑高度信息
function setEntityModelOrientationToLatLngHeight(entity, targetLatLngHeight) {
// 获取实体当前的位置
var position = entity.position.getValue(Cesium.JulianDate.now());
// 将目标经纬度点转换为笛卡尔坐标
var targetCartographic = Cesium.Cartographic.fromDegrees(targetLatLngHeight.longitude, targetLatLngHeight.latitude, targetLatLngHeight.height);
var targetPosition = Cesium.Ellipsoid.WGS84.cartographicToCartesian(targetCartographic);
// 计算点到实体的方向向量
var direction = Cesium.Cartesian3.subtract(targetPosition, position, new Cesium.Cartesian3());
direction = Cesium.Cartesian3.normalize(direction, direction);
// 计算方向向量的方位角和俯仰角
var heading = Math.atan2(direction.y, direction.x);
var pitch = Math.asin(direction.z);
// 设置实体的方向属性
entity.orientation = Cesium.Transforms.headingPitchRollQuaternion(position, new Cesium.HeadingPitchRoll(0, pitch, 0));
}
// var pos1 = GetDirectPos(airplaneEntity, 1000);//坠毁点
// var pointEntity = viewer.entities.add({
// position: Cesium.Cartesian3.fromDegrees(pos1.longitude, pos1.latitude, pos1.height),
// point: {
// pixelSize: 10,
// color: Cesium.Color.RED
// },
// label: {
// text: "Point: (" + pos1.longitude.toFixed(6) + ", " + pos1.latitude.toFixed(6) + "," + pos1.height.toFixed(6) + ")",
// showBackground: true,
// backgroundColor: Cesium.Color.BLACK,
// font: "14px sans-serif",
// horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
// verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
// pixelOffset: new Cesium.Cartesian2(10, -10)
// }
// });