Skip to content

添加 SKY

loading

直接把 threejs 的 sky 示例搬过来即可

ts
//添加Sky
const sky = new Sky();
sky.scale.setScalar(450000 * 1000);
viewer.scene.add(sky);

const sun = new THREE.Vector3();
/// GUI
const effectController = {
    turbidity: 3.5,
    rayleigh: 3.5,
    mieCoefficient: 0.005,
    mieDirectionalG: 0.7,
    elevation: 2,
    azimuth: 180,
    exposure: viewer.renderer.toneMappingExposure,
};
function guiChanged() {
    const uniforms = sky.material.uniforms;
    uniforms["turbidity"].value = effectController.turbidity;
    uniforms["rayleigh"].value = effectController.rayleigh;
    uniforms["mieCoefficient"].value = effectController.mieCoefficient;
    uniforms["mieDirectionalG"].value = effectController.mieDirectionalG;
    const phi = THREE.MathUtils.degToRad(90 - effectController.elevation);
    const theta = THREE.MathUtils.degToRad(effectController.azimuth);
    sun.setFromSphericalCoords(1, phi, theta);
    uniforms["sunPosition"].value.copy(sun);
    viewer.renderer.toneMappingExposure = effectController.exposure;
    viewer.renderer.render(viewer.scene, viewer.camera);
}

const gui = new GUI();
gui.add(effectController, "turbidity", 0.0, 20.0, 0.1).onChange(guiChanged);
gui.add(effectController, "rayleigh", 0.0, 4, 0.001).onChange(guiChanged);
gui.add(effectController, "mieCoefficient", 0.0, 0.1, 0.001).onChange(guiChanged);
gui.add(effectController, "mieDirectionalG", 0.0, 1, 0.001).onChange(guiChanged);
gui.add(effectController, "elevation", 0, 90, 0.1).onChange(guiChanged);
gui.add(effectController, "azimuth", -180, 180, 0.1).onChange(guiChanged);
gui.add(effectController, "exposure", 0, 1, 0.0001).onChange(guiChanged);

guiChanged();

TIP

调整 sky 参数,天空颜色会发生变化,但地图颜色不会发生变化,造成地面和天空交界部分过渡不太自然,需要调整雾的颜色以适应。

Released under the MIT License.