0

目前正在使用 Three.JS 和 Tween.JS 处理垃圾箱包装问题我实际上正在努力使用动画。我有一个循环,我使用 TWEEN 对象将一堆平面几何图形存储在画布的变量中。我想做的是连续播放我的动画,而不是同时播放。我已经使用了 setTimeout 解决方案,但没有成功。ThreeJS/TweenJs 在每个动画循环之间等待的解决方案是什么?

装箱码:

var GeometryArray = Array();

for(let i=0; i < elementNumber; i++){
                let elementHeight = GeometryArray[i].geometry.parameters.height;
                let elementWidth = GeometryArray[i].geometry.parameters.width;
                calc = 5 - cursorX.position.x
                calc2 = 5 - cursorY.position.y
                if(elementWidth <= (5 - cursorX.position.x)){
                    console.log("1")
                    MoveObject(GeometryArray[i], cursorX.position.x + elementWidth/2, cursorY.position.y +elementHeight/2)
                    cursorX.position.x += elementWidth;
                    if(cursorMax.position.y < GeometryArray[i].position.y + elementHeight/2){
                        cursorMax.position.y = GeometryArray[i].position.y + elementHeight/2;
                    }
                }
                else if(elementHeight <= (5 - cursorMax.position.y)){
                    console.log("2")
                    cursorY.position.y = cursorMax.position.y;
                    cursorX.position.x = -5; 
                    MoveObject(GeometryArray[i], cursorX.position.x + elementWidth/2, cursorY.position.y +elementHeight/2)
                }
                else{
                    actualIndex = i
                    //gestion du placement des élément dans les interstices
                    for(let j=0;j<i;j++){
                        console.log("ENTERED")
                        //récupération et calcul de la différence de hauteur entre les element J et J+1 déjà posés
                        hauteurJ = GeometryArray[j].position.y + GeometryArray[j].geometry.parameters.height/2
                        hauteurJ1 = GeometryArray[j+1].position.y + GeometryArray[j+1].geometry.parameters.height/2
                        positionDroitElementJ = GeometryArray[j].position.x + GeometryArray[j].geometry.parameters.width
                        calcHauteur = hauteurJ - hauteurJ1;
                        calcLargeur = 5 - positionDroitElementJ;
                        //Si il y a assez d'espace entre les 2 élement pour contenir un autre element et qu'il y a assez de largeur, on place le curseur et l'élement
                        if(calcHauteur >= elementHeight && calcLargeur >= elementWidth){
                            console.log("calc" + calcLargeur + " width = " + elementWidth)
                            //On place le curseur sur le coin haut gauche de l'élement J+1
                            cursorY.position.y = hauteurJ1
                            cursorX.position.x = GeometryArray[j+1].position.y - GeometryArray[j+1].geometry.parameters.height/2
                            MoveObject(GeometryArray[i], cursorX.position.x + elementWidth/2, cursorY.position.y +elementHeight/2)
                        }
                        else{
                            //l'élément est impossible à placer donc on supprime
                            GeometryArray[i].geometry.dispose();
                        }
                    }
                }
            }

我的动画设置位置的功能:

function MoveObject(mesh, positionX, positionY){
                    var position = { x : mesh.position.x, y : mesh.position.y };
                    var target = { x : positionX, y : positionY };
                    var tween = new TWEEN.Tween(position).to(target, 1000);
                    tween.onUpdate(function(){
                        mesh.position.x = position.x;
                        mesh.position.y = position.y;
                    });
                    tween.start();
            }
4

1 回答 1

0

TweenJS 有一个.chain()命令可以用来触发后续补间。

https://github.com/tweenjs/tween.js/blob/master/docs/user_guide.md#chain

于 2021-01-03T08:08:19.300 回答