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

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

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

1.效果圖

2.實現(xiàn)思路

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

1 初始化場景(scene)

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

3.設置相機位置(position)

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

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

6.初始化渲染器(WebGLRenderer)

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

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
 
//創(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
);
// 設置相機位置
// 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);
 
// 加載紋理
 
// 創(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)建著色器材質;
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);
 
// 監(jiān)聽屏幕大小改變的變化,設置渲染的尺寸
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實現(xiàn)孔明燈效果的文章就介紹到這了,更多相關ThreeJS孔明燈內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

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

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

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

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

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

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

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

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

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

    JavaScript中的this關鍵字用法詳解

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

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

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

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

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

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

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

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

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

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

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

最新評論

江城| 东阳市| 金昌市| 云和县| 通榆县| 黑山县| 兴文县| 广东省| 高雄县| 拉孜县| 紫阳县| 海林市| 酒泉市| 桂东县| 绥芬河市| 濮阳县| 上蔡县| 绥中县| 永平县| 承德县| 陆良县| 大姚县| 甘德县| 五莲县| 武强县| 通州市| 青岛市| 仁寿县| 承德市| 万源市| 邹平县| 阳朔县| 石狮市| 榆社县| 黑河市| 锦屏县| 叶城县| 罗田县| 隆回县| 建水县| 平阳县|