learning_cesium/waterMesh.html

257 lines
8.2 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>cesium-水面动画</title>
<script src="./Build/Cesium/Cesium.js"></script>
<link href="./Build/Cesium/Widgets/widgets.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<style>
html,
body,
#temp {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
#cesiumContainer {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
</style>
</head>
<body>
<div id="temp">
<div
style="display: -webkit-flex; display: flex; width: 100%; height: 100%"
>
<div style="width: 90%; height: 100%">
<div id="cesiumContainer"></div>
</div>
<div
style="
width: 10%;
height: 100%;
background-color: #d3d3d3;
padding: 30px;
"
>
<button class="btn" @click="addWaterAnimate">添加水面动画</button>
</div>
</div>
</div>
<script>
let EarthComp = new Vue({
el: "#temp",
data: {
_earth: undefined, // 注意Earth和Cesium的相关变量放在vue中必须使用下划线作为前缀
_viewer: undefined,
model: null, //切片模型
marks: [],
marksIndex: 1,
pitchValue: -10,
remainTime: 0,
usedTime: 0,
},
mounted: function () {
let that = this;
this.earthInit();
},
methods: {
/**
* 地球初始化
*/
earthInit() {
//天地图token
let TDT_tk = "tdt_token";
//Cesium token
let cesium_tk = "token";
//标注
let TDT_CIA_C =
"http://{s}.tianditu.gov.cn/cia_c/wmts?service=wmts&request=GetTile&version=1.0.0" +
"&LAYER=cia&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
"&style=default&format=tiles&tk=" +
TDT_tk;
// 添加mapbox自定义地图实例
let layer = new Cesium.MapboxStyleImageryProvider({
url: "https://api.mapbox.com/styles/v1",
username: "sungang",
styleId: "styleId",
accessToken: "accessToken",
scaleFactor: true,
});
//初始页面加载
Cesium.Ion.defaultAccessToken = cesium_tk;
let viewer = new Cesium.Viewer("cesiumContainer", {
geocoder: false, // 位置查找工具
baseLayerPicker: false, // 图层选择器(地形影像服务)
timeline: false, // 底部时间线
homeButton: false, // 视角返回初始位置
fullscreenButton: false, // 全屏
animation: false, // 左下角仪表盘(动画器件)
sceneModePicker: false, // 选择视角的模式(球体、平铺、斜视平铺)
navigationHelpButton: false, //导航帮助按钮
imageryProvider: layer,
});
//调用影响中文注记服务
viewer.imageryLayers.addImageryProvider(
new Cesium.WebMapTileServiceImageryProvider({
url: TDT_CIA_C,
layer: "tdtImg_c",
style: "default",
format: "tiles",
tileMatrixSetID: "c",
subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"],
tilingScheme: new Cesium.GeographicTilingScheme(),
tileMatrixLabels: [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
],
maximumLevel: 50,
show: false,
})
);
this._viewer = viewer;
// 去除版权信息
this._viewer._cesiumWidget._creditContainer.style.display = "none";
// 初始化dem位置
this.addDem();
},
/**
* 添加模型
*/
addDem() {
let that = this;
let terrainProvider = new Cesium.CesiumTerrainProvider({
url: "../res/data/dem/ASTGTM_N29E087D",
});
that._viewer.terrainProvider = terrainProvider;
that._viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(
87.54791,
29.57025,
17863.0
),
orientation: {
heading: Cesium.Math.toRadians(0.0),
pitch: Cesium.Math.toRadians(-25.0),
roll: 0.0,
},
});
},
/**
* 添加水面动画
*/
addWaterAnimate() {
let that = this;
let globe = this._viewer.scene.globe;
globe.depthTestAgainstTerrain = true;
this._viewer.camera.setView({
//定位到范围中心点
destination: Cesium.Cartesian3.fromDegrees(
87.07131373100303,
29.40857655725876,
12000
),
orientation: {
heading: Cesium.Math.toRadians(130.304929908965146), //1
pitch: Cesium.Math.toRadians(-17.364771143804237),
roll: 0.09931507517437696,
},
});
let points = [
[87.07131373100303, 29.40857655725876],
[87.33503858397042, 29.41843499494008],
[87.33072496578943, 29.193059292424955],
[87.05098771260403, 29.20286249623694],
];
let polygonArr = [];
for (let i = 0; i < points.length; i++) {
polygonArr.push(points[i][0]);
polygonArr.push(points[i][1]);
polygonArr.push(0);
}
that.drawWater(4400, polygonArr);
},
/**
*
* @param {*} targetHeight 目标高度
* @param {*} areaCoor 范围坐标
*/
drawWater(targetHeight, areaCoor) {
let that = this;
that._viewer.entities.remove(that.waterEntityEnd);
that.waterEntityEnd = that._viewer.scene.primitives.add(
new Cesium.Primitive({
geometryInstances: new Cesium.GeometryInstance({
geometry: new Cesium.PolygonGeometry({
polygonHierarchy: new Cesium.PolygonHierarchy(
Cesium.Cartesian3.fromDegreesArrayHeights(areaCoor)
),
height: targetHeight,
}),
}),
appearance: new Cesium.EllipsoidSurfaceAppearance({
aboveGround: true,
material: new Cesium.Material({
fabric: {
type: "Water",
uniforms: {
normalMap: "../../static/img/water.png",
frequency: 1000.0,
animationSpeed: 0.05,
amplitude: 10.0,
},
},
}),
}),
show: true,
})
);
},
},
});
</script>
</body>
</html>