首頁 > 軟體

vue+threejs寫物體動畫之物體縮放動畫效果

2022-10-06 14:07:56

寫在前面

本文用vue+threejs寫物體動畫:物體縮放動畫。

實現原理:讓縮放值根據秒數的增加呈函數式變化,以達到動畫展示的效果。

下面是演示gif:

程式碼說明

  • 準備一個id容器,用於插入渲染器節點
<template>
  <div class="item">
    <div id="THREE42"></div>
  </div>
</template>
  • 引入threejs及需要的模組,並在mounted方法中呼叫initThreejs方法
  • OrbitControls 軌道控制器,用於畫面響應滑鼠的操作
  • DRACOLoader 用於載入.drc模型
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader.js";

mounted() {
  this.initThreejs();
},
  • initThreejs的全部程式碼及其說明
  • 定義一個跟蹤時間的物件:let clock = new THREE.Clock();下面會用到它的.getElapsedTime()方法,該方法用於獲取自時鐘啟動後的秒數。
  • 建立場景scene = new THREE.Scene();
  • 建立燈光const light = new THREE.DirectionalLight(0xffffff);
  • 建立相機camera = new THREE.PerspectiveCamera(35,(window.innerWidth - 201) / window.innerHeight,1,500);
  • 建立渲染器renderer = new THREE.WebGLRenderer({ antialias: true });
  • 以上是threejs最基礎的部分,就不過多說明了
  • 建立地面:BoxGeometry用於建立一個立方體,引數是(長,寬,高)。MeshPhongMaterial用於建立一個具有鏡面高光的光澤表面的材質。最後用Mesh建立一個具有高光材質的立方體網格模型
  • 監聽滑鼠落下事件:document.addEventListener("pointerdown", animate);,滑鼠落下的後開始縮放動畫,縮放值根據秒數的增加呈函數式變化
  • 使用DRACOLoader載入.drc模型
  • 以上就是實現縮放動畫的全部過程說明和程式碼說明。
initThreejs() {
  let camera, scene, renderer;

  let mesh;

  let clock = new THREE.Clock();

  const dracoLoader = new DRACOLoader();
  dracoLoader.setDecoderPath("js/libs/draco/");
  dracoLoader.setDecoderConfig({ type: "js" });

  init();

  function init() {
    // 建立場景
    scene = new THREE.Scene();
    scene.background = new THREE.Color(0x000000); // 設定場景背景顏色

    // 建立燈光
    const light = new THREE.DirectionalLight(0xffffff); // 平行光
    light.position.set(0.5, 1.0, 0.5).normalize(); // 設定平行光的方向,從(0.5, 1.0, 0.5)->target一般(0, 0, 0)
    scene.add(light); // 將燈光新增到場景中

    // 建立相機
    camera = new THREE.PerspectiveCamera(
      35,
      (window.innerWidth - 201) / window.innerHeight,
      1,
      500
    ); // 透視相機
    camera.position.x = 0.5;
    camera.position.y = 0.5; // 設定相機的位置
    camera.position.z = 1.8;
    scene.add(camera); // 將相機新增到場景中

    // 建立渲染器
    renderer = new THREE.WebGLRenderer({ antialias: true });
    renderer.outputEncoding = THREE.sRGBEncoding;
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth - 201, window.innerHeight);
    document.getElementById("THREE42").appendChild(renderer.domElement);

    // 建立軌道控制器
    const controls = new OrbitControls(camera, renderer.domElement);
    controls.addEventListener("change", render);
    controls.update();

    // 建立地面
    const ground = new THREE.Mesh(
      new THREE.BoxGeometry(1, 0.0015, 1),
      new THREE.MeshPhongMaterial({
        color: 0x999999,
        depthWrite: false,
        transparent: true,
        opacity: 1,
      })
    );
    ground.receiveShadow = true;
    scene.add(ground);

    document.addEventListener("pointerdown", animate); // 監聽滑鼠、手指落下

    //  載入模型
    dracoLoader.load("/models/models/draco/bunny.drc", function (geometry) {
      geometry.computeVertexNormals();

      const material = new THREE.MeshStandardMaterial({ color: 0xffffff });
      mesh = new THREE.Mesh(geometry, material);
      mesh.castShadow = true;
      mesh.receiveShadow = true;
      scene.add(mesh);

      dracoLoader.dispose();

      render();
    });
  }

  function animate() {
    requestAnimationFrame(animate);

    const elapsed = clock.getElapsedTime();
    // getElapsedTime 獲取自時鐘啟動後的秒數
    // 讓縮放值根據秒數的增加呈函數式變化,以達到動畫展示的效果
    let scale = 1 + 0.5 * Math.sin(2 * elapsed);
    mesh.scale.set(scale, scale, scale);

    render();
  }

  function render() {
    renderer.render(scene, camera);
  }
},

寫在最後

以上就是所有的程式碼和說明。

到此這篇關於vue+threejs寫物體動畫之物體縮放動畫效果的文章就介紹到這了,更多相關vue+threejs物體縮放動畫內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com