/** 飞行过程中,模型进行移动
* @param {Array} positions 位置
* @param {Number} speed 速度
*/
var onTickEvent;
export function carMove(positions, speed) {
if (!positions) return;
var allDis = 0;
for (var index = 0; index < positions.length - 1; index++) {
var dis = Cesium.Cartesian3.distance(positions[index], positions[index + 1]);
allDis += dis;
}
var v = speed; // 控制速度
var playTime = allDis / v;
// 起始时间
var startTime = window.viewer.clock.currentTime;
// 结束时间
var endTime = Cesium.JulianDate.addSeconds(startTime, playTime, new Cesium.JulianDate());
var property = new Cesium.SampledPositionProperty();
var t = 0;
for (var i = 1; i < positions.length; i++) {
if (i === 1) {
property.addSample(startTime, positions[0]);
}
var disi = Cesium.Cartesian3.distance(positions[i], positions[i - 1]);
var time = disi / v + t;
var julianDate = Cesium.JulianDate.addSeconds(startTime, time, new Cesium.JulianDate());
property.addSample(julianDate, positions[i]);
t += disi / v;
}
// 设置平滑轨迹(利用插值实现)
property.setInterpolationOptions({
interpolationDegree: 1, // 值越大,越平滑,拐角越趋向圆形
interpolationAlgorithm: Cesium.LagrangePolynomialApproximation
});
let trackedEntity = window.viewer.entities.add({
name: '道路飞行',
position: property,
orientation: new Cesium.VelocityOrientationProperty(property),
label: {
text: '',
fillColor: Cesium.Color.RED,
pixelOffset: new Cesium.Cartesian2(0, -30)
},
model: {
uri: process.env.VUE_APP_PUBLICE_PATH + 'libs/models/Cesium_Ground.gltf',
scale: 3,
// 最小刻度
minimumPixelSize: 70,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
}
});
// 设置时钟当前时间
window.viewer.clock.currentTime = startTime;
// 时间速率,数字越大时间过的越快
window.viewer.clock.multiplier = 1;
window.viewer.clock.shouldAnimate = true;
// 设置始终停止时间
window.viewer.clock.stopTime = endTime;
window.viewer.trackedEntity = trackedEntity;
// 实时调整位置
function adjust() {
// 获取当前模型方向和位置
// trackedEntity 为模型对象
const orientation = trackedEntity.orientation;
const position = trackedEntity.position;
if (window.viewer.clock.shouldAnimate === true) {
// 获取偏向角
let ori = orientation.getValue(window.viewer.clock.currentTime);
// 获取位置
let center = position.getValue(window.viewer.clock.currentTime);
// 1、由四元数计算三维旋转矩阵
var mtx3 = Cesium.Matrix3.fromQuaternion(ori);
// 2、计算四维转换矩阵:
var mtx4 = Cesium.Matrix4.fromRotationTranslation(mtx3, center);
// 3、计算角度:
var hpr = Cesium.Transforms.fixedFrameToHeadingPitchRoll(mtx4);
// 获取角度(弧度)
const headingTemp = hpr.heading;
const pitchTemp = hpr.pitch;
// 调整角度为第一人称,注意调整的角度
const heading = Cesium.Math.toRadians(Cesium.Math.toDegrees(headingTemp) + 90);
const pitch = Cesium.Math.toRadians(Cesium.Math.toDegrees(pitchTemp) - 50);
// 视角高度,根据模型大小调整
const range = 2000.0;
// 动态改变模型视角
window.viewer.camera.lookAt(center, new Cesium.HeadingPitchRange(heading, pitch, range));
}
}
onTickEvent = window.viewer.clock.onTick.addEventListener(adjust);
}
cesium实现道路飞行
最新推荐文章于 2024-08-25 17:30:18 发布