主题
云层效果
效果参考 首页
初始化函数 init()
创建容器
创建一个div
元素作为3D场景的容器,设置其样式并添加到页面body
中。
创建相机
创建一个THREE.Camera
对象,设置其视场角、宽高比、近裁剪面和远裁剪面,并将相机位置设置在z轴上距离原点10的位置。
创建场景
创建一个THREE.Scene
对象作为3D场景。
创建几何体和材质
- 创建一个
THREE.Geometry
对象作为云朵的几何体。 - 加载云朵纹理图片,并设置纹理的放大和缩小过滤方式为线性Mipmap线性过滤。
- 创建一个雾效果
THREE.Fog
,设置其颜色、近裁剪面和远裁剪面。 - 创建一个
THREE.MeshShaderMaterial
材质,设置其uniforms属性,包括纹理、雾颜色、雾近远裁剪面等,同时指定顶点着色器和片段着色器的代码,以及关闭深度测试。
创建云朵网格并合并几何体
- 创建一个
THREE.Mesh
对象作为单个云朵网格,其几何体为THREE.Plane
平面几何体,大小为64x64。 - 使用循环创建8000个云朵网格,随机设置每个网格的位置、旋转角度和缩放比例,然后使用
GeometryUtils.merge
方法将这些网格的几何体合并到之前创建的几何体中。 - 将合并后的几何体和材质创建成一个新的
THREE.Mesh
对象,并将其添加到场景中。再将该网格复制一份,位置设置在z轴负方向8000的位置,也添加到场景中。
创建渲染器
创建一个THREE.WebGLRenderer
对象作为渲染器,设置其抗锯齿属性为false
,并设置渲染器的大小为窗口的宽高,然后将渲染器的DOM元素添加到容器中。
绑定事件监听
为文档绑定鼠标移动事件监听函数onDocumentMouseMove
,用于获取鼠标在页面中的位置;为窗口绑定窗口大小改变事件监听函数onWindowResize
,用于更新相机的宽高比和渲染器的大小。
鼠标移动事件处理函数 onDocumentMouseMove(event)
获取鼠标相对于窗口中心位置的偏移量,并分别乘以0.25和0.15作为mouseX
和mouseY
的值,用于后续控制相机的移动。
窗口大小改变事件处理函数 onWindowResize(event)
更新相机的宽高比,并调用updateProjectionMatrix
方法更新相机的投影矩阵,同时设置渲染器的大小为新的窗口宽高,以保证渲染效果适应窗口大小的变化。
动画函数 animate()
使用requestAnimationFrame
方法实现动画循环,不断调用render
函数进行渲染。
渲染函数 render()
- 计算当前时间与开始时间的差值,乘以0.03后取模8000,得到一个周期性的位置值
position
。 - 根据鼠标位置和相机目标位置的差值,分别乘以0.01,更新相机在x轴和y轴上的位置,实现相机跟随鼠标移动的效果。
- 将相机的z轴位置设置为
-position + 8000
,使相机在z轴上移动,产生云朵移动的视觉效果。 - 将相机目标的位置设置为相机当前位置的x、y坐标,以及相机当前位置的z坐标减去1000。