Cesium-Examples/examples/cesiumEx/5.3.12、GUI视锥体.html

236 lines
8.0 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
<script src="./latlng.js"></script>
<script src="./cesium.map.min.js"></script>
<script src="./../libs/dat-gui/0.7.6/dat.gui.min.js"></script>
</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>
<!-- ./video.mp4 -->
<script type="text/javascript">
Cesium.Ion.defaultAccessToken =
2025-05-18 11:30:00 +00:00
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjM2EzNGJmNy02N2RmLTQ0MDMtYjI2MS1hZTJiMTIwZGYwMTYiLCJpZCI6MzA0MzEyLCJpYXQiOjE3NDc3MjM3MTV9.ePQNhuoVuDsi_z00lTm5W26wyW1Adcr1AWetGM6WSXI";
2025-03-11 08:25:45 +00:00
const viewer = new Cesium.Viewer("map", {
// 添加这两行就不会找烦人的defaultAccessToken了也不会找在线底图了
imageryProvider: false,
baseLayerPicker: false,
});
viewer.scene.debugShowFramesPerSecond = true;
viewer.scene.globe.depthTestAgainstTerrain = true;
var options = {
style: "img", // style: img、elec、cva
crs: "WGS84", // 使用84坐标系默认为GCJ02
};
viewer.imageryLayers.add(
new Cesium.ImageryLayer(new Cesium.AMapImageryProvider(options))
);
const gui = new dat.GUI();
gui.domElement.style = 'position:absolute;top:10px;left:10px;'
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(120, 30, 20000),
});
let primitive, primitive1;
const obj = {
x: 120,
y: 30,
z: 2000,
heading: 0,
pitch: 180,
roll: 0,
fov: 30,
near: 10,
far: 3000,
aspectRatio: 1.4,
};
var position = Cesium.Cartesian3.fromDegrees(obj.x, obj.y, obj.z);
var heading = Cesium.Math.toRadians(obj.heading);
var pitch = Cesium.Math.toRadians(obj.pitch);
var roll = Cesium.Math.toRadians(obj.roll);
var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
var orientation = Cesium.Transforms.headingPitchRollQuaternion(
position,
hpr
);
gui.add(obj, 'x', -180, 180).name('经度').onChange(function (value) {
updateFrustum();
});
gui.add(obj, 'y', -90, 90).name('纬度').onChange(function (value) {
updateFrustum();
});
gui.add(obj, 'z', 100, 10000).name('高度').onChange(function (value) {
updateFrustum();
});
gui.add(obj, 'heading', 0, 360).name('偏航角-水平').onChange(function (value) {
updateFrustum();
});
gui.add(obj, 'pitch', 0, 360).name('俯仰角-上下').onChange(function (value) {
updateFrustum();
});
gui.add(obj, 'roll', 0, 360).name('翻滚角-侧向').onChange(function (value) {
updateFrustum();
});
gui.add(obj, 'fov', 0, 180).name('上下角度').onChange(function (value) {
updateFrustum();
});
gui.add(obj, 'near', 0, 1000).name('近距').onChange(function (value) {
updateFrustum();
});
gui.add(obj, 'far', 0, 5000).name('远距').onChange(function (value) {
updateFrustum();
});
gui.add(obj, 'aspectRatio', 0, 3).name('横向比例').onChange(function (value) {
updateFrustum();
});
function updateFrustum() {
viewer.scene.primitives.remove(primitive);
viewer.scene.primitives.remove(primitive1);
var position = Cesium.Cartesian3.fromDegrees(obj.x, obj.y, obj.z);
var heading = Cesium.Math.toRadians(obj.heading);
var pitch = Cesium.Math.toRadians(obj.pitch);
var roll = Cesium.Math.toRadians(obj.roll);
var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
var orientation = Cesium.Transforms.headingPitchRollQuaternion(
position,
hpr
);
addFrustum(
position,
orientation,
obj.fov,
obj.near,
obj.far,
obj.aspectRatio
);
}
// 绘制
addFrustum(
position,
orientation,
obj.fov,
obj.near,
obj.far,
obj.aspectRatio
);
// 创建视锥体及轮廓线
function addFrustum(position, orientation, fov, near, far, aspectRatio) {
let frustum = new Cesium.PerspectiveFrustum({
// 查看的视场角绕Z轴旋转以弧度方式输入
fov: Cesium.Math.toRadians(fov),
// 视锥体的宽度/高度
aspectRatio: aspectRatio,
// 近面距视点的距离
near: near,
// 远面距视点的距离
far: far,
});
let instanceGeo = new Cesium.GeometryInstance({
geometry: new Cesium.FrustumGeometry({
frustum: frustum,
origin: position,
orientation: orientation,
vertexFormat: Cesium.VertexFormat.POSITION_ONLY,
}),
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
new Cesium.Color(1.0, 0.0, 0.0, 0.3)
),
},
});
let instanceGeoLine = new Cesium.GeometryInstance({
geometry: new Cesium.FrustumOutlineGeometry({
frustum: frustum,
origin: position,
orientation: orientation,
}),
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
new Cesium.Color(1.0, 1.0, 1.0, 1)
),
},
});
primitive = new Cesium.Primitive({
geometryInstances: [instanceGeo],
appearance: new Cesium.PerInstanceColorAppearance({
closed: true,
flat: true,
}),
asynchronous: false,
});
primitive1 = new Cesium.Primitive({
geometryInstances: [instanceGeoLine],
appearance: new Cesium.PerInstanceColorAppearance({
closed: true,
flat: true,
}),
asynchronous: false,
});
viewer.scene.primitives.add(primitive);
viewer.scene.primitives.add(primitive1);
// --------------------------获取顶点坐标---------------------------------------------------------
let zb = Cesium.FrustumOutlineGeometry.createGeometry(instanceGeo.geometry)
const positions = zb.attributes.position.values;
// console.log(positions)
const temp = [];
for (let i = 0; i < positions.length; i += 3) {
temp.push(positions.slice(i, i + 3));
}
// console.log(temp)
const result = [];
temp.forEach(function (chunk) {
result.push(latlng.formatPositon(new Cesium.Cartesian3(chunk[0], chunk[1], chunk[2])));
});
// console.log(result)
// --------------------------获取顶点坐标---------------------------------------------------------
}
</script>
</body>
</html>