mirror of
https://github.com/jiawanlong/Cesium-Examples.git
synced 2025-07-04 15:17:36 +00:00
1274 lines
42 KiB
HTML
1274 lines
42 KiB
HTML
<!--********************************************************************
|
||
* by jiawanlong
|
||
*********************************************************************-->
|
||
<!DOCTYPE html>
|
||
<html>
|
||
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<link rel="stylesheet" href="./../../libs/cesium/Cesium1.98/Widgets/widgets.css" />
|
||
<script type="text/javascript" src="./../../libs/cesium/Cesium1.98/Cesium.js"></script>
|
||
<script src="./cesium.map.min.js"></script>
|
||
<script src="./CircleScanSystem.js"></script>
|
||
<script src="./CircleWaveMaterialProperty.js"></script>
|
||
<script src="./DynamicWallMaterialProperty.js"></script>
|
||
<script src="./popup.js"></script>
|
||
<script src="./latlng.js"></script>
|
||
<style>
|
||
.cesium-viewer-bottom,
|
||
.cesium-viewer-animationContainer,
|
||
.cesium-animation-theme,
|
||
.cesium-viewer-timelineContainer {
|
||
display: none;
|
||
}
|
||
|
||
.bx-popup-ctn2 {
|
||
position: absolute;
|
||
z-index: 999;
|
||
color: #fff;
|
||
/* margin: -80px 0 0; */
|
||
margin: 0 0 0 0;
|
||
transform: translate(-50%, -100%);
|
||
}
|
||
|
||
.bx-popup-ctn2 .divpoint-wrap {
|
||
padding: 0;
|
||
width: max-content;
|
||
}
|
||
|
||
.bx-popup-ctn2 .divpoint-center {
|
||
background: linear-gradient(45deg,
|
||
#4f869d,
|
||
rgba(18, 93, 120, 0.65),
|
||
40%,
|
||
rgba(30, 127, 162, 0.65));
|
||
border: 1px solid #40aee2;
|
||
border-radius: 5px;
|
||
box-shadow: 0 0 10px 2px #29baf1;
|
||
}
|
||
|
||
.bx-popup-ctn2 .bx-popup-tip {
|
||
width: 17px;
|
||
background: #fff;
|
||
height: 17px;
|
||
padding: 1px;
|
||
margin: -10px auto 0;
|
||
-webkit-transform: rotate(45deg);
|
||
-moz-transform: rotate(45deg);
|
||
-ms-transform: rotate(45deg);
|
||
transform: rotate(45deg);
|
||
}
|
||
|
||
.bx-popup-ctn2 .bx-popup-header-ctn {
|
||
background: rgba(0, 173, 255, 0.49);
|
||
color: #fff;
|
||
font-size: 15px;
|
||
padding: 4px;
|
||
}
|
||
|
||
.bx-popup-ctn2 .bx-popup-close {
|
||
position: absolute;
|
||
top: 4px;
|
||
right: 2px;
|
||
width: 26px;
|
||
height: 26px;
|
||
cursor: pointer;
|
||
}
|
||
|
||
.bx-popup-ctn2 .bx-popup-content-ctn {
|
||
padding: 10px;
|
||
}
|
||
|
||
.bx-popup-ctn2 .directional {
|
||
bottom: 0;
|
||
left: 0;
|
||
width: 2px;
|
||
height: 40px;
|
||
background-color: #28bbf0;
|
||
transform: none;
|
||
margin: 0 0 0px 50%;
|
||
}
|
||
|
||
.bx-popup-ctn2 .divpoint-border {
|
||
transition: 0.3s ease-in;
|
||
background: linear-gradient(0, #8cdee5 2px, #8cdee5 0) no-repeat,
|
||
linear-gradient(-90deg, #8cdee5 2px, #8cdee5 0) no-repeat,
|
||
linear-gradient(-180deg, #8cdee5 2px, #8cdee5 0) no-repeat,
|
||
linear-gradient(-270deg, #8cdee5 2px, #8cdee5 0) no-repeat;
|
||
background-size: 0 2px, 2px 0, 0 2px, 2px 0;
|
||
background-position: 0 0, 100% 0, 100% 100%, 0 100%;
|
||
}
|
||
|
||
.bx-popup-ctn2 .divpoint-border:hover {
|
||
background-size: 100% 2px, 2px 100%, 100% 2px, 2px 100%;
|
||
}
|
||
</style>
|
||
</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>
|
||
<script type="text/javascript">
|
||
Cesium.Ion.defaultAccessToken =
|
||
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIyNDMxOTA2NS1lY2Q3LTQ0YmUtOTE1Mi1iNWE2OGYwZjc0MjkiLCJpZCI6MjM1NjMwLCJpYXQiOjE3MzA3MjQzMTJ9.Xhu-9FyVEyqBKWEr0V9Sybt-elTCWHt9peL9-mNh-4E";
|
||
const viewer = new Cesium.Viewer("map", {
|
||
animation: true, //是否创建动画小器件,左下角仪表
|
||
|
||
baseLayerPicker: false, //是否显示图层选择器
|
||
fullscreenButton: false, //是否显示全屏按钮
|
||
geocoder: false, //是否显示geocoder小器件,右上角查询按钮
|
||
homeButton: false, //是否显示Home按钮
|
||
infoBox: false, //是否显示信息框
|
||
sceneModePicker: false, //是否显示3D/2D选择器
|
||
selectionIndicator: false, //是否显示选取指示器组件
|
||
timeline: true, //是否显示时间轴
|
||
navigationHelpButton: false, //是否显示右上角的帮助按钮
|
||
scene3DOnly: true, //如果设置为true,则所有几何图形以3D模式绘制以节约GPU资源
|
||
clock: new Cesium.Clock(), //用于控制当前时间的时钟对象
|
||
selectedImageryProviderViewModel: undefined, //当前图像图层的显示模型,仅baseLayerPicker设为true有意义
|
||
imageryProviderViewModels:
|
||
Cesium.createDefaultImageryProviderViewModels(), //可供BaseLayerPicker选择的图像图层ProviderViewModel数组
|
||
selectedTerrainProviderViewModel: undefined, //当前地形图层的显示模型,仅baseLayerPicker设为true有意义
|
||
terrainProviderViewModels:
|
||
Cesium.createDefaultTerrainProviderViewModels(), //可供BaseLayerPicker选择的地形图层ProviderViewModel数组
|
||
fullscreenElement: document.body, //全屏时渲染的HTML元素,
|
||
useDefaultRenderLoop: true, //如果需要控制渲染循环,则设为true
|
||
targetFrameRate: undefined, //使用默认render loop时的帧率
|
||
showRenderLoopErrors: false, //如果设为true,将在一个HTML面板中显示错误信息
|
||
automaticallyTrackDataSourceClocks: true, //自动追踪最近添加的数据源的时钟设置
|
||
|
||
contextOptions: {
|
||
// 支持html2cavas截图
|
||
webgl: {
|
||
preserveDrawingBuffer: true, // 设置为 true 来启用
|
||
},
|
||
},
|
||
|
||
//传递给Scene对象的上下文参数(scene.options)
|
||
sceneMode: Cesium.SceneMode.SCENE3D, //初始场景模式
|
||
mapProjection: new Cesium.WebMercatorProjection(), //地图投影体系
|
||
dataSources: new Cesium.DataSourceCollection(),
|
||
});
|
||
|
||
// 清除默认底图
|
||
viewer.imageryLayers.remove(viewer.imageryLayers.get(0));
|
||
|
||
// 清除默认地形
|
||
viewer.scene.terrainProvider = new Cesium.EllipsoidTerrainProvider({});
|
||
|
||
// 加载单张图片
|
||
var imageryProvider = new Cesium.SingleTileImageryProvider({
|
||
url: "./world_b.jpg",
|
||
id: "1",
|
||
});
|
||
viewer.imageryLayers.addImageryProvider(imageryProvider);
|
||
|
||
var options = {
|
||
crs: "WGS84", // 使用84坐标系,默认为:GCJ02
|
||
style: 4,
|
||
};
|
||
viewer.imageryLayers.add(
|
||
new Cesium.ImageryLayer(new Cesium.TencentImageryProvider(options))
|
||
);
|
||
let tileset;
|
||
|
||
let czmldata = new Cesium.CzmlDataSource.load("./wx.czml");
|
||
viewer.dataSources.add(czmldata);
|
||
viewer.clock.shouldAnimate = true;
|
||
|
||
let inters = 3;
|
||
let lon = 110;
|
||
let quan = 1;
|
||
let timer = setInterval(() => {
|
||
lon = lon - inters;
|
||
if (lon < -180) {
|
||
lon = 180;
|
||
quan = quan + 1;
|
||
}
|
||
if (quan == 2 && lon > 110) {
|
||
clearInterval(timer);
|
||
viewer.camera.flyTo({
|
||
destination: Cesium.Cartesian3.fromDegrees(110, 10, 50000000.0),
|
||
orientation: {
|
||
heading: Cesium.Math.toRadians(358.0),
|
||
pitch: Cesium.Math.toRadians(-89.5),
|
||
roll: 0.0,
|
||
},
|
||
easingFunction: Cesium.EasingFunction.LINEAR_NONE,
|
||
complete: () => {
|
||
viewer.camera.flyTo({
|
||
destination: Cesium.Cartesian3.fromDegrees(
|
||
121.549708,
|
||
25.036475,
|
||
2662.5
|
||
),
|
||
// easingFunction: Cesium.EasingFunction.LINEAR_NONE,
|
||
duration: 5,
|
||
orientation: {
|
||
heading: Cesium.Math.toRadians(2.8),
|
||
pitch: Cesium.Math.toRadians(-84.8),
|
||
roll: 0.0,
|
||
},
|
||
complete: () => {
|
||
loadsss();
|
||
loadTX();
|
||
loadHuo();
|
||
setTimeout(function () {
|
||
loadFJ();
|
||
loadFJ1();
|
||
loadMsg();
|
||
loadXFC();
|
||
loadXJC();
|
||
}, 1000);
|
||
},
|
||
});
|
||
},
|
||
});
|
||
} else {
|
||
viewer.camera.setView({
|
||
destination: Cesium.Cartesian3.fromDegrees(lon, 10, 50000000.0),
|
||
orientation: {
|
||
heading: Cesium.Math.toRadians(358.0),
|
||
pitch: Cesium.Math.toRadians(-89.5),
|
||
roll: 0.0,
|
||
},
|
||
});
|
||
}
|
||
}, 30);
|
||
// loadsss();
|
||
// loadTX();
|
||
// loadHuo();
|
||
// setTimeout(function () {
|
||
// loadFJ();
|
||
// loadFJ1();
|
||
// loadMsg();
|
||
// loadXFC();
|
||
// loadXJC();
|
||
// }, 1000);
|
||
|
||
function loadTX() {
|
||
var circleScanSystem = new CircleScanSystem(viewer, {
|
||
type: "Circle",
|
||
lon: "121.554532",
|
||
lat: "25.042364",
|
||
radius: 100,
|
||
});
|
||
// var circleScanSystem1 = new CircleScanSystem(viewer, {
|
||
// type: "Circle",
|
||
// lon: "121.552956",
|
||
// lat: "25.037859",
|
||
// radius: 100,
|
||
// });
|
||
var circleScanSystem2 = new CircleScanSystem(viewer, {
|
||
type: "Radar",
|
||
lon: "121.5463",
|
||
lat: "25.041775",
|
||
radius: 200,
|
||
});
|
||
var circleScanSystem2 = new CircleScanSystem(viewer, {
|
||
type: "Radar",
|
||
lon: "121.55649",
|
||
lat: "25.034101",
|
||
radius: 80,
|
||
});
|
||
|
||
viewer.entities.add({
|
||
position: Cesium.Cartesian3.fromDegrees(121.552956, 25.037859, 1),
|
||
ellipse: {
|
||
semiMinorAxis: 150,
|
||
semiMajorAxis: 150,
|
||
height: 10,
|
||
material: new Cesium.CircleWaveMaterialProperty({
|
||
color: "#0858D6",
|
||
duration: 2000,
|
||
gradient: 0,
|
||
count: 3,
|
||
}),
|
||
},
|
||
});
|
||
|
||
viewer.entities.add({
|
||
position: Cesium.Cartesian3.fromDegrees(121.546405, 25.037277, 1),
|
||
ellipse: {
|
||
semiMinorAxis: 150,
|
||
semiMajorAxis: 150,
|
||
height: 10,
|
||
material: new Cesium.CircleWaveMaterialProperty({
|
||
color: "#FFCB33",
|
||
duration: 3000,
|
||
gradient: 0,
|
||
count: 4,
|
||
}),
|
||
},
|
||
});
|
||
|
||
let source = `czm_material czm_getMaterial(czm_materialInput materialInput)
|
||
{
|
||
czm_material material = czm_getDefaultMaterial(materialInput);
|
||
vec2 st = materialInput.st;
|
||
vec4 colorImage = texture(image, vec2(fract((st.s - speed * czm_frameNumber * 0.001)), st.t));
|
||
material.alpha = colorImage.a * color.a;
|
||
material.diffuse = color.rgb;
|
||
return material;
|
||
}`;
|
||
|
||
let material = new Cesium.Material({
|
||
fabric: {
|
||
uniforms: {
|
||
color: Cesium.Color.fromCssColorString("#7ffeff"),
|
||
image: "./line1.png",
|
||
speed: 10,
|
||
},
|
||
source: source,
|
||
},
|
||
translucent: function () {
|
||
return true;
|
||
},
|
||
});
|
||
|
||
var appearance = new Cesium.PolylineMaterialAppearance();
|
||
appearance.material = material;
|
||
|
||
viewer.scene.primitives.add(
|
||
new Cesium.Primitive({
|
||
geometryInstances: new Cesium.GeometryInstance({
|
||
geometry: new Cesium.PolylineGeometry({
|
||
positions: Cesium.Cartesian3.fromDegreesArray([
|
||
121.54383710651683, 25.04158767318846, 121.54886660576454,
|
||
25.041520778338935, 121.5489302661648, 25.037809764195416,
|
||
121.55763292042423, 25.037610190383617,
|
||
]),
|
||
width: 5.0,
|
||
}),
|
||
}),
|
||
appearance: appearance,
|
||
})
|
||
);
|
||
viewer.scene.primitives.add(
|
||
new Cesium.Primitive({
|
||
geometryInstances: new Cesium.GeometryInstance({
|
||
geometry: new Cesium.PolylineGeometry({
|
||
positions: Cesium.Cartesian3.fromDegreesArray([
|
||
121.55375466873483, 25.044150811019648, 121.55544465416511,
|
||
25.037715002796432, 121.54867305622793, 25.037870016863494,
|
||
121.54871015658512, 25.033391988086763,
|
||
]),
|
||
width: 5.0,
|
||
}),
|
||
}),
|
||
appearance: appearance,
|
||
})
|
||
);
|
||
|
||
viewer.scene.primitives.add(
|
||
new Cesium.Primitive({
|
||
geometryInstances: new Cesium.GeometryInstance({
|
||
geometry: new Cesium.PolylineGeometry({
|
||
positions: Cesium.Cartesian3.fromDegreesArray([
|
||
121.54896133676533, 25.044688605691732, 121.54907493228905,
|
||
25.041491821748266, 121.55760945852529, 25.041291233041818,
|
||
121.55747389009491, 25.033084480003765, 121.543669229817,
|
||
25.033348047963145, 121.54380690184257, 25.038091540100325,
|
||
121.54874670371714, 25.03798076751336, 121.54905974002901,
|
||
25.044688605691732, 121.54652610721564, 25.04506985487869,
|
||
121.54386854531765, 25.044935266844632, 121.54368432924542,
|
||
25.03824665858879, 121.5575974570097, 25.037847869365393,
|
||
121.55782052058595, 25.04495769594847, 121.55375546574658,
|
||
25.044262809177837, 121.54905987101426, 25.044733445131712,
|
||
]),
|
||
width: 5.0,
|
||
}),
|
||
}),
|
||
appearance: appearance,
|
||
})
|
||
);
|
||
|
||
viewer.scene.primitives.add(
|
||
new Cesium.Primitive({
|
||
geometryInstances: new Cesium.GeometryInstance({
|
||
geometry: new Cesium.PolylineGeometry({
|
||
positions: Cesium.Cartesian3.fromDegreesArray([
|
||
121.55247102172734, 25.033294114977295, 121.5525021244456,
|
||
25.036184694941213, 121.5511111493363, 25.037979511647478,
|
||
121.54379246879625, 25.038023901030698, 121.54384621066026,
|
||
25.041653508137443, 121.5461551006216, 25.041497151878872,
|
||
121.54599566446967, 25.0379573182758, 121.55297123215576,
|
||
25.03793512578399, 121.55298088865737, 25.04145248665732,
|
||
121.55296365188275, 25.044138703413196,
|
||
]),
|
||
width: 5.0,
|
||
}),
|
||
}),
|
||
appearance: appearance,
|
||
})
|
||
);
|
||
|
||
viewer.scene.primitives.add(
|
||
new Cesium.Primitive({
|
||
geometryInstances: new Cesium.GeometryInstance({
|
||
geometry: new Cesium.PolylineGeometry({
|
||
positions: Cesium.Cartesian3.fromDegreesArray([
|
||
121.54375455026866, 25.036029857442244, 121.54610032336575,
|
||
25.035985626035824, 121.54598728823271, 25.03340416800252,
|
||
121.54881491346185, 25.033382155659254, 121.54878833220863,
|
||
25.035565602229056, 121.55252458735305, 25.035344663858893,
|
||
121.55250253652764, 25.036361704627197, 121.55299202722222,
|
||
25.036605184507167, 121.55292156212147, 25.037668884495375,
|
||
121.55566169439066, 25.0375801655385, 121.55560211090364,
|
||
25.035499311540576, 121.55739387018264, 25.033206088198455,
|
||
]),
|
||
width: 5.0,
|
||
}),
|
||
}),
|
||
appearance: appearance,
|
||
})
|
||
);
|
||
|
||
let data = [
|
||
[121.5435972916668, 25.03335124407222],
|
||
[121.55758689992729, 25.03305850196061],
|
||
[121.5578765706079, 25.045082938309875],
|
||
[121.55308216929683, 25.044389044803737],
|
||
[121.54911574643842, 25.04483902108565],
|
||
[121.54648299411446, 25.045158015241427],
|
||
[121.54397513270857, 25.04493282041925],
|
||
[121.54359717389292, 25.033369546587437],
|
||
];
|
||
let coor = Array.prototype.concat.apply([], data);
|
||
let datasouce = map_common_addDatasouce("wall");
|
||
|
||
datasouce.entities.add({
|
||
wall: {
|
||
positions: Cesium.Cartesian3.fromDegreesArray(coor),
|
||
positions: Cesium.Cartesian3.fromDegreesArray(coor),
|
||
maximumHeights: new Array(data.length).fill(50),
|
||
minimunHeights: new Array(data.length).fill(0),
|
||
|
||
// 动态
|
||
material: new Cesium.DynamicWallMaterialProperty({
|
||
trailImage: "./wall.png",
|
||
color: Cesium.Color.CYAN,
|
||
duration: 1500,
|
||
}),
|
||
},
|
||
});
|
||
}
|
||
|
||
function loadFJ() {
|
||
let start = new Cesium.JulianDate.fromDate(new Date());
|
||
|
||
// 开始时间 cesium用的JulianDate:代表天文朱利安时间,用的是世界协调时,比北京时间晚8个小时, 加上东8时,就是当前的真正时间
|
||
start = Cesium.JulianDate.addHours(start, 1, new Cesium.JulianDate());
|
||
const center = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
90,
|
||
new Cesium.JulianDate()
|
||
);
|
||
const center2 = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
180,
|
||
new Cesium.JulianDate()
|
||
);
|
||
const center3 = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
270,
|
||
new Cesium.JulianDate()
|
||
);
|
||
const stop = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
360,
|
||
new Cesium.JulianDate()
|
||
);
|
||
|
||
// 设置时钟范围
|
||
viewer.clock.startTime = start.clone();
|
||
viewer.clock.stopTime = stop.clone();
|
||
viewer.clock.currentTime = start.clone();
|
||
|
||
// 循环结束时后续动作
|
||
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
|
||
|
||
// 时间速率控制速度,时间调快多少倍,比如原来用时360秒,调整10倍后,现在用时36秒
|
||
viewer.clock.multiplier = 10;
|
||
//给下方时间线设置边界
|
||
viewer.timeline.zoomTo(start, stop);
|
||
|
||
const position = new Cesium.SampledPositionProperty();
|
||
|
||
const startPos = Cesium.Cartesian3.fromDegrees(
|
||
121.54502359550423,
|
||
25.04103506115554,
|
||
300
|
||
);
|
||
const centerPos = Cesium.Cartesian3.fromDegrees(
|
||
121.55653842563282,
|
||
25.040757514098885,
|
||
300
|
||
);
|
||
const centerPos2 = Cesium.Cartesian3.fromDegrees(
|
||
121.55626812445513,
|
||
25.033279833487114,
|
||
300
|
||
);
|
||
const centerPos3 = Cesium.Cartesian3.fromDegrees(
|
||
121.54412259158227,
|
||
25.0335247429108,
|
||
300
|
||
);
|
||
const endPos = Cesium.Cartesian3.fromDegrees(
|
||
121.54502359550423,
|
||
25.04103506115554,
|
||
300
|
||
);
|
||
|
||
position.addSample(start, startPos);
|
||
position.addSample(center, centerPos);
|
||
position.addSample(center2, centerPos2);
|
||
position.addSample(center3, centerPos3);
|
||
position.addSample(stop, endPos);
|
||
|
||
const entity = viewer.entities.add({
|
||
// 将实体availability设置为与模拟时间相同的时间间隔。
|
||
availability: new Cesium.TimeIntervalCollection([
|
||
new Cesium.TimeInterval({
|
||
start: start,
|
||
stop: stop,
|
||
}),
|
||
]),
|
||
position: position, // 计算实体位置属性
|
||
orientation: new Cesium.VelocityOrientationProperty(position),
|
||
model: {
|
||
uri: "missile/scene.gltf",
|
||
scale: 10,
|
||
minimumPixelSize: 32,
|
||
},
|
||
|
||
// 路径
|
||
path: {
|
||
show: false,
|
||
resolution: 1,
|
||
material: new Cesium.PolylineGlowMaterialProperty({
|
||
glowPower: 0.3,
|
||
color: Cesium.Color.BLUE,
|
||
}),
|
||
width: 5,
|
||
},
|
||
});
|
||
}
|
||
function loadFJ1() {
|
||
let start = new Cesium.JulianDate.fromDate(new Date());
|
||
|
||
// 开始时间 cesium用的JulianDate:代表天文朱利安时间,用的是世界协调时,比北京时间晚8个小时, 加上东8时,就是当前的真正时间
|
||
start = Cesium.JulianDate.addHours(start, 1, new Cesium.JulianDate());
|
||
const center = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
90,
|
||
new Cesium.JulianDate()
|
||
);
|
||
const center2 = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
180,
|
||
new Cesium.JulianDate()
|
||
);
|
||
const center3 = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
270,
|
||
new Cesium.JulianDate()
|
||
);
|
||
const stop = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
360,
|
||
new Cesium.JulianDate()
|
||
);
|
||
|
||
// 设置时钟范围
|
||
viewer.clock.startTime = start.clone();
|
||
viewer.clock.stopTime = stop.clone();
|
||
viewer.clock.currentTime = start.clone();
|
||
|
||
// 循环结束时后续动作
|
||
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
|
||
|
||
// 时间速率控制速度,时间调快多少倍,比如原来用时360秒,调整10倍后,现在用时36秒
|
||
viewer.clock.multiplier = 10;
|
||
//给下方时间线设置边界
|
||
viewer.timeline.zoomTo(start, stop);
|
||
|
||
const position = new Cesium.SampledPositionProperty();
|
||
|
||
const startPos = Cesium.Cartesian3.fromDegrees(
|
||
121.54502359550423,
|
||
25.04103506115554,
|
||
210
|
||
);
|
||
const centerPos = Cesium.Cartesian3.fromDegrees(
|
||
121.55653842563282,
|
||
25.040757514098885,
|
||
210
|
||
);
|
||
const centerPos2 = Cesium.Cartesian3.fromDegrees(
|
||
121.55626812445513,
|
||
25.033279833487114,
|
||
210
|
||
);
|
||
const centerPos3 = Cesium.Cartesian3.fromDegrees(
|
||
121.54412259158227,
|
||
25.0335247429108,
|
||
210
|
||
);
|
||
const endPos = Cesium.Cartesian3.fromDegrees(
|
||
121.54502359550423,
|
||
25.04103506115554,
|
||
210
|
||
);
|
||
|
||
position.addSample(start, startPos);
|
||
position.addSample(center, centerPos);
|
||
position.addSample(center2, centerPos2);
|
||
position.addSample(center3, centerPos3);
|
||
position.addSample(stop, endPos);
|
||
|
||
const entity = viewer.entities.add({
|
||
// 将实体availability设置为与模拟时间相同的时间间隔。
|
||
availability: new Cesium.TimeIntervalCollection([
|
||
new Cesium.TimeInterval({
|
||
start: start,
|
||
stop: stop,
|
||
}),
|
||
]),
|
||
position: position, // 计算实体位置属性
|
||
orientation: new Cesium.VelocityOrientationProperty(position),
|
||
// model: {
|
||
// uri: 'missile/scene.gltf',
|
||
// scale: 10,
|
||
// minimumPixelSize: 32
|
||
// },
|
||
cylinder: {
|
||
material: Cesium.Color.fromCssColorString("rgba(255,240,0, 0.35)"),
|
||
length: 200, //圆柱体的长度
|
||
topRadius: 0, //顶部半径
|
||
bottomRadius: 70,
|
||
},
|
||
// 路径
|
||
path: {
|
||
show: false,
|
||
resolution: 1,
|
||
material: new Cesium.PolylineGlowMaterialProperty({
|
||
glowPower: 0.3,
|
||
color: Cesium.Color.BLUE,
|
||
}),
|
||
width: 5,
|
||
},
|
||
});
|
||
}
|
||
function loadXFC() {
|
||
let start = new Cesium.JulianDate.fromDate(new Date());
|
||
|
||
start = Cesium.JulianDate.addHours(start, 1, new Cesium.JulianDate());
|
||
const center = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
90,
|
||
new Cesium.JulianDate()
|
||
);
|
||
const center2 = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
180,
|
||
new Cesium.JulianDate()
|
||
);
|
||
const center3 = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
270,
|
||
new Cesium.JulianDate()
|
||
);
|
||
const stop = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
360,
|
||
new Cesium.JulianDate()
|
||
);
|
||
|
||
// 设置时钟范围
|
||
viewer.clock.startTime = start.clone();
|
||
viewer.clock.stopTime = stop.clone();
|
||
viewer.clock.currentTime = start.clone();
|
||
|
||
// 循环结束时后续动作
|
||
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
|
||
|
||
// 时间速率控制速度,时间调快多少倍,比如原来用时360秒,调整10倍后,现在用时36秒
|
||
viewer.clock.multiplier = 20;
|
||
//给下方时间线设置边界
|
||
viewer.timeline.zoomTo(start, stop);
|
||
|
||
const position = new Cesium.SampledPositionProperty();
|
||
|
||
const startPos = Cesium.Cartesian3.fromDegrees(
|
||
121.54883989579417,
|
||
25.04435068135976,
|
||
1
|
||
);
|
||
const centerPos = Cesium.Cartesian3.fromDegrees(
|
||
121.54891310254465,
|
||
25.041764022763047,
|
||
1
|
||
);
|
||
const centerPos2 = Cesium.Cartesian3.fromDegrees(
|
||
121.54886429804492,
|
||
25.039707921882993,
|
||
1
|
||
);
|
||
const centerPos3 = Cesium.Cartesian3.fromDegrees(
|
||
121.54886429804492,
|
||
25.037696004860265,
|
||
1
|
||
);
|
||
const endPos = Cesium.Cartesian3.fromDegrees(
|
||
121.55147533881802,
|
||
25.03767389569815,
|
||
1
|
||
);
|
||
|
||
position.addSample(start, startPos);
|
||
position.addSample(center, centerPos);
|
||
position.addSample(center2, centerPos2);
|
||
position.addSample(center3, centerPos3);
|
||
position.addSample(stop, endPos);
|
||
|
||
const entity = viewer.entities.add({
|
||
availability: new Cesium.TimeIntervalCollection([
|
||
new Cesium.TimeInterval({
|
||
start: start,
|
||
stop: stop,
|
||
}),
|
||
]),
|
||
position: position, // 计算实体位置属性
|
||
orientation: new Cesium.VelocityOrientationProperty(position),
|
||
model: {
|
||
uri: "./xiaofangche.gltf",
|
||
scale: 10,
|
||
minimumPixelSize: 32,
|
||
},
|
||
|
||
path: {
|
||
show: false,
|
||
},
|
||
});
|
||
}
|
||
function loadXJC() {
|
||
let start = new Cesium.JulianDate.fromDate(new Date());
|
||
|
||
start = Cesium.JulianDate.addHours(start, 1, new Cesium.JulianDate());
|
||
const center = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
120,
|
||
new Cesium.JulianDate()
|
||
);
|
||
const center2 = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
240,
|
||
new Cesium.JulianDate()
|
||
);
|
||
const stop = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
360,
|
||
new Cesium.JulianDate()
|
||
);
|
||
|
||
// 设置时钟范围
|
||
viewer.clock.startTime = start.clone();
|
||
viewer.clock.stopTime = stop.clone();
|
||
viewer.clock.currentTime = start.clone();
|
||
|
||
// 循环结束时后续动作
|
||
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
|
||
|
||
// 时间速率控制速度,时间调快多少倍,比如原来用时360秒,调整10倍后,现在用时36秒
|
||
viewer.clock.multiplier = 20;
|
||
//给下方时间线设置边界
|
||
viewer.timeline.zoomTo(start, stop);
|
||
|
||
const position = new Cesium.SampledPositionProperty();
|
||
|
||
const startPos = Cesium.Cartesian3.fromDegrees(
|
||
121.54884167619042,
|
||
25.033273079716622,
|
||
1
|
||
);
|
||
const centerPos = Cesium.Cartesian3.fromDegrees(
|
||
121.54859722416842,
|
||
25.037776601420433,
|
||
1
|
||
);
|
||
const centerPos2 = Cesium.Cartesian3.fromDegrees(
|
||
121.55544188079375,
|
||
25.037721231255958,
|
||
1
|
||
);
|
||
|
||
const endPos = Cesium.Cartesian3.fromDegrees(
|
||
121.55391405565354,
|
||
25.043590329597393,
|
||
1
|
||
);
|
||
|
||
position.addSample(start, startPos);
|
||
position.addSample(center, centerPos);
|
||
position.addSample(center2, centerPos2);
|
||
position.addSample(stop, endPos);
|
||
|
||
const entity = viewer.entities.add({
|
||
availability: new Cesium.TimeIntervalCollection([
|
||
new Cesium.TimeInterval({
|
||
start: start,
|
||
stop: stop,
|
||
}),
|
||
]),
|
||
position: position, // 计算实体位置属性
|
||
orientation: new Cesium.VelocityOrientationProperty(position),
|
||
model: {
|
||
uri: "./wajueji.glb",
|
||
scale: 10,
|
||
minimumPixelSize: 32,
|
||
},
|
||
|
||
path: {
|
||
show: false,
|
||
},
|
||
});
|
||
}
|
||
function loadMsg() {
|
||
var popup = new Popup({
|
||
viewer: viewer,
|
||
className: "bx-popup-ctn2",
|
||
});
|
||
|
||
popup.add({
|
||
geometry: Cesium.Cartesian3.fromDegrees(121.551034, 25.036803, 30),
|
||
content: {
|
||
header: "事件提醒",
|
||
content: `
|
||
<div><span>事件名称:</span><span>沃尔玛发生火灾</span></div>
|
||
<div><span>监控编号:</span><span>${parseInt(
|
||
Math.random() * 100
|
||
)}</span></div>
|
||
<div><span>发生时间:</span><span>2024-08-03 12:00:33</span></div>
|
||
<div><span>火灾等级:</span><span>一般</span></div>
|
||
`,
|
||
},
|
||
isclose: true,
|
||
});
|
||
|
||
popup.add({
|
||
// lon: "121.554532",
|
||
// lat: "25.042364",
|
||
geometry: Cesium.Cartesian3.fromDegrees(121.554532, 25.042364, 30),
|
||
content: {
|
||
header: "事件提醒",
|
||
content: `
|
||
<div><span>事件名称:</span><span>仁和路发生打架斗殴</span></div>
|
||
<div><span>监控编号:</span><span>${parseInt(
|
||
Math.random() * 100
|
||
)}</span></div>
|
||
<div><span>发生时间:</span><span>2024-08-03 14:00:33</span></div>
|
||
<div><span>案件等级:</span><span>紧急!</span></div>
|
||
`,
|
||
},
|
||
isclose: true,
|
||
});
|
||
}
|
||
|
||
function loadHuo() {
|
||
//火焰特效
|
||
class FireEffect {
|
||
constructor(viewer, obj) {
|
||
this.viewer = viewer;
|
||
this.viewModel = {
|
||
emissionRate: 5,
|
||
gravity: 0.0, //设置重力参数
|
||
minimumParticleLife: 1,
|
||
maximumParticleLife: 6,
|
||
minimumSpeed: 1.0, //粒子发射的最小速度
|
||
maximumSpeed: 4.0, //粒子发射的最大速度
|
||
startScale: 0.0,
|
||
endScale: 10.0,
|
||
particleSize: 25.0,
|
||
};
|
||
this.emitterModelMatrix = new Cesium.Matrix4();
|
||
this.translation = new Cesium.Cartesian3();
|
||
this.rotation = new Cesium.Quaternion();
|
||
this.hpr = new Cesium.HeadingPitchRoll();
|
||
this.trs = new Cesium.TranslationRotationScale();
|
||
this.scene = this.viewer.scene;
|
||
this.particleSystem = "";
|
||
this.entity = this.viewer.entities.add({
|
||
//选择粒子放置的坐标
|
||
position: Cesium.Cartesian3.fromDegrees(obj.lng, obj.lat),
|
||
});
|
||
|
||
this.init();
|
||
}
|
||
|
||
init() {
|
||
const _this = this;
|
||
this.viewer.clock.shouldAnimate = true;
|
||
this.viewer.scene.globe.depthTestAgainstTerrain = false;
|
||
// this.viewer.trackedEntity = this.entity;
|
||
var particleSystem = this.scene.primitives.add(
|
||
new Cesium.ParticleSystem({
|
||
image: "./fire.png", //生成所需粒子的图片路径
|
||
//粒子在生命周期开始时的颜色
|
||
startColor: new Cesium.Color(1, 1, 1, 1),
|
||
//粒子在生命周期结束时的颜色
|
||
endColor: new Cesium.Color(0.5, 0, 0, 0),
|
||
//粒子在生命周期开始时初始比例
|
||
startScale: _this.viewModel.startScale,
|
||
//粒子在生命周期结束时比例
|
||
endScale: _this.viewModel.endScale,
|
||
//粒子发射的最小速度
|
||
minimumParticleLife: _this.viewModel.minimumParticleLife,
|
||
//粒子发射的最大速度
|
||
maximumParticleLife: _this.viewModel.maximumParticleLife,
|
||
//粒子质量的最小界限
|
||
minimumSpeed: _this.viewModel.minimumSpeed,
|
||
//粒子质量的最大界限
|
||
maximumSpeed: _this.viewModel.maximumSpeed,
|
||
//以像素为单位缩放粒子图像尺寸
|
||
imageSize: new Cesium.Cartesian2(
|
||
_this.viewModel.particleSize,
|
||
_this.viewModel.particleSize
|
||
),
|
||
//每秒发射的粒子数
|
||
emissionRate: _this.viewModel.emissionRate,
|
||
//粒子系统发射粒子的时间(秒)
|
||
lifetime: 16.0,
|
||
//粒子系统是否应该在完成时循环其爆发
|
||
loop: true,
|
||
//设置粒子的大小是否以米或像素为单位
|
||
sizeInMeters: true,
|
||
//系统的粒子发射器
|
||
emitter: new Cesium.ConeEmitter(Cesium.Math.toRadians(45.0)), //BoxEmitter 盒形发射器,ConeEmitter 锥形发射器,SphereEmitter 球形发射器,CircleEmitter圆形发射器
|
||
})
|
||
);
|
||
this.particleSystem = particleSystem;
|
||
this.preUpdateEvent();
|
||
}
|
||
|
||
//场景渲染事件
|
||
preUpdateEvent() {
|
||
let _this = this;
|
||
this.viewer.scene.preUpdate.addEventListener(function (
|
||
scene,
|
||
time
|
||
) {
|
||
//发射器地理位置
|
||
_this.particleSystem.modelMatrix = _this.computeModelMatrix(
|
||
_this.entity,
|
||
time
|
||
);
|
||
//发射器局部位置
|
||
_this.particleSystem.emitterModelMatrix =
|
||
_this.computeEmitterModelMatrix();
|
||
// 将发射器旋转
|
||
if (_this.viewModel.spin) {
|
||
_this.viewModel.heading += 1.0;
|
||
_this.viewModel.pitch += 1.0;
|
||
_this.viewModel.roll += 1.0;
|
||
}
|
||
});
|
||
}
|
||
|
||
computeModelMatrix(entity, time) {
|
||
return entity.computeModelMatrix(time, new Cesium.Matrix4());
|
||
}
|
||
|
||
computeEmitterModelMatrix() {
|
||
this.hpr = Cesium.HeadingPitchRoll.fromDegrees(
|
||
0.0,
|
||
0.0,
|
||
0.0,
|
||
this.hpr
|
||
);
|
||
this.trs.translation = Cesium.Cartesian3.fromElements(
|
||
-4.0,
|
||
0.0,
|
||
1.4,
|
||
this.translation
|
||
);
|
||
this.trs.rotation = Cesium.Quaternion.fromHeadingPitchRoll(
|
||
this.hpr,
|
||
this.rotation
|
||
);
|
||
|
||
return Cesium.Matrix4.fromTranslationRotationScale(
|
||
this.trs,
|
||
this.emitterModelMatrix
|
||
);
|
||
}
|
||
|
||
removeEvent() {
|
||
this.viewer.scene.preUpdate.removeEventListener(
|
||
this.preUpdateEvent,
|
||
this
|
||
);
|
||
this.emitterModelMatrix = undefined;
|
||
this.translation = undefined;
|
||
this.rotation = undefined;
|
||
this.hpr = undefined;
|
||
this.trs = undefined;
|
||
}
|
||
|
||
//移除粒子特效
|
||
remove() {
|
||
() => {
|
||
return this.removeEvent();
|
||
}; //清除事件
|
||
this.viewer.scene.primitives.remove(this.particleSystem); //删除粒子对象
|
||
this.viewer.entities.remove(this.entity); //删除entity
|
||
}
|
||
}
|
||
class smokeEffect {
|
||
constructor(viewer, obj) {
|
||
this.viewer = viewer;
|
||
this.viewModel = {
|
||
emissionRate: 12,
|
||
gravity: 2.0, //设置重力参数
|
||
minimumParticleLife: 2,
|
||
maximumParticleLife: 2,
|
||
minimumSpeed: 1.0, //粒子发射的最小速度
|
||
maximumSpeed: 2.0, //粒子发射的最大速度
|
||
startScale: 2.0,
|
||
endScale: 11.0,
|
||
particleSize: 7.0,
|
||
};
|
||
this.emitterModelMatrix = new Cesium.Matrix4();
|
||
this.translation = new Cesium.Cartesian3();
|
||
this.rotation = new Cesium.Quaternion();
|
||
this.hpr = new Cesium.HeadingPitchRoll();
|
||
this.trs = new Cesium.TranslationRotationScale();
|
||
this.scene = this.viewer.scene;
|
||
this.particleSystem = "";
|
||
this.entity = this.viewer.entities.add({
|
||
//选择粒子放置的坐标
|
||
position: Cesium.Cartesian3.fromDegrees(obj.lng, obj.lat, 10),
|
||
});
|
||
this.init();
|
||
}
|
||
|
||
init() {
|
||
const _this = this;
|
||
this.viewer.clock.shouldAnimate = true;
|
||
this.viewer.scene.globe.depthTestAgainstTerrain = false;
|
||
// this.viewer.trackedEntity = this.entity;
|
||
var particleSystem = this.scene.primitives.add(
|
||
new Cesium.ParticleSystem({
|
||
image: "./smoke.png", //生成所需粒子的图片路径
|
||
//粒子在生命周期开始时的颜色
|
||
startColor: Cesium.Color.BLACK.withAlpha(0.7),
|
||
//粒子在生命周期结束时的颜色
|
||
endColor: Cesium.Color.WHITE.withAlpha(0.3),
|
||
//粒子在生命周期开始时初始比例
|
||
startScale: _this.viewModel.startScale,
|
||
//粒子在生命周期结束时比例
|
||
endScale: _this.viewModel.endScale,
|
||
//粒子发射的最小速度
|
||
minimumParticleLife: _this.viewModel.minimumParticleLife,
|
||
//粒子发射的最大速度
|
||
maximumParticleLife: _this.viewModel.maximumParticleLife,
|
||
//粒子质量的最小界限
|
||
minimumSpeed: _this.viewModel.minimumSpeed,
|
||
//粒子质量的最大界限
|
||
maximumSpeed: _this.viewModel.maximumSpeed,
|
||
//以像素为单位缩放粒子图像尺寸
|
||
imageSize: new Cesium.Cartesian2(
|
||
_this.viewModel.particleSize,
|
||
_this.viewModel.particleSize
|
||
),
|
||
//每秒发射的粒子数
|
||
emissionRate: _this.viewModel.emissionRate,
|
||
//粒子系统发射粒子的时间(秒)
|
||
lifetime: 161.0,
|
||
//设置粒子的大小是否以米或像素为单位
|
||
sizeInMeters: true,
|
||
//系统的粒子发射器
|
||
emitter: new Cesium.CircleEmitter(2.0), //BoxEmitter 盒形发射器,ConeEmitter 锥形发射器,SphereEmitter 球形发射器,CircleEmitter圆形发射器
|
||
//回调函数,实现各种喷泉、烟雾效果
|
||
updateCallback: (p, dt) => {
|
||
return this.applyGravity(p, dt);
|
||
},
|
||
})
|
||
);
|
||
this.particleSystem = particleSystem;
|
||
this.preUpdateEvent();
|
||
}
|
||
|
||
//场景渲染事件
|
||
preUpdateEvent() {
|
||
let _this = this;
|
||
this.viewer.scene.preUpdate.addEventListener(function (
|
||
scene,
|
||
time
|
||
) {
|
||
//发射器地理位置
|
||
_this.particleSystem.modelMatrix = _this.computeModelMatrix(
|
||
_this.entity,
|
||
time
|
||
);
|
||
//发射器局部位置
|
||
_this.particleSystem.emitterModelMatrix =
|
||
_this.computeEmitterModelMatrix();
|
||
// 将发射器旋转
|
||
if (_this.viewModel.spin) {
|
||
_this.viewModel.heading += 1.0;
|
||
_this.viewModel.pitch += 1.0;
|
||
_this.viewModel.roll += 1.0;
|
||
}
|
||
});
|
||
}
|
||
|
||
computeModelMatrix(entity, time) {
|
||
return entity.computeModelMatrix(time, new Cesium.Matrix4());
|
||
}
|
||
|
||
computeEmitterModelMatrix() {
|
||
this.hpr = Cesium.HeadingPitchRoll.fromDegrees(
|
||
0.0,
|
||
0.0,
|
||
0.0,
|
||
this.hpr
|
||
);
|
||
this.trs.translation = Cesium.Cartesian3.fromElements(
|
||
-4.0,
|
||
0.0,
|
||
1.4,
|
||
this.translation
|
||
);
|
||
this.trs.rotation = Cesium.Quaternion.fromHeadingPitchRoll(
|
||
this.hpr,
|
||
this.rotation
|
||
);
|
||
|
||
return Cesium.Matrix4.fromTranslationRotationScale(
|
||
this.trs,
|
||
this.emitterModelMatrix
|
||
);
|
||
}
|
||
|
||
applyGravity(p, dt) {
|
||
var gravityScratch = new Cesium.Cartesian3();
|
||
var position = p.position;
|
||
Cesium.Cartesian3.normalize(position, gravityScratch);
|
||
Cesium.Cartesian3.fromElements(
|
||
20 * dt,
|
||
30 * dt,
|
||
gravityScratch.y * dt,
|
||
gravityScratch
|
||
);
|
||
p.velocity = Cesium.Cartesian3.add(
|
||
p.velocity,
|
||
gravityScratch,
|
||
p.velocity
|
||
);
|
||
}
|
||
|
||
removeEvent() {
|
||
this.viewer.scene.preUpdate.removeEventListener(
|
||
this.preUpdateEvent,
|
||
this
|
||
);
|
||
this.emitterModelMatrix = undefined;
|
||
this.translation = undefined;
|
||
this.rotation = undefined;
|
||
this.hpr = undefined;
|
||
this.trs = undefined;
|
||
}
|
||
|
||
//移除粒子特效
|
||
remove() {
|
||
() => {
|
||
return this.removeEvent();
|
||
}; //清除事件
|
||
this.viewer.scene.primitives.remove(this.particleSystem); //删除粒子对象
|
||
this.viewer.entities.remove(this.entity); //删除entity
|
||
}
|
||
}
|
||
new FireEffect(viewer, {
|
||
lng: 121.55001,
|
||
lat: 25.039343,
|
||
});
|
||
new FireEffect(viewer, {
|
||
lng: 121.551034,
|
||
lat: 25.036803,
|
||
});
|
||
new smokeEffect(viewer, {
|
||
lng: 121.551034,
|
||
lat: 25.036803,
|
||
});
|
||
}
|
||
|
||
function loadsss() {
|
||
tileset = new Cesium.Cesium3DTileset({
|
||
url: "./data/tileset.json",
|
||
});
|
||
tileset.readyPromise
|
||
.then(function (tileset) {
|
||
viewer.scene.primitives.add(tileset);
|
||
|
||
viewer.camera.flyTo({
|
||
destination: Cesium.Cartesian3.fromDegrees(
|
||
121.549884,
|
||
25.025771,
|
||
1050.6
|
||
),
|
||
duration: 2,
|
||
orientation: {
|
||
heading: Cesium.Math.toRadians(0.7),
|
||
pitch: Cesium.Math.toRadians(-38.7),
|
||
roll: 0.0,
|
||
},
|
||
});
|
||
|
||
customShader2(tileset);
|
||
|
||
})
|
||
.catch(function (error) {
|
||
console.log(error);
|
||
});
|
||
}
|
||
|
||
function customShader2(tileset) {
|
||
let customShader = new Cesium.CustomShader({
|
||
//片元着色器
|
||
fragmentShaderText: `
|
||
void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) {
|
||
vec3 positionMC = fsInput.attributes.positionMC;
|
||
material.diffuse = vec3(0.0, 1.0-positionMC.y*0.005, 1.0-positionMC.y*0.0015);
|
||
|
||
float _baseHeight = 18.0; // 物体的基础高度,需要修改成一个合适的建筑基础高度
|
||
float _heightRange = 60.0; // 高亮的范围(_baseHeight ~ _baseHeight + _heightRange) 默认是 0-60米
|
||
float _glowRange = 120.0; // 光环的移动范围(高度)
|
||
|
||
float vtxf_height = fsInput.attributes.positionMC.y - _baseHeight;
|
||
float vtxf_a11 = fract(czm_frameNumber / 360.0) * 3.14159265 * 2.0; //此处括号内分母为移动速度
|
||
float vtxf_a12 = vtxf_height / _heightRange + sin(vtxf_a11) * 0.1;
|
||
material.diffuse *= vec3(vtxf_a12, vtxf_a12, vtxf_a12);
|
||
|
||
float vtxf_a13 = fract(czm_frameNumber / 360.0); //此处括号内分母为移动速度,数值越大,速度越慢
|
||
float vtxf_h = clamp(vtxf_height / _glowRange, 0.0, 1.0);
|
||
vtxf_a13 = abs(vtxf_a13 - 0.5) * 2.0;
|
||
float vtxf_diff = step(0.01, abs(vtxf_h - vtxf_a13)); // 0.1 为高亮光条的范围(粗细)
|
||
material.diffuse += material.diffuse * (1.0 - vtxf_diff);
|
||
}`,
|
||
});
|
||
tileset.customShader = customShader;
|
||
viewer.scene.globe.depthTestAgainstTerrain = true; //(开启)
|
||
}
|
||
</script>
|
||
</body>
|
||
|
||
</html> |