1.效果图

2.实现思路

使用three.js的套路几乎是固定的:

1 初始化场景(scene)

2.创建透视相机(camera)

3.设置相机位置(position)

4.创建纹理加载器对象(texture)

5.创建着色器材质(Material)

6.初始化渲染器(WebGLRenderer)

7.设置渲染尺寸大小(Size)

8.将渲染器添加到body(appendChild)

9.初始化控制器(controls)

10.设置控制器阻尼(enableDamping)

11.不停地调用渲染(animate)

ps:万事的开头,你都得先下载引入并初始化three对象


3.核心代码

import * as THREE from "three";import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import gsap from "gsap";
import * as dat from "dat.gui";
import vertexShader from "../shaders/flylight/vertex.glsl";
import fragmentShader from "../shaders/flylight/fragment.glsl";
import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";// 目标:认识shader//创建gui对象
const gui = new dat.GUI();// console.log(THREE);
// 初始化场景
const scene = new THREE.Scene();// 创建透视相机
const camera = new THREE.PerspectiveCamera(90,window.innerHeight / window.innerHeight,0.1,1000
);
// 设置相机位置
// object3d具有position,属性是1个3维的向量
camera.position.set(0, 0, 2);
// 更新摄像头
camera.aspect = window.innerWidth / window.innerHeight;
//   更新摄像机的投影矩阵
camera.updateProjectionMatrix();
scene.add(camera);// 加入辅助轴,帮助我们查看3维坐标轴
// const axesHelper = new THREE.AxesHelper(5);
// scene.add(axesHelper);// 加载纹理// 创建纹理加载器对象
const rgbeLoader = new RGBELoader();
rgbeLoader.loadAsync("./assets/2k.hdr").then((texture) => {texture.mapping = THREE.EquirectangularReflectionMapping;scene.background = texture;scene.environment = texture;
});// 创建着色器材质;
const shaderMaterial = new THREE.ShaderMaterial({vertexShader: vertexShader,fragmentShader: fragmentShader,uniforms: {},side: THREE.DoubleSide,//   transparent: true,
});// 初始化渲染器
const renderer = new THREE.WebGLRenderer({ alpha: true });
// renderer.shadowMap.enabled = true;
// renderer.shadowMap.type = THREE.BasicShadowMap;
// renderer.shadowMap.type = THREE.VSMShadowMap;
renderer.outputEncoding = THREE.sRGBEncoding;
renderer.toneMapping = THREE.ACESFilmicToneMapping;
// renderer.toneMapping = THREE.LinearToneMapping;
// renderer.toneMapping = THREE.ReinhardToneMapping;
// renderer.toneMapping = THREE.CineonToneMapping;
renderer.toneMappingExposure = 0.2;const gltfLoader = new GLTFLoader();
let LightBox = null;
gltfLoader.load("./assets/model/flyLight.glb", (gltf) => {console.log(gltf);LightBox = gltf.scene.children[1];LightBox.material = shaderMaterial;for (let i = 0; i < 150; i++) {let flyLight = gltf.scene.clone(true);let x = (Math.random() - 0.5) * 300;let z = (Math.random() - 0.5) * 300;let y = Math.random() * 60 + 25;flyLight.position.set(x, y, z);gsap.to(flyLight.rotation, {y: 2 * Math.PI,duration: 10 + Math.random() * 30,repeat: -1,});gsap.to(flyLight.position, {x: "+=" + Math.random() * 5,y: "+=" + Math.random() * 20,yoyo: true,duration: 5 + Math.random() * 10,repeat: -1,});scene.add(flyLight);}
});// 设置渲染尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight);// 监听屏幕大小改变的变化,设置渲染的尺寸
window.addEventListener("resize", () => {//   console.log("resize");// 更新摄像头camera.aspect = window.innerWidth / window.innerHeight;//   更新摄像机的投影矩阵camera.updateProjectionMatrix();//   更新渲染器renderer.setSize(window.innerWidth, window.innerHeight);//   设置渲染器的像素比例renderer.setPixelRatio(window.devicePixelRatio);
});// 将渲染器添加到body
document.body.appendChild(renderer.domElement);// 初始化控制器
const controls = new OrbitControls(camera, renderer.domElement);
// 设置控制器阻尼
controls.enableDamping = true;
// 设置自动旋转
controls.autoRotate = true;
controls.autoRotateSpeed = 0.1;
controls.maxPolarAngle = (Math.PI / 3) * 2;
controls.minPolarAngle = (Math.PI / 3) * 2;const clock = new THREE.Clock();
function animate(t) {controls.update();const elapsedTime = clock.getElapsedTime();requestAnimationFrame(animate);// 使用渲染器渲染相机看这个场景的内容渲染出来renderer.render(scene, camera);
}animate();

