gsap动画库对threejs模型的应用

news2024/11/17 21:34:07

前言

公司的一个3D编辑器项目,要在three模型上加一些补间动画。做了一些调研,最终选择了gsap,其丰富的缓动函数,强大的动画效果和兼容性,更适合公司的需求。

查看gsap文档,发现所有的例子都是针对dom元素的,按照其方式直接绑定three模型,动画并不生效,也没有找到相关的文章。开发过程中多次尝试,发现需要将动画绑定在模型上的属性上,还有一些特殊的设置,在此简单记录一下。

功能实现

前期准备

 import * as THREE from 'three'

 // 创建场景、相机和渲染器
 const scene = new THREE.Scene()
 const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
 const renderer = new THREE.WebGLRenderer({
      antialias: true
  })
 renderer.setSize(window.innerWidth, window.innerHeight)
 document.body.appendChild(renderer.domElement)
 
 // 创建立方体
 const geometry = new THREE.BoxGeometry(1,1,1)
 const material = new THREE.MeshBasicMaterial({color: 0x00ff00})
 const cube = new THREE.Mesh(geometry, material)
 cube.position.set(0,0,0)
 scene.add(cube)
 
 // 设置相机
 camera.position.set(4,3,6);
 camera.lookAt( 0, 0, 0 );

 // 渲染场景
 const animate = () => {
    requestAnimationFrame(animate);
    renderer.render(scene, camera);
  }
  animate()

此时可以看到效果如下
初始效果
立方体已经显示出来,但是重叠的部分会将边角模糊掉,看起来更像是一个平面的不规则多边形,所以我们补充下细节,使模型更立体一些

细节补充

  1. 添加辅助线,显示X、Y、Z轴,可以明显的感受3D空间
  2. 添加轨道控制器,可以转动相机进行轨道运动,查看立方体的各个角度
  3. 修改立方体材质以及添加环境光和平行光,使立方体看起来棱角分明 更直观
修改立方体材质

修改立方体的材质为标准网格材质,基础网格材质不受光照影响,不会形成阴影面

  // const material = new THREE.MeshBasicMaterial({color: 0x00ff00})
  const material = new THREE.MeshStandardMaterial({color: 0x00ff00})
其他细节添加
import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls'
  
  // 创建轴辅助线
  const xAxisHelper = new THREE.AxesHelper(10);
  scene.add(xAxisHelper);

  // 添加轨道控制器
  const controls = new OrbitControls(camera, renderer.domElement)
  // 设置带阻尼
  controls.enableDamping = true
  // 设置带阻尼的系数
  controls.dampingFactor = 0.1 //数字越小,滑动后的惯性时间越长
  
  // 添加环境光
  const light = new THREE.AmbientLight( 0x404040 );
  scene.add( light );
  // 添加平行光
  const directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
  directionalLight.position.set(5,10,8)
  scene.add( directionalLight );

看下效果:
l立体效果
只添加平行光 这个角度的效果是一样的。但是我们转动相机会发现,平行光没有照到的地方,物体不会发光
无环境光

至此,前期准备全部完成。接下来,就可以进行动画效果设置了

动画实现

位置移动

 import {gsap} from 'gsap'

 gsap.to(cube.position, {duration: 2, x: 1})

效果:
position

沿轴旋转

gsap.to(cube.rotation, {duration: 2, z: 90*(Math.PI / 180)})

效果:
rotation

缩放

gsap.to(cube.scale, {duration: 2, x: 2, y:2, z:2})

效果:
scale
以上动画,设置到对应的属性上即可生效。颜色和透明度需要特殊处理下

颜色变化

  gsap.to(cube.material, {
    duration: 2,
    keyframes: {
      "0%": {color: 'rgba(0,255,0)'},
      "100%": {color: 'rgba(255,255,0)'},
    },
    onUpdate: () => {
      cube.material.color = new THREE.Color(cube.material.color)
    }
  })

效果:
color

透明度过渡

three模型需要设置transparent属性值为true 才可以进行透明度设置

gsap.to(cube.material, {
    duration: 2,
    opacity: 0.2,
    transparent: true,
    onUpdate: () => {
      cube.material.needsUpdate = true;
    }
  })

效果:
opacity
gsap动画的简单实现基本完成,项目中还涉及到缓动函数的添加、多个动画的叠加、以及补间动画的控制等等,有机会再记录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1867916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【乐吾乐2D可视化组态编辑器】文件

1 文件 文件:文件的新建、打开、导入、保存、另存为、下载JOSN文件、下载ZIP打包文件、导出为HTML、导出为Vue2组件、导出为Vue3组件、导出为React组件(老版将不再维护)、下载为PNG、下载为SVG 乐吾乐2D可视化组态编辑器demo:ht…

振动分析-5-基于CNN的机械故障诊断方法

参考基于CNN的机械故障诊断方法 CNN之图像识别 预训练模型迁移学习(Transfer Learning) 基于卷积神经网络(CNN)的深度迁移学习在声发射(AE)监测螺栓连接状况的应用 参考基于CNN的机械故障诊断所面临的困难和…

安装GroudingDINO RuntimeError: Error compiling objects for extension,如何解决?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

头条系统-05-延迟队列精准发布文章-概述添加任务(db和redis实现延迟任务)、取消拉取任务定时刷新(redis管道、分布式锁setNx)

文章目录 延迟任务精准发布文章1)文章定时发布2)延迟任务概述2.1)什么是延迟任务2.2)技术对比2.2.1)DelayQueue2.2.2)RabbitMQ实现延迟任务2.2.3)redis实现 3)redis实现延迟任务4)延迟任务服务实现4.1)搭建heima-leadnews-schedule模块4.2)数据库准备4.3)安装redis4.4)项目集成…

