diff --git a/public/images/fire.png b/public/images/fire.png new file mode 100644 index 000000000..c826c442a Binary files /dev/null and b/public/images/fire.png differ diff --git a/public/models/导弹整体.glb b/public/models/导弹整体.glb new file mode 100644 index 000000000..3ebecbca7 Binary files /dev/null and b/public/models/导弹整体.glb differ diff --git a/public/models/第一级.glb b/public/models/第一级.glb new file mode 100644 index 000000000..789b1258e Binary files /dev/null and b/public/models/第一级.glb differ diff --git a/public/models/第三级.glb b/public/models/第三级.glb new file mode 100644 index 000000000..8361cabcf Binary files /dev/null and b/public/models/第三级.glb differ diff --git a/public/models/第二级.glb b/public/models/第二级.glb new file mode 100644 index 000000000..72eed3a09 Binary files /dev/null and b/public/models/第二级.glb differ diff --git a/public/models/美三叉戟2动画.glb b/public/models/美三叉戟2动画.glb new file mode 100644 index 000000000..9c302db23 Binary files /dev/null and b/public/models/美三叉戟2动画.glb differ diff --git a/public/models/美三叉戟2整体.glb b/public/models/美三叉戟2整体.glb new file mode 100644 index 000000000..bb3e291f4 Binary files /dev/null and b/public/models/美三叉戟2整体.glb differ diff --git a/public/models/美三叉戟2第一级.glb b/public/models/美三叉戟2第一级.glb new file mode 100644 index 000000000..7600b82fc Binary files /dev/null and b/public/models/美三叉戟2第一级.glb differ diff --git a/public/models/美三叉戟2第三级.glb b/public/models/美三叉戟2第三级.glb new file mode 100644 index 000000000..c6f6b06f8 Binary files /dev/null and b/public/models/美三叉戟2第三级.glb differ diff --git a/public/models/美三叉戟2第二级.glb b/public/models/美三叉戟2第二级.glb new file mode 100644 index 000000000..405549f3a Binary files /dev/null and b/public/models/美三叉戟2第二级.glb differ diff --git a/src/js/Explosion.js b/src/js/Explosion.js index b66ac6027..b15b554bc 100644 --- a/src/js/Explosion.js +++ b/src/js/Explosion.js @@ -2,6 +2,15 @@ export default class ExplosionEffect { constructor(viewer, obj) { this.viewer = viewer this.viewModel = { + // emissionRate: 5, + // gravity: 0.0, //设置重力参数 + // minimumParticleLife: 1, + // maximumParticleLife: 6, + // minimumSpeed: 1.0, //粒子发射的最小速度 + // maximumSpeed: 4.0, //粒子发射的最大速度 + // startScale: 0.0, + // endScale: 8.0, + // particleSize: 25.0, emissionRate: 5, gravity: 0.0, //设置重力参数 minimumParticleLife: 1, @@ -10,7 +19,7 @@ export default class ExplosionEffect { maximumSpeed: 4.0, //粒子发射的最大速度 startScale: 0.0, endScale: 8.0, - particleSize: 25.0, + particleSize: 10.0, } this.emitterModelMatrix = new Cesium.Matrix4() this.translation = new Cesium.Cartesian3() @@ -33,7 +42,8 @@ export default class ExplosionEffect { // this.viewer.trackedEntity = this.entity; let particleSystem = this.scene.primitives.add( new Cesium.ParticleSystem({ - image: './images/explosion.png', //生成所需粒子的图片路径 + // image: './images/explosion.png', //生成所需粒子的图片路径 + image: './images/fire.png', //生成所需粒子的图片路径 //粒子在生命周期开始时的颜色 startColor: Cesium.Color.RED.withAlpha(0.7), //粒子在生命周期结束时的颜色 @@ -61,14 +71,33 @@ export default class ExplosionEffect { lifetime: 16.0, //设置粒子的大小是否以米或像素为单位 sizeInMeters: false, + // sizeInMeters: true, //系统的粒子发射器 - emitter: new Cesium.CircleEmitter(5.0), //BoxEmitter 盒形发射器,ConeEmitter 锥形发射器,SphereEmitter 球形发射器,CircleEmitter圆形发射器 + // emitter: new Cesium.CircleEmitter(5.0), //BoxEmitter 盒形发射器,ConeEmitter 锥形发射器,SphereEmitter 球形发射器,CircleEmitter圆形发射器 + emitter: new Cesium.CircleEmitter(2.0), //BoxEmitter 盒形发射器,ConeEmitter 锥形发射器,SphereEmitter 球形发射器,CircleEmitter圆形发射器 + //回调函数,实现各种喷泉、烟雾效果 + updateCallback: (p, dt) => { + return this.applyGravity(p, dt) + }, }) ) this.particleSystem = particleSystem this.preUpdateEvent() } + applyGravity(p, dt) { + let gravityScratch = new Cesium.Cartesian3() + let position = p.position + Cesium.Cartesian3.normalize(position, gravityScratch) + Cesium.Cartesian3.fromElements( + 20 * dt, + 30 * dt, + gravityScratch.y * dt, + gravityScratch + ) + p.velocity = Cesium.Cartesian3.add(p.velocity, gravityScratch, p.velocity) + } + //场景渲染事件 preUpdateEvent() { let _this = this diff --git a/src/utils/pos.js b/src/utils/pos.js index 72bb41bf3..3e8142a6c 100644 --- a/src/utils/pos.js +++ b/src/utils/pos.js @@ -32,6 +32,107 @@ export function getPositionFromTime( return points } +export function getOnePositionFromTime(startTime, i, pos) { + const time = Cesium.JulianDate.addSeconds( + startTime, + i, + new Cesium.JulianDate() + ) + const point = pos.getValue(time) + return point +} + export function getBezierSpline(points) { return bezierSpline(lineString(points)) } + +export async function test() { + const points = createTrajectory( + [137, 25, 0, 1183135285000], + [140, 27, 100000, 1183135295000] + ).map(point => { + // const point = getTrajectoryPoint(i) + console.log(point) + // console.log( + // `t=${point.time}s, lon=${point.longitude.toFixed( + // 3 + // )}, lat=${point.latitude.toFixed(3)}, alt=${point.altitude.toFixed(2)}m` + // ) + return [point.lon, point.lat, point.alt] + }) + // const points = a.map(item => { + // return [item.lon, item.lat, item.alt] + // }) + viewer.entities.add({ + name: 'line', + polyline: { + positions: Cesium.Cartesian3.fromDegreesArrayHeights( + points.flat(Infinity) + ), + width: 10, + material: new Cesium.PolylineGlowMaterialProperty({ + glowPower: 0.1, + color: Cesium.Color.RED, + }), + }, + }) +} + +export function createTrajectory(p1, p2, options = {}) { + const { + steps = 20, + useStartAsPeak = false, + useEndAsPeak = false, + peakBias = 0.3, // 控制曲率偏向:0.5 表示中点;靠近 0 表示更靠近起点 + midOffset = 1000, + } = options + + const [lon1, lat1, alt1, t1] = p1 + const [lon2, lat2, alt2, t2] = p2 + + const dt = (t2 - t1) / 1000 // 秒 + const tPeak = + dt * (useEndAsPeak ? 1 - peakBias : useStartAsPeak ? peakBias : 0.5) + + // 设置高度 + let h0 = alt1 + let h2 = alt2 + let h1 + + if (useStartAsPeak) { + h1 = (alt1 + alt2) / 2 - midOffset + } else if (useEndAsPeak) { + h1 = (alt1 + alt2) / 2 - midOffset + } else { + h1 = Math.max(alt1, alt2) + midOffset + } + + // 三点拟合抛物线 + const c = h0 + const A = [ + [tPeak ** 2, tPeak], + [dt ** 2, dt], + ] + const B = [h1 - c, h2 - c] + + const denom = A[0][0] * A[1][1] - A[0][1] * A[1][0] + const a = (B[0] * A[1][1] - B[1] * A[0][1]) / denom + const b = (A[0][0] * B[1] - A[1][0] * B[0]) / denom + + const result = [] + + for (let i = 0; i <= steps; i++) { + const t = (dt * i) / steps + const fraction = t / dt + + const lon = lon1 + (lon2 - lon1) * fraction + const lat = lat1 + (lat2 - lat1) * fraction + const alt = a * t * t + b * t + c + + result.push({ t: t1 + t * 1000, lon, lat, alt }) + } + + return result +} + +// 示例:每秒插值 diff --git a/src/views/Daodan/components/TestConfig.jsx b/src/views/Daodan/components/TestConfig.jsx index 416734a20..affb3bbc2 100644 --- a/src/views/Daodan/components/TestConfig.jsx +++ b/src/views/Daodan/components/TestConfig.jsx @@ -9,8 +9,14 @@ const panels = ['手动配置', 'STK轨迹文件配置'] export default defineComponent({ setup() { const { daodanData, showOrHideDdConfig } = useDaodan() - const { trajData, interceptData, loadStoreData, addIntercept, initDaodan } = - useTestConfig() + const { + trajData, + boosterList, + interceptData, + loadStoreData, + addIntercept, + initDaodan, + } = useTestConfig() watch(daodanData, newval => { loadStoreData() @@ -54,8 +60,19 @@ export default defineComponent({