前言
缺少前置学习使用资料,请自行查阅:[https://blog.csdn.net/weixin_44402694/article/details/123110136](https://blog.csdn.net/weixin_44402694/article/details/123110136)
以下示例使用到的公共静态资料,不建议下载,建议官网自行下载超图Build资源,示例所涉及图片会在示例使用到时提供出来。如有需要可下载:[https://download.csdn.net/download/weixin_44402694/82180350](https://download.csdn.net/download/weixin_44402694/82180350)。
特效-天空盒设置。
使用
-
效果
-
完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>特效 - 天空盒设置</title>
<link href="./public/Build/Cesium/Widgets/widgets.css" rel="stylesheet" />
<script
type="text/javascript"
src="./public/Build/Cesium/Cesium.js"
></script>
<style>
* {
margin: 0;
padding: 0;
}
html,
body,
#cesium-container {
width: 100%;
height: 100%;
}
.panel {
position: fixed;
left: 10px;
top: 10px;
z-index: 1;
background-color: #fff;
padding: 10px;
}
.panel .btn {
cursor: pointer;
display: none;
}
.panel .check {
cursor: pointer;
}
</style>
</head>
<body>
<div id="cesium-container" />
<div class="panel">
<p class="check">开启天空盒 <input type="checkbox" /></p>
<p class="btn">晚霞</p>
<p class="btn">蓝天</p>
</div>
<script>
let viewer,
scene,
defaultSkyBox,
sunSkyBox,
blueSkyBox,
skyListener,
currentSkyBox
window.onload = function () {
viewer = new Cesium.Viewer('cesium-container', {
sceneModePicker: true,
navigation: false,
})
scene = viewer.scene
scene.camera.flyTo({
destination: new Cesium.Cartesian3(
-2179825.7788852383,
4380581.427298224,
4091538.107446992
),
orientation: {
heading: 0.005352643897039933,
pitch: -0.03880119222393663,
roll: 6.2831853071795845,
},
})
initCreateSkyBoxHandler()
initBindDrawEventHandler()
}
// 初始化绑定按钮的绘制事件
function initBindDrawEventHandler() {
const check = document.querySelector('.check input')
const btns = document.querySelectorAll('.panel .btn')
check.addEventListener('change', () => {
Array.from(btns).forEach((btn) => {
btn.style.display = check.checked ? 'block' : 'none'
})
if (check.checked) {
// 开启天空盒默认晚霞
sunSkyBox.WSpeed = 0.5
sunSkyBox.show = true
currentSkyBox = sunSkyBox
scene.skyBox = currentSkyBox
gradualChange()
blueSkyBox.show = false
activeCurrentClickBtnHandler(0)
} else {
scene.postRender.removeEventListener(skyListener)
scene.skyBox = defaultSkyBox // 还原为默认的天空盒
scene.skyAtmosphere.show = true
}
})
btns[0].addEventListener('click', () => {
activeCurrentClickBtnHandler(0)
sunSkyBox.WSpeed = 0.5
sunSkyBox.show = true
currentSkyBox = sunSkyBox
scene.skyBox = currentSkyBox
blueSkyBox.show = false
})
btns[1].addEventListener('click', () => {
activeCurrentClickBtnHandler(1)
blueSkyBox.WSpeed = 0.5
blueSkyBox.show = true
currentSkyBox = blueSkyBox
scene.skyBox = currentSkyBox
sunSkyBox.show = false
})
}
// 初始化创建天空盒
function initCreateSkyBoxHandler() {
// 蓝天
sunSkyBox = new Cesium.SkyBox({
sources: {
positiveX:
'http://support.supermap.com.cn:8090/webgl/examples/webgl/images/SkyBox/sunsetglow/Right.jpg',
negativeX:
'http://support.supermap.com.cn:8090/webgl/examples/webgl/images/SkyBox/sunsetglow/Left.jpg',
positiveY:
'http://support.supermap.com.cn:8090/webgl/examples/webgl/images/SkyBox/sunsetglow/Front.jpg',
negativeY:
'http://support.supermap.com.cn:8090/webgl/examples/webgl/images/SkyBox/sunsetglow/Back.jpg',
positiveZ:
'http://support.supermap.com.cn:8090/webgl/examples/webgl/images/SkyBox/sunsetglow/Up.jpg',
negativeZ:
'http://support.supermap.com.cn:8090/webgl/examples/webgl/images/SkyBox/sunsetglow/Down.jpg',
},
})
// 晚霞
blueSkyBox = new Cesium.SkyBox({
sources: {
positiveX:
'http://support.supermap.com.cn:8090/webgl/examples/webgl/images/SkyBox/bluesky/Right.jpg',
negativeX:
'http://support.supermap.com.cn:8090/webgl/examples/webgl/images/SkyBox/bluesky/Left.jpg',
positiveY:
'http://support.supermap.com.cn:8090/webgl/examples/webgl/images/SkyBox/bluesky/Front.jpg',
negativeY:
'http://support.supermap.com.cn:8090/webgl/examples/webgl/images/SkyBox/bluesky/Back.jpg',
positiveZ:
'http://support.supermap.com.cn:8090/webgl/examples/webgl/images/SkyBox/bluesky/Up.jpg',
negativeZ:
'http://support.supermap.com.cn:8090/webgl/examples/webgl/images/SkyBox/bluesky/Down.jpg',
},
})
defaultSkyBox = viewer.scene.skyBox
//初始化时把天空盒资源准备好
function initialSkyBox() {
if (viewer.scene.frameState.passes.render) {
sunSkyBox.update(viewer.scene.frameState, true)
blueSkyBox.update(viewer.scene.frameState, true)
viewer.scene.postRender.removeEventListener(initialSkyBox)
}
}
scene.postRender.addEventListener(initialSkyBox)
}
//相机上升到一定位置,天空盒出现渐变效果
function gradualChange() {
skyListener = function () {
var cameraHeight = scene.camera.positionCartographic.height
var skyAtmosphereH1 = 22e4 // 大气开始渐变的最大高度
var skyBoxH1 = 15e4 // 天空开始渐变的最大高度
var skyBoxH2 = 12e4 // 天空开始渐变的最小高度
var bufferHeight = 1e4
if (cameraHeight < skyAtmosphereH1 && Cesium.defined(currentSkyBox)) {
var skyAtmosphereT =
(cameraHeight - skyBoxH2) / (skyAtmosphereH1 - skyBoxH2)
if (skyAtmosphereT > 1.0) {
skyAtmosphereT = 1.0
} else if (skyAtmosphereT < 0.0) {
skyAtmosphereT = 0.0
}
var skyBoxT = (cameraHeight - skyBoxH2) / (skyBoxH1 - skyBoxH2)
if (skyBoxT > 1.0) {
skyBoxT = 1.0
} else if (skyBoxT < 0.0) {
skyBoxT = 0.0
}
currentSkyBox.alpha = 1.0 - skyBoxT
if (cameraHeight > skyBoxH2) {
scene.skyAtmosphere.show = true
scene.skyAtmosphere.alpha = skyAtmosphereT
scene.skyBox = currentSkyBox
} else {
scene.skyAtmosphere.show = false
}
} else {
scene.skyAtmosphere.alpha = 1.0
scene.skyBox = defaultSkyBox
}
//控制相机 速率
if (scene.skyBox !== defaultSkyBox) {
if (
cameraHeight > skyBoxH2 - 2 * bufferHeight &&
cameraHeight < skyBoxH1 + 3 * bufferHeight
) {
scene.screenSpaceCameraController.zoomFactor = 0.4
} else {
scene.screenSpaceCameraController.zoomFactor = 5.0
}
} else {
scene.skyBox.alpha = 1.0
scene.skyAtmosphere.alpha = 1.0
scene.screenSpaceCameraController.zoomFactor = 5.0
}
}
scene.postRender.addEventListener(skyListener)
}
// 高亮当前点击的按钮
function activeCurrentClickBtnHandler(idx) {
const btns = document.querySelectorAll('.panel .btn')
Array.from(btns).forEach((btn, index) => {
btn.style.color = index === idx ? 'red' : '#000'
})
}
</script>
</body>
</html>