21.Three.js优化之合并对象的动画

21 Three.js优化之合并对象的动画

在上一篇中,我们将19000个柱状对象合并为1个整体,这样优化过后渲染速度性能大幅提高。

但是,我们所加载的是2010年 全球男性人口数量统计。

假设现在我们添加新的需求:

  1. 加载并显示全球女性人口数量
  2. 此时,我们程序中 男性与女性 各有1份数据
  3. 我们需要做的动画就是:当切换 不同性别数据时,柱状物也会随着人口数量不同而发生 高低 变化的动画

不同性别的人口数据.asc文件下载:

  1. 男性:https://threejsfundamentals.org/threejs/resources/data/gpw/gpw_v4_basic_demographic_characteristics_rev10_a000_014mt_2010_cntm_1_deg.asc
  2. 女性:https://threejsfundamentals.org/threejs/resources/data/gpw/gpw_v4_basic_demographic_characteristics_rev10_a000_014ft_2010_cntm_1_deg.asc

很显然,之前把所有柱状物都合并成1个整体之后,是没有办法单独操作某一个柱状物的。

想实现每一个柱状物高低变化的动画,又该如何实现呢?

实现方式:

  1. 通过 设置物体材质的morphtargets(变形目标)属性为true来改变柱状物形状

     const material = new THREE.MeshBasicMaterial({
      vertexColors: true,
      morphTargets: true,
    })
    
  2. 通过Tween.js来创建改变过程中的动画

    import { TWEEN } from 'three/examples/jsm/libs/tween.module.min.js'
    
    或者自己去安装 tween.js 的模块
    
    yarn add @tweenjs/tween.js
    //npm i @tweenjs/tween.js --save
    import TWEEN from '@tweenjs/tween.js'
    

    Tween.js的用法,请参考官网:https://github.com/tweenjs/tween.js

  3. 通过材质的Material.onBeforeCompile()函数来产生改变过程中柱状物颜色的变化

    Material.onBeforeCompile()的用法,请参考文档:https://threejs.org/docs/index.html#api/zh/materials/Material.onBeforeCompile

具体代码

上面仅仅是提供了解决思路,而实际具体的代码复杂程度,超出了我目前的认知。

所以我们暂且搁置,所有能力的同学,可自行查看本文对应的原版教程:

https://threejsfundamentals.org/threejs/lessons/threejs-optimize-lots-of-objects-animated.html

将来有一天Three.js能力提高了,再来弥补上。

下一节,我们学习另外一个可以提升计算性能的方式:使用WebWorker

上一页
下一页