需求
无人机或汽车按照给定的路径和速度运动。
代码
simulationPath.js
import * as Cesium from 'mars3d-cesium'let percentage = 0;
let lastPos;
let lastTime;
let speedReal = 0;function calculateDistances(positions) {let distances = [];let totalDistance = 0;for (let [i, pos] of positions.entries()) {if (i > 0) {let pos1 = positions[i - 1];const point1 = Cesium.Cartesian3.fromDegrees(pos1[0], pos1[1], pos1[2]);const point2 = Cesium.Cartesian3.fromDegrees(pos[0], pos[1], pos[2]);const distance = Cesium.Cartesian3.distance(point1, point2);distances.push(distance);totalDistance += distance;}}return { totalDistance, distances }
}function sampleSimulationPath(positions, totalDistance, distances, percentage) {if (percentage > 1) percentage = 1;if (percentage < 0) percentage = 0;let d = totalDistance * percentage;for (let [i, distance] of distances.entries()) {d -= distance;if (d <= 0) {d += distance;let pos1 = positions[i];let pos2 = positions[i + 1];let p = d / distance;let lng = pos1[0] + (pos2[0] - pos1[0]) * p;let lat = pos1[1] + (pos2[1] - pos1[1]) * p;let alt = pos1[2] + (pos2[2] - pos1[2]) * p;return [lng, lat, alt];}}
}function updatePosition(positions, totalDistance, distances, speed) {let deltaTime = 0;if (lastTime) {deltaTime = new Date().getTime() - lastTime;}percentage += deltaTime / 1000.0 / (totalDistance / speed);if (percentage > 1) {percentage = 0;}let pos = sampleSimulationPath(positions, totalDistance, distances, percentage);if (lastPos && lastTime) {let distance = Cesium.Cartesian3.distance(Cesium.Cartesian3.fromDegrees(lastPos[0], lastPos[1], lastPos[2]), Cesium.Cartesian3.fromDegrees(pos[0], pos[1], pos[2]));speedReal = (distance / (new Date().getTime() - lastTime)) * 1000;}lastPos = pos;lastTime = new Date().getTime();return { pos, speedReal }
}export { calculateDistances, sampleSimulationPath, updatePosition }
测试代码:
// 无人机仿真飞行路径
let positions = [[117.1, 31.826, 800],[117.088, 31.8261, 756],[117.088, 31.825, 723],[117.1, 31.8251, 778],[117.1, 31.826, 800]
]
let { totalDistance, distances } = calculateDistances(positions) // 计算距离
let speed = 20 // 飞行速度function renderLoop() {requestAnimationFrame(renderLoop)if (run) {let { pos, speedReal } = updatePosition(positions, totalDistance, distances, speed)updateDronePosition(101, 'DV1001', pos[0], pos[1], pos[2], speedReal) // 更新无人机位置}
}
renderLoop()