vue+threejs写物体动画之物体缩放动画效果

 更新时间:2022年10月05日 08:34:26   作者:djlun  
最近在vue中安装Three.js,无聊顺便研究一些关于3D图形化库,下面这篇文章主要给大家介绍了关于vue+threejs写物体动画之物体缩放动画效果的相关资料,需要的朋友可以参考下

写在前面

本文用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物体缩放动画内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue-router4版本第一次打开界面不匹配路由问题解决

    vue-router4版本第一次打开界面不匹配路由问题解决

    本文主要介绍了vue-router4版本第一次打开界面不匹配路由问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • vue如何动态修改meta的title

    vue如何动态修改meta的title

    这篇文章主要介绍了vue如何动态修改meta的title,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Vue+Koa2+mongoose写一个像素绘板的实现方法

    Vue+Koa2+mongoose写一个像素绘板的实现方法

    这篇文章主要介绍了Vue+Koa2+mongoose写一个像素绘板的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 使用vue.js编写蓝色拼图小游戏

    使用vue.js编写蓝色拼图小游戏

    之前在网上看到《蓝色拼图》这款小游戏,作者是用jquery写的。下面通过本文给大家分享基于vue.js编写蓝色拼图小游戏,一起看看实现代码吧
    2017-03-03
  • 利用VUE框架,实现列表分页功能示例代码

    利用VUE框架,实现列表分页功能示例代码

    本篇文章主要介绍了利用VUE框架,实现列表分页功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-01-01
  • vue采用EventBus实现跨组件通信及注意事项小结

    vue采用EventBus实现跨组件通信及注意事项小结

    EventBus是一种发布/订阅事件设计模式的实践。这篇文章主要介绍了vue采用EventBus实现跨组件通信及注意事项,需要的朋友可以参考下
    2018-06-06
  • vue3中effect函数到底是什么详解

    vue3中effect函数到底是什么详解

    Effect几乎是Vue3.0中最重要的一个功能了,计算属性监听函数都是基于effect实现的,下面这篇文章主要给大家介绍了关于vue3中effect函数到底是什么的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Vue如何实现自动触发功能

    Vue如何实现自动触发功能

    这篇文章主要介绍了Vue如何实现自动触发功能,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Vue-router不允许导航到当前位置(/path)错误原因以及修复方式

    Vue-router不允许导航到当前位置(/path)错误原因以及修复方式

    本文主要介绍了Vue-router不允许导航到当前位置(/path)错误原因以及修复方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • vue实现前端列表多条件筛选

    vue实现前端列表多条件筛选

    这篇文章主要为大家详细介绍了vue实现前端列表多条件筛选,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10

最新评论