最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用ThreeJS實現(xiàn)孔明燈效果

 更新時間:2022年12月28日 09:23:54   作者:接著奏樂接著舞。  
這篇文章主要為大家詳細(xì)介紹了如何利用Three.js實現(xiàn)3D圣誕節(jié)孔明燈效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動手嘗試一下

1.效果圖

2.實現(xiàn)思路

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

1 初始化場景(scene)

2.創(chuàng)建透 視相機(camera)

3.設(shè)置相機位置(position)

4.創(chuàng)建紋理加載器對象(texture)

5.創(chuàng)建著色器材質(zhì)(Material)

6.初始化渲染器(WebGLRenderer)

7.設(shè)置渲染尺寸大?。⊿ize)

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

9.初始化控制器(controls)

10.設(shè)置控制器阻尼(enableDamping)

11.不停地調(diào)用渲染(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";
 
// 目標(biāo):認(rèn)識shader
 
//創(chuàng)建gui對象
const gui = new dat.GUI();
 
// console.log(THREE);
// 初始化場景
const scene = new THREE.Scene();
 
// 創(chuàng)建透 視相機
const camera = new THREE.PerspectiveCamera(
  90,
  window.innerHeight / window.innerHeight,
  0.1,
  1000
);
// 設(shè)置相機位置
// object3d具有position,屬性是1個3維的向量
camera.position.set(0, 0, 2);
// 更新攝像頭
camera.aspect = window.innerWidth / window.innerHeight;
//   更新攝像機的投影矩陣
camera.updateProjectionMatrix();
scene.add(camera);
 
// 加入輔助軸,幫助我們查看3維坐標(biāo)軸
// const axesHelper = new THREE.AxesHelper(5);
// scene.add(axesHelper);
 
// 加載紋理
 
// 創(chuàng)建紋理加載器對象
const rgbeLoader = new RGBELoader();
rgbeLoader.loadAsync("./assets/2k.hdr").then((texture) => {
  texture.mapping = THREE.EquirectangularReflectionMapping;
  scene.background = texture;
  scene.environment = texture;
});
 
// 創(chuàng)建著色器材質(zhì);
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);
  }
});
 
// 設(shè)置渲染尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight);
 
// 監(jiān)聽屏幕大小改變的變化,設(shè)置渲染的尺寸
window.addEventListener("resize", () => {
  //   console.log("resize");
  // 更新攝像頭
  camera.aspect = window.innerWidth / window.innerHeight;
  //   更新攝像機的投影矩陣
  camera.updateProjectionMatrix();
 
  //   更新渲染器
  renderer.setSize(window.innerWidth, window.innerHeight);
  //   設(shè)置渲染器的像素比例
  renderer.setPixelRatio(window.devicePixelRatio);
});
 
// 將渲染器添加到body
document.body.appendChild(renderer.domElement);
 
// 初始化控制器
const controls = new OrbitControls(camera, renderer.domElement);
// 設(shè)置控制器阻尼
controls.enableDamping = true;
// 設(shè)置自動旋轉(zhuǎn)
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);
  // 使用渲染器渲染相機看這個場景的內(nèi)容渲染出來
  renderer.render(scene, camera);
}
 
animate();

到此這篇關(guān)于利用ThreeJS實現(xiàn)孔明燈效果的文章就介紹到這了,更多相關(guān)ThreeJS孔明燈內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • bootstrap動態(tài)調(diào)用select下拉框的實例代碼

    bootstrap動態(tài)調(diào)用select下拉框的實例代碼

    今天小編就為大家分享一篇bootstrap動態(tài)調(diào)用select下拉框的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • JavaScript中Iterator迭代器接口和循環(huán)

    JavaScript中Iterator迭代器接口和循環(huán)

    這篇文章主要介紹了JavaScript中Iterator迭代器接口和循環(huán),迭代器是數(shù)據(jù)結(jié)構(gòu)遍歷的一種機制迭代器主要是提供for...of使用,更多相關(guān)內(nèi)推需要的小伙伴可以參考下面文章內(nèi)容
    2022-06-06
  • 理解Javascript_11_constructor實現(xiàn)原理

    理解Javascript_11_constructor實現(xiàn)原理

    在理解了'對象模型'后,我們就可以看一下constructor屬性是如何實現(xiàn)的.
    2010-10-10
  • javascript對象的多種合并方式詳解

    javascript對象的多種合并方式詳解

    這篇文章主要介紹了JavaScript中的多種對象合并方法,通過代碼的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-08-08
  • JavaScript中的this關(guān)鍵字用法詳解

    JavaScript中的this關(guān)鍵字用法詳解

    在編寫JavaScript應(yīng)用的時候,我們經(jīng)常會使用this關(guān)鍵字。那么this關(guān)鍵字究竟是怎樣工作的,它的設(shè)計有哪些好的地方,有哪些不好的地方,本文帶大家全面系統(tǒng)地認(rèn)識這個老朋友,感興趣的小伙伴可以借鑒閱讀
    2023-05-05
  • 原生Javascript封裝的一個AJAX函數(shù)分享

    原生Javascript封裝的一個AJAX函數(shù)分享

    這篇文章主要介紹了原生Javascript封裝的一個AJAX函數(shù)分享,本文是實際項目中提取出來的,簡單易用,需要的朋友可以參考下
    2014-10-10
  • GOJS+VUE實現(xiàn)流程圖效果

    GOJS+VUE實現(xiàn)流程圖效果

    這篇文章主要為大家詳細(xì)介紹了GOJS+VUE實現(xiàn)流程圖效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 微信小程序8種數(shù)據(jù)通信的方式小結(jié)

    微信小程序8種數(shù)據(jù)通信的方式小結(jié)

    這篇文章主要介紹了微信小程序8種數(shù)據(jù)通信的方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 基于RequireJS和JQuery的模塊化編程日常問題解析

    基于RequireJS和JQuery的模塊化編程日常問題解析

    本文是小編日常收集整理些有關(guān)RequireJS和JQuery的模塊化編程,感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04
  • javascript實現(xiàn)的閉包簡單實例

    javascript實現(xiàn)的閉包簡單實例

    這篇文章主要介紹了javascript實現(xiàn)的閉包簡單實現(xiàn)方法,涉及javascript閉包的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07

最新評論

曲水县| 宁乡县| 新蔡县| 镇远县| 英德市| 白朗县| 武汉市| 合作市| 陆良县| 金华市| 永胜县| 固原市| 吉木萨尔县| 麻阳| 永宁县| 屏山县| 慈利县| 峨眉山市| 正安县| 呼图壁县| 昌乐县| 沁水县| 京山县| 五寨县| 彝良县| 南充市| 常熟市| 习水县| 伊宁市| 蓝山县| 吉木萨尔县| 达州市| 威远县| 和静县| 遵化市| 双辽市| 蒲江县| 小金县| 甘孜县| 万源市| 浦城县|