| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- import * as THREE from "../libs/three.js/build/three.module.js";
- export class PathAnimation{
-
- constructor(path, start, end, speed, callback){
- this.path = path;
- this.length = this.path.spline.getLength();
- this.speed = speed;
- this.callback = callback;
- this.tween = null;
- this.startPoint = Math.max(start, 0);
- this.endPoint = Math.min(end, this.length);
- this.t = 0.0;
- }
- start(resume = false){
- if(this.tween){
- this.tween.stop();
- this.tween = null;
- }
-
- let tStart;
- if(resume){
- tStart = this.t;
- }else{
- tStart = this.startPoint / this.length;
- }
- let tEnd = this.endPoint / this.length;
- let animationDuration = (tEnd - tStart) * this.length * 1000 / this.speed;
-
- let progress = {t: tStart};
- this.tween = new TWEEN.Tween(progress).to({t: tEnd}, animationDuration);
- this.tween.easing(TWEEN.Easing.Linear.None);
- this.tween.onUpdate((e) => {
- this.t = progress.t;
- this.callback(progress.t);
- });
- this.tween.onComplete(() => {
- if(this.repeat){
- this.start();
- }
- });
- setTimeout(() => {
- this.tween.start();
- }, 0);
- }
- stop(){
- if(!this.tween){
- return;
- }
- this.tween.stop();
- this.tween = null;
- this.t = 0;
- }
- pause(){
- if(!this.tween){
- return;
- }
-
- this.tween.stop();
- TWEEN.remove(this.tween);
- this.tween = null;
- }
- resume(){
- this.start(true);
- }
- getPoint(t){
- return this.path.spline.getPoint(t);
- }
- }
- export class AnimationPath{
- constructor (points = []) {
- this.points = points;
- this.spline = new THREE.CatmullRomCurve3(points);
- //this.spline.reparametrizeByArcLength(1 / this.spline.getLength().total);
- }
- get (t) {
- return this.spline.getPoint(t);
- }
- getLength () {
- return this.spline.getLength();
- }
- animate (start, end, speed, callback) {
- let animation = new PathAnimation(this, start, end, speed, callback);
- animation.start();
- return animation;
- }
- pause () {
- if (this.tween) {
- this.tween.stop();
- }
- }
- resume () {
- if (this.tween) {
- this.tween.start();
- }
- }
- getGeometry () {
- let geometry = new THREE.Geometry();
- let samples = 500;
- let i = 0;
- for (let u = 0; u <= 1; u += 1 / samples) {
- let position = this.spline.getPoint(u);
- geometry.vertices[i] = new THREE.Vector3(position.x, position.y, position.z);
- i++;
- }
- if(this.closed){
- let position = this.spline.getPoint(0);
- geometry.vertices[i] = new THREE.Vector3(position.x, position.y, position.z);
- }
- return geometry;
- }
- get closed(){
- return this.spline.closed;
- }
- set closed(value){
- this.spline.closed = value;
- }
- }
|