Threejs创建天空和太阳

本文介绍了如何在Three.js中利用自带的Sky组件创建逼真的天空效果,包括省去寻找贴图,自定义太阳效果以及调整浑浊度、散射等参数。同时提到了结合Water.js和OrbitControls的使用。
摘要由CSDN通过智能技术生成

        之前有讲过使用天空盒子来绘制天空效果,简单的讲就是做一个正方体将整个场景包含在里面,正方体的六个面用贴图无缝衔接上,然后渲染出天空的效果。

        这节讲用threejs自带的Sky组件实现天空效果,这样不仅省的自己去找图片,而且会加上太阳的效果,显得更逼真和漂亮,上一篇文章绘制了大海,这这个Sky就基于海面上创建天空效果,如果需要前面的代码可以参照这篇文章Threejs绘制海面效果

        首先我们在开头引入Sky组件:

import * as THREE from 'three'
import {OrbitControls} from "three/addons/controls/OrbitControls";
import { Water } from 'three/examples/jsm/objects/Water.js';
import { Sky } from 'three/examples/jsm/objects/Sky'

接着在新建一个方法用于渲染天空和太阳,这的天空实际上还是使用的天空盒子,要做个很大的盒子,把整个场景装进去,然后渲染起来类似天空的效果,其次在天空中添加一个太阳的效果,使用Sky的一些属性给太阳的周围添加一些晕轮效果,可以设置太阳浑浊度,散射等,属性的作用我已经在代码中做了详细的注释,大家可以修改他们的值来尝试。

initSky(){
      let sky = new Sky();
      sky.scale.setScalar( 45000 );//太阳盒子的大小,要把整个场景包含进去
      scene.add( sky );

      const effectController = {
        turbidity: 10,//浑浊度
        rayleigh: 3,//阳光散射,黄昏效果的程度
        mieCoefficient: 0.005,//太阳对比度,清晰度
        mieDirectionalG: 0.7,
        elevation: 2,//太阳高度
        azimuth: 180,//太阳水平方向位置
        exposure: this.renderer.toneMappingExposure //光线昏暗程度
      };

      let sun = new THREE.Vector3();
      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 );
      this.renderer.toneMappingExposure = effectController.exposure;
      this.renderer.render( scene, this.camera );
    },

最终,在场景中的展示如图所示:个人觉得还是很nice的,可以通过之前制作动画效果的课程,实现太阳的升起和落下,

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baker_zhuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值