Cesium-Examples/examples/cesiumEx/1.8、时间运动.html

118 lines
4.8 KiB
HTML
Raw Normal View History

2025-03-11 08:25:45 +00:00
<!--********************************************************************
* by jiawanlong
*********************************************************************-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
2025-03-19 03:00:22 +00:00
<link rel="stylesheet" href="./../../libs/cesium/Cesium1.98/Widgets/widgets.css">
<script type="text/javascript" src="./../../libs/cesium/Cesium1.98/Cesium.js"></script>
2025-03-11 08:25:45 +00:00
</head>
<body style="margin: 0; overflow: hidden; background: #fff; width: 100%; height: 100%; position: absolute; top: 0">
<div id="map" style="margin: 0 auto; width: 100%; height: 100%"></div>
<script type="text/javascript">
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI3ZjQ5ZGUzNC1jNWYwLTQ1ZTMtYmNjYS05YTY4ZTVmN2I2MDkiLCJpZCI6MTE3MTM4LCJpYXQiOjE2NzY0NDUyODB9.ZaNSBIfc1sGLhQd_xqhiSsc0yr8oS0wt1hAo9gbke6M'
const viewer = new Cesium.Viewer('map', {});
// 开启帧率
viewer.scene.debugShowFramesPerSecond = true;
let start = new Cesium.JulianDate.fromDate(new Date());
// 开始时间 cesium用的JulianDate:代表天文朱利安时间,用的是世界协调时,比北京时间晚8个小时, 加上东8时就是当前的真正时间
start = Cesium.JulianDate.addHours(start, 8, new Cesium.JulianDate());
// 结束时间 6分钟
const center = Cesium.JulianDate.addSeconds(start, 180, new Cesium.JulianDate());
const center2 = Cesium.JulianDate.addSeconds(start, 200, new Cesium.JulianDate());
const stop = Cesium.JulianDate.addSeconds(start, 360, new Cesium.JulianDate());
// 设置时钟范围
viewer.clock.startTime = start.clone();
viewer.clock.stopTime = stop.clone();
viewer.clock.currentTime = start.clone();
// 循环结束时后续动作
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
// 时间速率控制速度时间调快多少倍比如原来用时360秒调整10倍后现在用时36秒
viewer.clock.multiplier = 10;
//给下方时间线设置边界
viewer.timeline.zoomTo(start, stop);
const position = new Cesium.SampledPositionProperty();
const startPos = Cesium.Cartesian3.fromDegrees(-90, 20, 10000);
const centerPos = Cesium.Cartesian3.fromDegrees(-60, 40, 1000000);
const centerPos2 = Cesium.Cartesian3.fromDegrees(-60, 42, 1000000);
const endPos = Cesium.Cartesian3.fromDegrees(-120, 30, 3000000);
position.addSample(start, startPos);
position.addSample(center, centerPos);
position.addSample(center2, centerPos2);
position.addSample(stop, endPos);
const entity = viewer.entities.add({
// 将实体availability设置为与模拟时间相同的时间间隔。
availability: new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
start: start,
stop: stop
})]),
position: position, // 计算实体位置属性
// 基于位置移动自动计算方向.
orientation: new Cesium.VelocityOrientationProperty(position),
model: {
uri: 'missile/scene.gltf',
minimumPixelSize: 32
},
label: {
text: '我是飞机',
font: '10pt monospace',
outlineWidth: 2,
fillColor: Cesium.Color.BLUE,
showBackground: true,
pixelOffset: new Cesium.Cartesian2(40, 20),
backgroundColor: Cesium.Color.RED
},
// 路径
path: {
show: true,
resolution: 1,
material: new Cesium.PolylineGlowMaterialProperty({
glowPower: 0.1,
color: Cesium.Color.PINK
}),
width: 5
}
});
// 开启运动
viewer.clock.shouldAnimate = true;
// 第三人称
// viewer.trackedEntity = entity;
// 第一人称
viewer.scene.preUpdate.addEventListener(traceHandler)
// https://blog.csdn.net/dandan__666/article/details/115293860
// https://blog.csdn.net/AllBluefm/article/details/137928976
function traceHandler() {
let center = entity.position.getValue(
viewer.clock.currentTime
);
let orientation = entity.orientation.getValue(
viewer.clock.currentTime
)
let transform = Cesium.Transforms.eastNorthUpToFixedFrame(center);
transform = Cesium.Matrix4.fromRotationTranslation(Cesium.Matrix3.fromQuaternion(orientation), center);
viewer.camera.lookAtTransform(transform, new Cesium.Cartesian3(-20, 0, 30))
}
</script>
</body>
</html>