基于threeJS实现圣诞节孔明灯效果相关推荐

  1. 基于THREEJS场景中模型局部辉光效果

    背景 之前写过一个关于辉光的文章,全场景辉光(传送门),但是有些时候,我们的场景只需要一部分模型辉光,这就是本文的背景.还是基于ThreeJS实现. 原理 简单来说,就是做两个合成器(Composer ...

  2. 基于ThreeJS修改模型材质

    基于ThreeJS修改模型材质 示例描述与操作指南 示例效果展示 实现方式 示例描述与操作指南 当前示例用于展示如何在模型上改变构件的材质.材质和几何体构成网格,决定几何体是否像金属,透明与否,是否展 ...

  3. 基于threejs的商品VR展示平台的设计与实现思路

    目录 基于threejs的商品VR展示平台的设计与实现思路 前言 总体开发方案设计 总体开发设计思维导图 模型制作模块 前端展示模块 存储模块 后端管理模块 后台管理实现 商品模型制作 商品模型前期准 ...

  4. 这是一个基于Threejs的商品VR展示系统的 VR模型展示Demo

    vr-cake-demo 这是一个基于Threejs的商品VR展示系统的 VR模型展示Demo Demo界面示意图 Demo蛋糕实物图片 Demo蛋糕VR效果图 研究意义 2020年,已经进入了5G时 ...

  5. 基于ThreeJS实现3D模型上的室内灯光效果模拟

    基于ThreeJS实现3D模型上的室内灯光效果模拟 示例描述与操作指南 示例效果展示 实现步骤 示例描述与操作指南 当前示例用于展示室内灯光的多角度光影效果. 示例效果展示 实现步骤 第一步 创建聚光 ...

  6. 基于Threejs构建的3D立体空间实战入门

    在现实生活中,我们有许多场景需要对真实世界进行还原,仿真.因此会有很多3D的展示需求,同时要求可以基于浏览器就可以深度交互浏览.这里关于3D方面的内容不进行赘述,同时关于opengl和webgl的发展 ...

  7. 基于Threejs火焰烟雾动画功能代码

    利用Threejs进行三维可视化的应用项目开发,我们经常回遇到需要加入一些动画效果,粒子效果等.所以本片利用此详细的例子进行介绍在Threejs中如何使用. 1,首先需要对三维场景进行初始化 func ...

  8. 基于Threejs的jQuery 3d图片旋转木马特效插件

    这是一款基于ThreeJS的炫酷3D旋转木马图片画廊特效插件.该旋转木马特效可以设置图片预加载,带有前后导航按钮,可以使用鼠标前后旋转,并可以设置3D透视的位置. 浏览器兼容: Firefox - 3 ...

  9. 基于ThreeJS为3D模型添加贴图

    基于ThreeJS为3D模型添加贴图 示例描述与操作指南 示例效果展示 实现方式 示例描述与操作指南 当前示例用于展示如何在三维立体构件六个面上添加贴图 示例效果展示 实现方式 添加贴图:在模型的多个 ...

最新文章

  1. 通向成功的23个方法
  2. The selected server is enabled,but is not configured pro
  3. 程序员界年度人口普查:6成以上开发者日工作超9小时,且从不运动
  4. JavaScript之array
  5. 广告roi怎么计算公式_信息流ROI出价技巧详解及计算公式
  6. python代码示例-总算知道python入门代码示例
  7. java搜寻范围在哪设定_查找值在Java中的范围
  8. SQL 2008 群集配置详尽攻略[3]—主节点备节点数据库安装
  9. Google卫片下载(转)
  10. 智慧城管基础业务系统建设系统方案
  11. WindowsCMD配置代理
  12. VMware VSphere Client克隆虚拟机
  13. 2021年度总结:天赐良机,曲线入行的大龄程序员?
  14. 浅谈云原生的“前世今生”
  15. 自学Java笔记2 2021-3-28更
  16. 虚拟串口工具MCGS开发调试的灵活应用教程
  17. Fastapi swagger-ui.css 、swagger-ui-bundle.js 无法加载
  18. Gitee使用流程及其注意事项
  19. php左测导航栏,商城左侧大分类导航菜单教程完整代码
  20. 数据结构也不是那么没意思之前序二叉树+二叉树转伪双向循环链表

热门文章

  1. 重走长征路---OI每周刷题记录---12月6日 2014
  2. AI 收藏夹 Vol.001:当你的语音助手不再温顺
  3. VIM从入门到精通(恢复文件)
  4. 大型公共建筑能耗监测系统软件平台框架探讨
  5. 1791. 找出星型图的中心节点
  6. 回文日期2020 C语言
  7. c语言链表fwrite二进制保存,读取时出现 屯 的问题
  8. CAD入门技巧,如何仔细查看CAD图纸?
  9. Springboot毕设项目老年人营养膳食咨询平台0h520(java+VUE+Mybatis+Maven+Mysql)
  10. 百望云,新一代信息技术创新企业!