浏览代码

fix: ani action

xzw 4 月之前
父节点
当前提交
8b4da213d0
共有 2 个文件被更改,包括 54 次插入14 次删除
  1. 53 13
      public/lib/potree/potree.js
  2. 1 1
      public/lib/potree/potree.js.map

+ 53 - 13
public/lib/potree/potree.js

@@ -75789,9 +75789,9 @@
 	    this.boxHelper = new Box3Helper$1(new Box3(new Vector3(-0.5, -0.5, -0.5), new Vector3(0.5, 0.5, 0.5)));
 	    viewer.scene.scene.add(this.boxHelper);
 	    Potree.Utils.updateVisible(this.boxHelper, 'unselect', false);
-	    this.boxHelper.material.opacity = 0.7;
+	    this.boxHelper.material.opacity = 0.8;
 	    var boxHelper2 = new Box3Helper$1(new Box3(new Vector3(-0.5, -0.5, -0.5), new Vector3(0.5, 0.5, 0.5)));
-	    boxHelper2.material.opacity = 0.3;
+	    boxHelper2.material.opacity = 0.2;
 	    boxHelper2.material.transparent = true, boxHelper2.material.depthTest = false;
 	    this.boxHelper.add(boxHelper2); //透明一点的boxHelper */
 
@@ -82573,7 +82573,7 @@
 	        /* if(delta == void 0){//无缓动  但会造成和缓动时动作time不同
 	            return time >= key.time && time <= key.time + key.dur ? 1 : 0
 	        } */
-
+	        key.index_ = i;
 	        var fadeTimeStart = Math.min(maxClipFadeTime, key.dur, ((_keys = keys[i - 1]) === null || _keys === void 0 ? void 0 : _keys.dur) || maxClipFadeTime) / 2; //过渡时间不超过当前和前一个的 half of dur
 	        var fadeTimeEnd = Math.min(maxClipFadeTime, key.dur, ((_keys2 = keys[i + 1]) === null || _keys2 === void 0 ? void 0 : _keys2.dur) || maxClipFadeTime) / 2; //过渡时间不超过当前和后一个的 half of dur
 
@@ -82581,8 +82581,14 @@
 	        var endTime1 = key.time + key.dur + fadeTimeEnd;
 	        var startTime2 = key.time + fadeTimeStart;
 	        var endTime2 = key.time + key.dur - fadeTimeEnd;
-	        key.tempTime_ = MathUtils.clamp(time - key.time, 0, key.dur); //time - startTime1 //当前动作时间 
-
+	        key.action.tempSW_ = {
+	          scale: 0,
+	          weight: 0,
+	          time: null,
+	          sameLinks: []
+	        }, key.tempTime_ = MathUtils.clamp(time - key.time, 0, key.dur); //time - startTime1 //当前动作时间 
+	        key.startTime1 = startTime1;
+	        key.endTime1 = endTime1;
 	        if (i == 0 && time < startTime2) {
 	          //开始前维持第一个动作 
 	          return 1;
@@ -82603,34 +82609,68 @@
 
 	      var animateActions = []; //在播的动作
 	      keys.forEach((key, i) => {
-	        weights[i] > 0 && !animateActions.includes(key.action) && (animateActions.push(key.action), key.action.tempSW_ = {
+	        weights[i] > 0 && !animateActions.includes(key.action) && (key.action.tempSW_ = {
 	          scale: 0,
 	          weight: 0,
-	          time: null
-	        });
+	          time: null,
+	          sameLinks: []
+	        }, animateActions.push(key.action));
 	      });
 	      //万一前后是一个动作…… 所以用tempSW_计算总值
 
 	      keys.forEach((key, i) => {
+	        //要找到当前action之前所有不间断的所有key,他们之间要连续播放
+	        if (animateActions.includes(key.action)) {
+	          if (key.startTime1 < time) {
+	            //已播部分的key  
+	            var last = key.action.tempSW_.sameLinks[key.action.tempSW_.sameLinks.length - 1];
+	            if (last) {
+	              if (key.index_ == last.index_ + 1 && key.startTime1 <= last.endTime1) {
+	                //相连
+	                key.action.tempSW_.sameLinks.push(key);
+	              } else {
+	                key.action.tempSW_.sameLinks = [key]; //clear
+	              }
+	            } else {
+	              key.action.tempSW_.sameLinks = [key];
+	            }
+	          }
+	        }
+	      });
+	      keys.forEach((key, i) => {
 	        if (animateActions.includes(key.action)) {
 	          var weight = weights[i] * key.weight; //权重乘以自身幅度
 	          if (weight > 0) {
+	            //最多两个
 	            key.action.play();
 	            key.action.paused = true; /* time !=  key.time || delta != void 0 */ //停在某帧 //如果没有点击该动作块的话 不停
 
-	            key.action.tempSW_.time == null && (key.action.tempSW_.time = key.tempTime_); //相同动作优先用前一个的时间
-	            key.action.tempSW_.scale += key.speed; // * weights[i] //乘以weight在开始和结束作为缓动效果好,但是不好计算实时time
 	            key.action.tempSW_.weight += weight;
+	            key.tempTime_ >= 0 && (key.action.tempSW_.scale = key.speed); //相同动作不允许叠加速度
+	            //key.action.tempSW_.time += key.tempTime_ 
+
+	            if (key.action.tempSW_.time == null) {
+	              var timeSum = 0;
+	              key.action.tempSW_.sameLinks.forEach(key_ => {
+	                timeSum += key_.tempTime_ % (key_.action._clip.duration / key_.speed) * key_.speed; //相同动作可能速度不同,算出每个clip的时间  
+	              });
+	              key.action.tempSW_.time = timeSum % key.action._clip.duration;
+	            }
+
+	            //(老版本,过渡时播放时间会延长一点,有交集):
+	            //key.action.tempSW_.time == null && (key.action.tempSW_.time = key.tempTime_) //相同动作优先用前一个的时间
+	            //key.action.tempSW_.scale += key.speed // * weights[i] //乘以weight在开始和结束作为缓动效果好,但是不好计算实时time
+	            //speed time都没有交集,只有weight有,为了过渡
 	          }
 	        } else {
 	          key.action.stop(); //不启动动画
 	        }
 	      });
 	      animateActions.forEach(action => {
-	        action.setEffectiveTimeScale(action.tempSW_.scale); //speed  只有没paused时有效
+	        action.setEffectiveTimeScale(action.tempSW_.scale); //speed  只有没paused时有效 这里都paused的所以没用
 	        action.setEffectiveWeight(action.tempSW_.weight);
-	        action.time = action.tempSW_.time % (action._clip.duration / action.tempSW_.scale) * action.tempSW_.scale; //只有paused时有效
-	        //action.tempSW_.weight < 1 && console.log('action', action._clip.name, action.time, action.weight )
+	        action.time = action.tempSW_.time; //(action.tempSW_.time % (action._clip.duration / action.tempSW_.scale)) * action.tempSW_.scale  //只有paused时有效
+	        //console.log('action', action._clip.name, action.time, action.weight, action.tempSW_.scale )
 	      });
 
 	      //model.mixer.timeScale = 1 ;

文件差异内容过多而无法显示
+ 1 - 1
public/lib/potree/potree.js.map