learning_cesium/waterMesh.html

257 lines
8.2 KiB
HTML
Raw Permalink Normal View History

2024-03-19 18:06:25 +08:00
<!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>