智能革新:AI写作工具如何重塑论文生成的艺术

在学术探索的征途中,AI论文工具本应是助力前行的风帆,而非让人陷入困境的漩涡。我完全理解大家在面对论文压力的同时,遭遇不靠谱AI工具的沮丧与无奈。毕竟,时间可以被浪费,但金钱和信任却不可轻弃。 作为一名资深的AI…

3. 向索引库中导入数据

1. 准备数据库对象 import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstr…

sheng的学习笔记-hive框架原理

需要学习的前置知识:hadoop 可参考 sheng的学习笔记-hadoop-CSDN博客 相关网址 官网:http://hive.apache.org 文档:https://cwiki.apache.org/confluence/display/Hive/GettingStarted https://cwiki.apache.org/confluence/display/Hive/…

Arcgis 计算经纬度坐标并补齐6位小数

工作中我们经常需要在Arcgis中计算点的经纬度或者线的起点、终点坐标,为确保数据的准确性,我们必须保留6位小数,但我们在默认计算的时候偶尔会遇到算出来的经纬度坐标小数位不足6位,那我们应该如何补齐呢,这里我将方法…

EE trade:贵金属投资的优点及缺点

贵金属(如黄金、白银、铂金和钯金)一直以来都是重要的投资和避险工具。它们具有独特的物理和化学特性,广泛应用于各种行业,同时也被视为财富储备。在进行贵金属投资时,了解其优点和缺点对于做出明智的投资决策至关重要。 一、贵金属投资的优…

【C++练级之路】【Lv.25】智能指针

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 一、智能指针的引入二、智能指针的概念1.1 RAII1.2 指针特性1.3 拷贝问题1.4 auto_ptr 三、智能指针的模拟实…

Linux基础 - 使用 ssh 服务管理远程主机(window linux vscode)

目录 零. 简介 一. 打开linux shh 二. window连接linux 三. linux连接linux 四. VSCode远程 零. 简介 SSH(Secure Shell)服务是一种网络协议,主要用于在不安全的网络环境中为计算机之间的通信提供安全的加密连接。 SSH 服务具有以下重要…

git 中有关 old mode 100644、new mode 10075的问题解决小结

问题: 同一个文件被修改后,最后代码没有变,文件变了,导致提交了一个空文件 git diff 提示 filemode 发生改变(old mode 100644、new mode 10075) 解决办法 : 原来是 filemode 的变化&#xff…

[leetcode]first-unique-character-in-a-string 字符串中的第一个唯一字符

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int firstUniqChar(string s) {unordered_map<int, int> frequency;for (char ch: s) {frequency[ch];}for (int i 0; i < s.size(); i) {if (frequency[s[i]] 1) {return i;}}return -1;} };

【Android】【Compose】Compose里面的Row和Column的简单使用

内容 Row和Column的简单使用方式和常用属性含义 Row 在 Jetpack Compose 中&#xff0c;Row 是一种用于在水平方向排列子元素的布局组件。它类似于传统 Android 中的 LinearLayout&#xff0c;但更加灵活和强大。 Row的代码 Composable inline fun Row(modifier: Modifier…

马斯克的SpaceX星舰有多牛?我们离殖民火星还有多远?

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 埃隆马斯克是一位知名的企业家和工程师&#xff0c;他掌握着多家公司&#xff0c;涉及多个领域&#xff0c;包括电动汽车、太空探索、太阳能、脑…

钉钉在MAKE 2024大会上宣布开放AI生态;NBC将用AI主播播报巴黎奥运会内容

&#x1f680; 钉钉在MAKE 2024大会上宣布开放AI生态 摘要&#xff1a;钉钉总裁叶军在MAKE 2024生态大会上宣布&#xff0c;钉钉将对所有大模型厂商开放&#xff0c;构建“国内最开放AI生态”。目前已有六家大模型厂商接入钉钉&#xff0c;用户可直接使用七家大模型产品。未来…

无人机赋能空间规划

城乡规划 高效构建实景三维模型&#xff0c;直 观反映地貌与建筑信息&#xff0c;辅 助设计人员进行科学规划。 业务挑战 BIM设计图、道路矢量图、卫星影像图无法进行精准匹配 传统测绘方式获得的二维图无法展示三维环境信息 BIM设计图与实景模型差异大&#xff0c;规划效…

Taro +vue3 中的微信小程序中的分享

微信小程序 右上角分享 的触发 以及配 useShareAppMessage(() > {return {title: "电影属全国通兑券",page: /pages/home/index,imageUrl: "http:///chuanshuo.jpg",};}); 置 就是Taro框架中提供的一个分享Api 封装好的

MQTT遗嘱信息(1)

本文内容参考&#xff1a; 什么是MQTT遗嘱消息&#xff1f;如何配置和处理遗嘱消息&#xff1f;_mqtt last will-CSDN博客 【MQTT基础篇&#xff08;十五&#xff09;】MQTT遗嘱_last-will qos-CSDN博客 MQTT 协议学习&#xff1a;Retained&#xff08;保留消息&#xff09;…

【Python实战】零基础实战教程(一) Hello World!

【Python实战】零基础Python实战教程 一、前言二、官方 Python3.12 版本安装教程1、下载2、安装3、测试 三、安装 Python 编译器1、下载2、安装3、启动 四、Hello World!1、创建项目2、创建 hellow_world.py 文件3、在控制台打印 Hellow World&#xff01; 一、前言 由于公司新…