482 lines
16 KiB
HTML
482 lines
16 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<!-- Use correct character set. -->
|
||
<meta charset="utf-8" />
|
||
<!-- Tell IE to use the latest, best version. -->
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||
<!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
|
||
<meta
|
||
name="viewport"
|
||
content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"
|
||
/>
|
||
<title>Learning Cesium!</title>
|
||
<script src="./Build/Cesium/Cesium.js"></script>
|
||
<style>
|
||
@import url(./Build/Cesium/Widgets/widgets.css);
|
||
html,
|
||
body,
|
||
#app,
|
||
#cesiumContainer {
|
||
width: 100%;
|
||
height: 100%;
|
||
margin: 0;
|
||
padding: 0;
|
||
overflow: hidden;
|
||
}
|
||
.menu-container {
|
||
position: absolute;
|
||
top: 30px;
|
||
left: 100px;
|
||
z-index: 9999;
|
||
}
|
||
.m{
|
||
background: linear-gradient(to left,#ffffff,#ffffff) left bottom no-repeat,
|
||
linear-gradient(to bottom,#ffffff,#ffffff) left bottom no-repeat,
|
||
linear-gradient(to left,#ffffff,#ffffff) right bottom no-repeat,
|
||
linear-gradient(to left,#ffffff,#ffffff) right bottom no-repeat;
|
||
}
|
||
.fly-box{
|
||
padding-top: 44px;
|
||
padding-bottom: 10px;
|
||
width: 300px;
|
||
z-index: 900;
|
||
right: 10px;
|
||
top: 79px;
|
||
left: 59px;
|
||
position: absolute;
|
||
box-sizing: border-box;
|
||
z-index: 999!important;
|
||
z-index: 100;
|
||
border-bottom: 1px solid #008aff70;
|
||
border-left: 1px solid #008aff70;
|
||
border-right: 1px solid #008aff70;
|
||
box-shadow: 0 4px 15px 1px #02213bb3;
|
||
border-radius: 0;
|
||
background: linear-gradient(to left,#ffffff,#ffffff) left bottom no-repeat,
|
||
linear-gradient(to bottom,#ffffff,#ffffff) left bottom no-repeat,
|
||
linear-gradient(to left,#ffffff,#ffffff) right bottom no-repeat,
|
||
linear-gradient(to left,#ffffff,#ffffff) right bottom no-repeat;
|
||
background-size: 1px 10px,10px 1px,1px 10px,10px 1px;
|
||
background-color: rgba(22, 51, 76,.8)!important;
|
||
}
|
||
.fly-title{
|
||
height: 44px;
|
||
width: 100%;
|
||
line-height: 44px;
|
||
overflow: hidden;
|
||
height: 41px;
|
||
line-height: 41px;
|
||
font-size: 18px;
|
||
color: var(--mars-alert-title-color);
|
||
background: url(http://mars3d.cn/project/vue/assets/msg-title-bg.53c38de6.png);
|
||
background-size: 10px 44px;
|
||
padding: 0 5px 0 10px;
|
||
color: #fff;
|
||
position: absolute;
|
||
top: 0;
|
||
left: 0;
|
||
box-sizing: border-box;
|
||
font-size: 16px;
|
||
}
|
||
.fly-title i{
|
||
float: right;
|
||
margin-right: 10px;
|
||
cursor: pointer;
|
||
line-height: 40px;
|
||
}
|
||
.fly-content{
|
||
height: 100%;
|
||
overflow: auto;
|
||
padding: 5px 15px;
|
||
}
|
||
.fly-operation{
|
||
text-align: center;
|
||
margin-bottom: 10px;
|
||
padding-top: 10px;
|
||
}
|
||
.fly-operation button{
|
||
height: 32px;
|
||
background: rgba(0, 138, 255, .5);
|
||
border: none;
|
||
padding-left: 10px;
|
||
padding-right: 10px;
|
||
color: #fff;
|
||
cursor: pointer;
|
||
|
||
}
|
||
.fly-operation button i{
|
||
padding: 0 5px;
|
||
cursor: pointer;
|
||
}
|
||
.fly-table{
|
||
clear: both;
|
||
max-width: 100%;
|
||
box-sizing: border-box;
|
||
position: relative;
|
||
transition: opacity .3s;
|
||
color:#cdcdcd;
|
||
font-size: 12px;
|
||
border: solid 1px;
|
||
border-color: #0b67b7;
|
||
border-top-color: #c1c1d5;
|
||
min-height: 180px;
|
||
}
|
||
.fly-table table{
|
||
width: 100%;
|
||
border-spacing: 0;
|
||
border-collapse: separate;
|
||
}
|
||
.fly-table table td,fly-table table th{
|
||
padding: 10px;
|
||
}
|
||
.fly-table-header{
|
||
background: rgba(0, 138, 255, .2);
|
||
/* text-align: left; */
|
||
height: 32px;
|
||
}
|
||
.fly-table-body{
|
||
background: rgba(22, 51, 76,.5);
|
||
color: white;
|
||
}
|
||
.fly-table-operation{
|
||
text-align: center;
|
||
}
|
||
.fly-table-operation i{
|
||
padding: 0 2px;
|
||
cursor: pointer;
|
||
}
|
||
.handle{
|
||
box-sizing: border-box;
|
||
position: absolute;
|
||
z-index: 1;
|
||
width: 10px;
|
||
height: 10px;
|
||
opacity: 0;
|
||
}
|
||
.handle-l{
|
||
height: auto;
|
||
top: 10px;
|
||
left: 0;
|
||
bottom: 10px;
|
||
}
|
||
.handle-r{
|
||
height: auto;
|
||
top: 10px;
|
||
right: 0;
|
||
bottom: 10px;
|
||
}
|
||
.handle-t{
|
||
width: auto;
|
||
top: 0;
|
||
left: 10px;
|
||
right: 10px;
|
||
}
|
||
.handle-b{
|
||
width: auto;
|
||
bottom: 0;
|
||
left: 10px;
|
||
right: 10px;
|
||
}
|
||
.handle-lb{
|
||
bottom: 0;
|
||
left: 0;
|
||
}
|
||
.handle-rb{
|
||
bottom: 0;
|
||
right: 0;
|
||
}
|
||
</style>
|
||
|
||
<!-- 引入样式 -->
|
||
<link rel="stylesheet" href="./js/elementui/index.css" />
|
||
<!-- import Vue before Element -->
|
||
<script src="./js/vue2710.js"></script>
|
||
<!-- import JavaScript -->
|
||
<script src="./js/elementui/index.js"></script>
|
||
</head>
|
||
<body>
|
||
<div id="app">
|
||
<div class="menu-container">
|
||
<div class="fly-box">
|
||
<div class="fly-title">
|
||
<label>飞行漫游</label>
|
||
<i class="el-icon-close"></i>
|
||
</div>
|
||
<div class="fly-content">
|
||
<div class="fly-tab-path">
|
||
<div class="fly-operation">
|
||
<button><i class="el-icon-circle-plus-outline"></i>新增路线</button>
|
||
<button>导入</button>
|
||
<!-- <button>导出</button> -->
|
||
</div>
|
||
<div class="fly-table">
|
||
<table>
|
||
<thead class="fly-table-header">
|
||
<tr><th style="width: 150px;text-align: left;padding-left: 10px;">名称</th><th style="text-align: center">操作</th></tr>
|
||
</thead>
|
||
<tbody class="fly-table-body">
|
||
<tr>
|
||
<td>path1</td>
|
||
<td class="fly-table-operation">
|
||
<i title="漫游" class="el-icon-s-promotion"></i>
|
||
<i title="编辑" class="el-icon-edit-outline"></i>
|
||
<i title="删除" class="el-icon-delete"></i>
|
||
<i title="导出" class="el-icon-printer"></i>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td>path3</td>
|
||
<td class="fly-table-operation">
|
||
<i title="漫游" class="el-icon-s-promotion"></i>
|
||
<i title="编辑" class="el-icon-edit-outline"></i>
|
||
<i title="删除" class="el-icon-delete"></i>
|
||
<i title="导出" class="el-icon-printer"></i>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
<div class="fly-tab-coord" v-show="fly.showCoord">
|
||
<div class="title-box">
|
||
<label>路线名称:</label>
|
||
<select></select>
|
||
</div>
|
||
<div class="path-coord">
|
||
<div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="handle handle-l"></div>
|
||
<div class="handle handle-r"></div>
|
||
<div class="handle handle-t"></div>
|
||
<div class="handle handle-b"></div>
|
||
<div class="handle handle-lb"></div>
|
||
<div class="handle handle-rb"></div>
|
||
</div>
|
||
<el-button @click="playing(1)">开始</el-button>
|
||
<el-button @click="playing(0)">暂停</el-button>
|
||
<el-button @click="showModel(1)">显示路径</el-button>
|
||
<el-button @click="showModel(0)">隐藏路径</el-button>
|
||
</div>
|
||
|
||
<div id="cesiumContainer"></div>
|
||
</div>
|
||
|
||
<script>
|
||
Cesium.Ion.defaultAccessToken =
|
||
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5ZjRjNTZkNC01NDYxLTRhMjQtOGEwZC1kZjA3YzQ5YTJlZDkiLCJpZCI6MjYwODQsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1ODcxOTMwODN9.prGsSKyAW_9Ow5zHYPhbm3LsQL-ApQw5-5PNJkDaHi8";
|
||
|
||
new Vue({
|
||
el: "#app",
|
||
data() {
|
||
return {
|
||
fly:{
|
||
showCoord:false
|
||
},
|
||
visible: false,
|
||
trackData: [
|
||
[-2264042.839776213, 4900416.057746451, 3385983.014957804],
|
||
[-2263927.6347972867, 4900332.37135091, 3386143.168313143],
|
||
[-2263660.1017446117, 4899815.142609451, 3387070.379198967],
|
||
],
|
||
orientation: {
|
||
heading: 6.051403815715789,
|
||
pitch: -0.30439954732397,
|
||
roll: 6.283182924415642,
|
||
},
|
||
};
|
||
},
|
||
methods: {
|
||
playing(flag){
|
||
viewer.clock.shouldAnimate = !!flag;
|
||
viewer.trackedEntity = flag?this.entity:undefined;
|
||
},
|
||
showModel(flag){
|
||
this.entity.show = !!flag
|
||
},
|
||
initViewer() {
|
||
var viewer = new Cesium.Viewer("cesiumContainer", {
|
||
geocoder: false, //位置查找
|
||
homeButton: false, //视图返回初始位置
|
||
sceneModePicker: false, //视角选择器
|
||
// baseLayerPicker:false,//底图选择器
|
||
navigationHelpButton: false, //导航帮助按钮
|
||
animation: true, //动画控制器
|
||
shouldAnimate: true, // Enable animations
|
||
// creditContainer:"credit",//版权显示
|
||
timeline: true, //时间线
|
||
fullscreenButton: false, //全屏控件
|
||
vrButton: false,
|
||
});
|
||
|
||
var tileset = new Cesium.Cesium3DTileset({
|
||
url: "./SampleData/cesiumlab/tileset.json",
|
||
dynamicScreenSpaceError: true,
|
||
dynamicScreenSpaceErrorDensity: 0.00278,
|
||
dynamicScreenSpaceErrorFactor: 4.0,
|
||
dynamicScreenSpaceErrorHeightFalloff: 0.25,
|
||
});
|
||
viewer.scene.primitives.add(tileset);
|
||
viewer.zoomTo(tileset);
|
||
|
||
window.viewer = viewer;
|
||
window.camera = viewer.camera;
|
||
window.scene = viewer.scene;
|
||
},
|
||
initTimeline(){
|
||
var start = Cesium.JulianDate.fromDate(new Date("2022-10-9"));
|
||
var stop = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
this.trackData.length - 1,
|
||
new Cesium.JulianDate()
|
||
);
|
||
this.start = start;
|
||
this.stop = stop;
|
||
//Make sure viewer is at the desired time.
|
||
viewer.clock.startTime = start.clone();
|
||
viewer.clock.stopTime = stop.clone();
|
||
viewer.clock.currentTime = start.clone();
|
||
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP; //Loop at the end
|
||
viewer.clock.multiplier = 0.06;
|
||
//Set timeline to simulation bounds
|
||
viewer.timeline.zoomTo(start, stop);
|
||
},
|
||
runTrack() {
|
||
console.log("=====================");
|
||
let camera = window.viewer.camera;
|
||
camera.setView({
|
||
destination: new Cesium.Cartesian3.fromArray(this.trackData[0]),
|
||
orientation: this.orientation,
|
||
});
|
||
// this.points = this.calcInterval();
|
||
// this.time = 1;
|
||
// this.playing();
|
||
// camera.flyTo({
|
||
// destination: new Cesium.Cartesian3.fromArray(this.trackData[1]),
|
||
// orientation: this.orientation,
|
||
// duration: 5,
|
||
// complete: () => {
|
||
// camera.flyTo({
|
||
// destination: new Cesium.Cartesian3.fromArray(
|
||
// this.trackData[2]
|
||
// ),
|
||
// orientation: this.orientation,
|
||
// duration: 5,
|
||
// });
|
||
// },
|
||
// });
|
||
},
|
||
createModel() {
|
||
|
||
//Actually create the entity
|
||
var entity = viewer.entities.add({
|
||
//Set the entity availability to the same interval as the simulation time.
|
||
availability: new Cesium.TimeIntervalCollection([
|
||
new Cesium.TimeInterval({
|
||
start: this.start,
|
||
stop: this.stop,
|
||
}),
|
||
]),
|
||
//Use our computed positions
|
||
position: this.position,
|
||
//Automatically compute orientation based on position movement.
|
||
orientation: this.orientation,
|
||
model: {
|
||
uri: "./SampleData/models/CesiumAir/Cesium_Air.glb",
|
||
minimumPixelSize: 64,
|
||
show: true,
|
||
},
|
||
//Show the path as a pink line sampled in 1 second increments.
|
||
path: {
|
||
resolution: 1,
|
||
material: new Cesium.PolylineGlowMaterialProperty({
|
||
glowPower: 0.1,
|
||
color: Cesium.Color.fromCssColorString("rgba(0,0,0,1)"),
|
||
}),
|
||
width: 1,
|
||
},
|
||
});
|
||
this.entity = entity;
|
||
//追踪物体
|
||
viewer.trackedEntity = entity;
|
||
},
|
||
computeCirclularFlight() {
|
||
var property = new Cesium.SampledPositionProperty();
|
||
//设置插入选项
|
||
property.setInterpolationOptions({
|
||
// interpolationDegree: 1,
|
||
// interpolationAlgorithm: Cesium.LinearApproximation,
|
||
|
||
// interpolationDegree: 5,
|
||
// interpolationAlgorithm:
|
||
// Cesium.LagrangePolynomialApproximation,
|
||
|
||
interpolationDegree: 2,
|
||
interpolationAlgorithm: Cesium.HermitePolynomialApproximation,
|
||
});
|
||
for (var i = 0; i < this.trackData.length; i++) {
|
||
var time = Cesium.JulianDate.addSeconds(
|
||
this.start,
|
||
i,
|
||
new Cesium.JulianDate()
|
||
);
|
||
var position = Cesium.Cartesian3.fromArray(this.trackData[i]);
|
||
property.addSample(time, position);
|
||
}
|
||
return property;
|
||
},
|
||
initEvent() {
|
||
// let handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
|
||
// handler.setInputAction((movement) => {
|
||
// let pick = scene.pick(movent.position);
|
||
// // if(){
|
||
|
||
// // }
|
||
// }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
||
//监听时间变化
|
||
viewer.clock.onTick.addEventListener((e)=>{
|
||
if(viewer.clock.shouldAnimate === true){
|
||
let ori = this.orientation.getValue(viewer.clock.currentTime);//获取偏向角
|
||
let center = this.position.getValue(viewer.clock.currentTime);//获取位置
|
||
let transform = Cesium.Matrix4.fromRotationTranslation(Cesium.Matrix3.fromQuaternion(ori), center);//将偏向角转为3*3矩阵,利用实时点位转为4*4矩阵
|
||
viewer.camera.lookAtTransform(transform, new Cesium.Cartesian3(-100, 0, 0))//将相机向后面放一点
|
||
}
|
||
});
|
||
},
|
||
readyPath(){
|
||
// 给轨迹点关联时间和插值
|
||
const property = new Cesium.SampledPositionProperty();
|
||
property.setInterpolationOptions({
|
||
interpolationDegree: 5,
|
||
interpolationAlgorithm: Cesium.LagrangePolynomialApproximation,//设置插值算法
|
||
});
|
||
for (var i = 0; i < this.trackData.length; i++) {
|
||
var time = Cesium.JulianDate.addSeconds(
|
||
this.start,
|
||
i,
|
||
new Cesium.JulianDate()
|
||
);
|
||
var position = Cesium.Cartesian3.fromArray(this.trackData[i]);
|
||
property.addSample(time, position);
|
||
}
|
||
this.position = property;
|
||
|
||
this.orientation = new Cesium.VelocityOrientationProperty(property)
|
||
}
|
||
},
|
||
mounted() {
|
||
this.initViewer();
|
||
this.initTimeline();
|
||
this.readyPath();
|
||
this.initEvent();
|
||
this.createModel();
|
||
},
|
||
});
|
||
</script>
|
||
</body>
|
||
</html>
|