140 lines
5.9 KiB
HTML
140 lines
5.9 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
|
||
<title>裁剪效果</title>
|
||
<!-- <script src="https://cesiumjs.org/releases/1.57/Build/Cesium/Cesium.js"></script>
|
||
<link href="https://cesiumjs.org/releases/1.57/Build/Cesium/Widgets/widgets.css" rel="stylesheet"> -->
|
||
<script src="./Build168/Cesium/Cesium.js"></script>
|
||
<style>
|
||
@import url(./Build/Cesium/Widgets/widgets.css);
|
||
html,
|
||
body,
|
||
#cesiumContainer {
|
||
width: 100%;
|
||
height: 100%;
|
||
margin: 0;
|
||
padding: 0;
|
||
overflow: hidden;
|
||
background-color: #000000;
|
||
}
|
||
</style>
|
||
</head>
|
||
|
||
<body>
|
||
<div id="cesiumContainer"></div>
|
||
<script>
|
||
|
||
Cesium.Ion.defaultAccessToken =
|
||
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5ZjRjNTZkNC01NDYxLTRhMjQtOGEwZC1kZjA3YzQ5YTJlZDkiLCJpZCI6MjYwODQsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1ODcxOTMwODN9.prGsSKyAW_9Ow5zHYPhbm3LsQL-ApQw5-5PNJkDaHi8";
|
||
|
||
var viewer = new Cesium.Viewer('cesiumContainer', {
|
||
// imageryProvider: new Cesium.UrlTemplateImageryProvider({
|
||
// url: 'http://www.google.cn/maps/vt?lyrs=s@716&x={x}&y={y}&z={z}'
|
||
// })
|
||
});
|
||
var scene = viewer.scene;
|
||
|
||
// viewer.scene.globe.depthTestAgainstTerrain = true;
|
||
|
||
var targetY = 0; //ClippingPlane距离原点的距离
|
||
var selectedPlane; // 鼠标选中的ClippingPlane
|
||
|
||
// 注册鼠标按下事件
|
||
viewer.screenSpaceEventHandler.setInputAction(function (movement) {
|
||
var pickedObject = scene.pick(movement.position);
|
||
if (Cesium.defined(pickedObject) && Cesium.defined(pickedObject.id) && Cesium.defined(pickedObject.id.plane)) {
|
||
selectedPlane = pickedObject.id.plane;
|
||
selectedPlane.material = Cesium.Color.BLUE.withAlpha(0.5); // 更改选中的切面颜色
|
||
selectedPlane.outlineColor = Cesium.Color.WHITE;
|
||
scene.screenSpaceCameraController.enableInputs = false; // 取消默认的鼠标一切输入事件
|
||
}
|
||
}, Cesium.ScreenSpaceEventType.LEFT_DOWN);
|
||
|
||
// 注册鼠标松开事件
|
||
viewer.screenSpaceEventHandler.setInputAction(function () {
|
||
if (Cesium.defined(selectedPlane)) {
|
||
selectedPlane.material = Cesium.Color.RED.withAlpha(0.6); // 恢复选中的切面颜色
|
||
selectedPlane.outlineColor = Cesium.Color.WHITE;
|
||
selectedPlane = undefined;
|
||
}
|
||
scene.screenSpaceCameraController.enableInputs = true; // 恢复默认的鼠标一切输入事件
|
||
}, Cesium.ScreenSpaceEventType.LEFT_UP);
|
||
|
||
// 注册鼠标移动事件
|
||
viewer.screenSpaceEventHandler.setInputAction(function (movement) {
|
||
if (Cesium.defined(selectedPlane)) {
|
||
var deltaY = movement.startPosition.y - movement.endPosition.y; // 计算鼠标移动的过程中产生的垂直高度距离
|
||
targetY += deltaY;
|
||
}
|
||
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
||
|
||
|
||
|
||
// 改变tileset高度
|
||
function change(height) {
|
||
height = Number(height);
|
||
if (isNaN(height)) {
|
||
return;
|
||
}
|
||
var cartographic = Cesium.Cartographic.fromCartesian(tileset.boundingSphere.center);
|
||
var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
|
||
var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, height);
|
||
var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
|
||
tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
|
||
};
|
||
|
||
// 创建切面平面集合
|
||
var clippingPlanes = new Cesium.ClippingPlaneCollection({
|
||
planes: [
|
||
new Cesium.ClippingPlane(new Cesium.Cartesian3(0, 1, 0), 0) // 平面的方向(x,y,z) 以及 平面到原点的距离
|
||
],
|
||
edgeColor: Cesium.Color.WHITE, // 平面切割时模型的边缘颜色
|
||
edgeWidth: 0 // 平面切割时模型的边缘宽度
|
||
});
|
||
|
||
// 加载大雁塔模型
|
||
var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
|
||
url: "./SampleData/Cesium3DTiles/dayanta/tileset.json",
|
||
clippingPlanes: clippingPlanes
|
||
}));
|
||
// 动态改变ClippingPlane距离原点的距离
|
||
function createPlaneUpdateFunction(plane) {
|
||
return function () {
|
||
plane.distance = targetY + 0;
|
||
return plane;
|
||
};
|
||
}
|
||
tileset.readyPromise.then(function () {
|
||
|
||
// 当模型加载完成后,改变高度,3dtile模型一般都会飘在空中
|
||
change(-410);
|
||
|
||
var boundingSphere = tileset.boundingSphere; // 模型的包围球范围
|
||
var radius = boundingSphere.radius; // 长度
|
||
|
||
viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.5, -0.2, radius * 4.0));
|
||
|
||
// 加载plane可视化切面平面
|
||
for (var i = 0; i < clippingPlanes.length; ++i) {
|
||
var plane = clippingPlanes.get(i);
|
||
viewer.entities.add({
|
||
position: boundingSphere.center,
|
||
plane: {
|
||
dimensions: new Cesium.Cartesian2(radius , radius),
|
||
material: Cesium.Color.RED.withAlpha(0.6),
|
||
plane: new Cesium.CallbackProperty(createPlaneUpdateFunction(plane), false),
|
||
outline: true,
|
||
outlineColor: Cesium.Color.WHITE
|
||
}
|
||
});
|
||
}
|
||
});
|
||
|
||
|
||
</script>
|
||
</body>
|
||
|
||
</html> |