three.js中g(shù)sap動(dòng)畫庫(kù)實(shí)現(xiàn)物體的動(dòng)畫
一、什么是gsap
GSAP(GreenSock Animation Platform
)是一個(gè)JavaScript
動(dòng)畫庫(kù),由GreenSock
公司開發(fā),用于在Web
應(yīng)用程序中創(chuàng)建高性能動(dòng)畫。
使用GSAP
可以通過一些簡(jiǎn)單的動(dòng)畫操作來實(shí)現(xiàn)復(fù)雜的動(dòng)畫效果,例如TweenLite、TweenMax、TimelineLite、TimelineMax等工具。
以下是一個(gè)簡(jiǎn)單動(dòng)畫的示例:
<!DOCTYPE html> <html> <head> <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.6.1/gsap.min.js"></script> </head> <body> <div id="box"></div> <script> // 選取元素 var box = document.getElementById("box"); // 設(shè)置初始樣式 gsap.set(box, {x: -100}); // 定義動(dòng)畫 var tl = gsap.timeline({repeat: -1}); tl.to(box, {x: 100, duration: 1, ease: "power1.out"}) .to(box, {y: 100, duration: 1, ease: "power1.in"}) .to(box, {x: -100, duration: 1, ease: "power1.out"}) .to(box, {y: -100, duration: 1, ease: "power1.in"}); // 暫停動(dòng)畫 function toggleAnimation() { tl.paused(!tl.paused()); } // 雙擊屏幕暫停動(dòng)畫 document.addEventListener("dblclick", toggleAnimation); </script> </body> </html>
這是一個(gè)簡(jiǎn)單的矩形動(dòng)畫,矩形會(huì)沿著 X、Y 軸移動(dòng),在達(dá)到一個(gè)特定的位置時(shí)變形,然后在雙擊屏幕時(shí)暫停。
可以通過修改TweenMax動(dòng)畫中的參數(shù)來實(shí)現(xiàn)不同的效果,例如使用不同的緩動(dòng)函數(shù)(ease參數(shù))、改變動(dòng)畫的持續(xù)時(shí)間(duration參數(shù))等。
二、在three.js中應(yīng)用gsap
這是一個(gè)使物體來回運(yùn)動(dòng)的案例,并且實(shí)現(xiàn)雙擊屏幕暫停動(dòng)畫
要用這東西肯定得先下載拉
下載
npm i gsap
核心代碼
// 導(dǎo)入動(dòng)畫庫(kù) import gsap from "gsap"; // 創(chuàng)建幾何體 const geometry = new THREE.BoxGeometry(1, 1, 1); // 創(chuàng)建材質(zhì) const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); // 根據(jù)幾何體和材質(zhì)創(chuàng)建物體 const cube = new THREE.Mesh(geometry, material); // 設(shè)置動(dòng)畫 let animate1 = gsap.to(cube.position, { x: 5, duration: 5, ease: "power1.inOut", // 設(shè)置重復(fù)的次數(shù),無限次循環(huán)-1 repeat: -1, // 往返運(yùn)動(dòng) yoyo: true, // delay,延遲2秒運(yùn)動(dòng) delay: 2, onComplete: () => { console.log("動(dòng)畫完成"); }, onStart: () => { console.log("動(dòng)畫開始"); }, }); gsap.to(cube.rotation, { x: 2 * Math.PI, duration: 5, ease: "power1.inOut" }); window.addEventListener("dblclick", () => { // console.log(animate1); if (animate1.isActive()) { // 暫停 animate1.pause(); } else { // 恢復(fù) animate1.resume(); } });
完整代碼
import * as THREE from "three"; // 導(dǎo)入軌道控制器 import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; // 導(dǎo)入動(dòng)畫庫(kù) import gsap from "gsap"; // console.log(THREE); // 目標(biāo):掌握gsap設(shè)置各種動(dòng)畫效果 // 1、創(chuàng)建場(chǎng)景 const scene = new THREE.Scene(); // 2、創(chuàng)建相機(jī) const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); // 設(shè)置相機(jī)位置 camera.position.set(0, 0, 10); scene.add(camera); // 添加物體 // 創(chuàng)建幾何體 const cubeGeometry = new THREE.BoxGeometry(1, 1, 1); const cubeMaterial = new THREE.MeshBasicMaterial({ color: 0xffff00 }); // 根據(jù)幾何體和材質(zhì)創(chuàng)建物體 const cube = new THREE.Mesh(cubeGeometry, cubeMaterial); // 修改物體的位置 // cube.position.set(5, 0, 0); // cube.position.x = 3; // 縮放 // cube.scale.set(3, 2, 1); // cube.scale.x = 5; // 旋轉(zhuǎn) cube.rotation.set(Math.PI / 4, 0, 0, "XZY"); // 將幾何體添加到場(chǎng)景中 scene.add(cube); console.log(cube); // 初始化渲染器 const renderer = new THREE.WebGLRenderer(); // 設(shè)置渲染的尺寸大小 renderer.setSize(window.innerWidth, window.innerHeight); // console.log(renderer); // 將webgl渲染的canvas內(nèi)容添加到body document.body.appendChild(renderer.domElement); // // 使用渲染器,通過相機(jī)將場(chǎng)景渲染進(jìn)來 // renderer.render(scene, camera); // 創(chuàng)建軌道控制器 const controls = new OrbitControls(camera, renderer.domElement); // 添加坐標(biāo)軸輔助器 const axesHelper = new THREE.AxesHelper(5); scene.add(axesHelper); // 設(shè)置時(shí)鐘 const clock = new THREE.Clock(); // 設(shè)置動(dòng)畫 var animate1 = gsap.to(cube.position, { x: 5, duration: 5, ease: "power1.inOut", // 設(shè)置重復(fù)的次數(shù),無限次循環(huán)-1 repeat: -1, // 往返運(yùn)動(dòng) yoyo: true, // delay,延遲2秒運(yùn)動(dòng) delay: 2, onComplete: () => { console.log("動(dòng)畫完成"); }, onStart: () => { console.log("動(dòng)畫開始"); }, }); gsap.to(cube.rotation, { x: 2 * Math.PI, duration: 5, ease: "power1.inOut" }); window.addEventListener("dblclick", () => { // console.log(animate1); if (animate1.isActive()) { // 暫停 animate1.pause(); } else { // 恢復(fù) animate1.resume(); } }); function render() { renderer.render(scene, camera); // 渲染下一幀的時(shí)候就會(huì)調(diào)用render函數(shù) requestAnimationFrame(render); } render();
哈哈哈 貼個(gè)圖敷衍一下,你知道這個(gè)物體是移動(dòng)的就行,腦補(bǔ)一下,賴得做gif動(dòng)圖了。。。。
到此這篇關(guān)于three.js中g(shù)sap動(dòng)畫庫(kù)實(shí)現(xiàn)物體的動(dòng)畫的文章就介紹到這了,更多相關(guān)three.js 物體動(dòng)畫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用pdf-lib.js實(shí)現(xiàn)pdf添加自定義水印功能
pdf-lib是一個(gè)強(qiáng)大的JavaScript庫(kù),允許在任何JavaScript環(huán)境中創(chuàng)建和修改PDF文檔,下面就跟隨小編一起來學(xué)習(xí)一下如何使用pdf-lib實(shí)現(xiàn)pdf添加自定義水印功能吧2024-11-11javascript結(jié)合canvas實(shí)現(xiàn)圖片旋轉(zhuǎn)效果
圖片的旋轉(zhuǎn)可以說是一種效果,但是逐漸旋轉(zhuǎn)已經(jīng)不單單是屬于視覺效果那個(gè)范疇,其更具有使用性,功能性。照片有時(shí)候是需要橫過來的拍的,當(dāng)我們預(yù)覽或共享到web上時(shí)需要進(jìn)行旋轉(zhuǎn)。這個(gè)操作在以往可能更多的是交給軟件去完成,然后再將旋轉(zhuǎn)到正常角度的圖片發(fā)布到web上。2015-05-05JavaScript判斷是否為數(shù)字的多種方法小結(jié)
這篇文章主要介紹了JavaScript判斷是否為數(shù)字的多種方法小結(jié),本文給大家分享三種方法,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01javascript實(shí)現(xiàn)消滅星星小游戲簡(jiǎn)單版
消滅星星是一款經(jīng)典的益智手游,單位里看到同事天天在手機(jī)上玩的游戲,現(xiàn)在也有web版了,出于業(yè)余愛好,自己嘗試用javascript實(shí)現(xiàn)了下,就是略簡(jiǎn)單了點(diǎn),文中給出了完整的實(shí)例代碼,大家可以自行完善?。∠旅鎭硪黄鹂纯窗?。2016-11-11微信小程序?qū)崿F(xiàn)頁面下拉刷新和上拉加載功能詳解
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)頁面下拉刷新和上拉加載功能,結(jié)合實(shí)例形式分析了微信小程序頁面下拉刷新和上拉加載相關(guān)事件監(jiān)聽與功能實(shí)現(xiàn)操作技巧,需要的朋友可以參考下2018-12-12JavaScript 拖拽實(shí)現(xiàn)(附注釋),最經(jīng)典簡(jiǎn)單短小精悍!
JavaScript拖拽實(shí)現(xiàn)(附注釋),最經(jīng)典!最簡(jiǎn)單!短小精悍!2009-04-04javascript中兼容主流瀏覽器的動(dòng)態(tài)生成iframe方法
這篇文章主要介紹了javascript中兼容主流瀏覽器的動(dòng)態(tài)生成iframe方法,需要的朋友可以參考下2014-05-05