/* 引入Cesium */ // import * as Cesium from 'Cesium'; import SkyBoxOnGround from "../../Core/SkyBoxOnGround.js"; /** * 天空盒子 */ class SkyBox { /** * 默认初始化 * @param {Object} viewer 三维场景 */ constructor(viewer) { if (!viewer) throw new Cesium.DeveloperError('no viewer object!'); this._viewer = viewer; this._farSkyBox = viewer.scene.skyBox; //默认天空盒子,即远景天空盒子 } } /** * 通用对外公开函数 */ Object.assign(SkyBox.prototype, /** @lends SkyBox.prototype */ { /** * 自定义天空盒子 * @param {Object} options 具有以下属性: * @param {Object} [options.type="蓝天"] 默认蓝天,晚霞,阴天,紫色星空,蓝色星空 * @param {Object} [options.sources] 天空盒子6个方向的图片地址(立方体全景图片) * @param {String} [options.sources.positiveX] * @param {String} [options.sources.negativeX] * @param {String} [options.sources.positiveY] * @param {String} [options.sources.negativeY] * @param {String} [options.sources.positiveZ] * @param {String} [options.sources.negativeZ] * @param {Number} [options.height=200000] 开始显示自定义天空盒子高度,默认=200000 * * @example * setGroundSkyBox({ * type:"蓝天", * height:200000, * sources: { //蓝天 * positiveX: 'http://support.supermap.com.cn:8090/webgl/examples/webgl/imgs/SkyBox/bluesky/Right.jpg', * negativeX: 'http://support.supermap.com.cn:8090/webgl/examples/webgl/imgs/SkyBox/bluesky/Left.jpg', * positiveY: 'http://support.supermap.com.cn:8090/webgl/examples/webgl/imgs/SkyBox/bluesky/Front.jpg', * negativeY: 'http://support.supermap.com.cn:8090/webgl/examples/webgl/imgs/SkyBox/bluesky/Back.jpg', * positiveZ: 'http://support.supermap.com.cn:8090/webgl/examples/webgl/imgs/SkyBox/bluesky/Up.jpg', * negativeZ: 'http://support.supermap.com.cn:8090/webgl/examples/webgl/imgs/SkyBox/bluesky/Down.jpg', * }, * }); */ setGroundSkyBox(options) { options = options || {}; options.height = options.height || 200000; options.type = options.type || "蓝天"; if (!options.sources) { switch (options.type) { case "晚霞": options.sources = { positiveX: 'jt3dSDK/imgs/skybox/01/px.png', negativeX: 'jt3dSDK/imgs/skybox/01/nx.png', positiveY: 'jt3dSDK/imgs/skybox/01/py.png', negativeY: 'jt3dSDK/imgs/skybox/01/ny.png', positiveZ: 'jt3dSDK/imgs/skybox/01/pz.png', negativeZ: 'jt3dSDK/imgs/skybox/01/nz.png', } break; case "阴天": options.sources = { positiveX: 'jt3dSDK/imgs/skybox/02/px.jpg', negativeX: 'jt3dSDK/imgs/skybox/02/nx.jpg', positiveY: 'jt3dSDK/imgs/skybox/02/py.jpg', negativeY: 'jt3dSDK/imgs/skybox/02/ny.jpg', positiveZ: 'jt3dSDK/imgs/skybox/02/pz.jpg', negativeZ: 'jt3dSDK/imgs/skybox/02/nz.jpg', } break; case "蓝天": options.sources = { positiveX: 'jt3dSDK/imgs/skybox/03/px.jpg', negativeX: 'jt3dSDK/imgs/skybox/03/nx.jpg', positiveY: 'jt3dSDK/imgs/skybox/03/py.jpg', negativeY: 'jt3dSDK/imgs/skybox/03/ny.jpg', positiveZ: 'jt3dSDK/imgs/skybox/03/pz.jpg', negativeZ: 'jt3dSDK/imgs/skybox/03/nz.jpg', } break; case "紫色星空": options.sources = { positiveX: 'jt3dSDK/imgs/skybox/04/px.jpg', negativeX: 'jt3dSDK/imgs/skybox/04/nx.jpg', positiveY: 'jt3dSDK/imgs/skybox/04/py.jpg', negativeY: 'jt3dSDK/imgs/skybox/04/ny.jpg', positiveZ: 'jt3dSDK/imgs/skybox/04/pz.jpg', negativeZ: 'jt3dSDK/imgs/skybox/04/nz.jpg', } break; case "蓝色星空": options.sources = { positiveX: 'jt3dSDK/imgs/skybox/05/px.jpg', negativeX: 'jt3dSDK/imgs/skybox/05/nx.jpg', positiveY: 'jt3dSDK/imgs/skybox/05/py.jpg', negativeY: 'jt3dSDK/imgs/skybox/05/ny.jpg', positiveZ: 'jt3dSDK/imgs/skybox/05/pz.jpg', negativeZ: 'jt3dSDK/imgs/skybox/05/nz.jpg', } break; } } else if (!Cesium.defined(options.sources.positiveX) || !Cesium.defined(options.sources.negativeX) || !Cesium.defined(options.sources.positiveY) || !Cesium.defined(options.sources.negativeY) || !Cesium.defined(options.sources.positiveZ) || !Cesium.defined(options.sources.negativeZ) ) { throw new Cesium.DeveloperError( "options.sources is required and must have positiveX, negativeX, positiveY, negativeY, positiveZ, and negativeZ properties." ); } let _self = this; //自定义天空盒子(天空盒子需要显示) // let groundSkyBox = new Cesium.SkyBox({//自带的有bug,天空效果出现倾斜 // sources: options.sources, // show: true // }); let groundSkyBox = new SkyBoxOnGround({ //在源码基础上修改后的 sources: options.sources, show: true }); //如果高度小于某个值 显示近景天空盒 否则显示远景天空盒 _self._viewer.scene.postRender.addEventListener(() => { var e = _self._viewer.camera.position; if (Cesium.Cartographic.fromCartesian(e).height < options.height) { _self._viewer.scene.skyBox = groundSkyBox; // 显示自定义的天空盒 } else { _self._viewer.scene.skyBox = _self._defaultSkyBox; // 显示原始的天空盒 } }); } }); export default SkyBox;