|
@@ -24714,6 +24714,7 @@
|
|
model.dispatchEvent('transformChanged');
|
|
model.dispatchEvent('transformChanged');
|
|
};
|
|
};
|
|
model.addEventListener('position_changed', () => {
|
|
model.addEventListener('position_changed', () => {
|
|
|
|
+ //要先发送position_changed再其他
|
|
_updateBound();
|
|
_updateBound();
|
|
MergeEditor.getBoundCenter(model); //更新boundcenter
|
|
MergeEditor.getBoundCenter(model); //更新boundcenter
|
|
|
|
|
|
@@ -81648,8 +81649,8 @@
|
|
//有的动画,如小狗,进来如果不play停在第一帧,mesh会错,爪子在前面;但如果都停在第一帧,动作有可能很奇怪
|
|
//有的动画,如小狗,进来如果不play停在第一帧,mesh会错,爪子在前面;但如果都停在第一帧,动作有可能很奇怪
|
|
|
|
|
|
var tweens = {};
|
|
var tweens = {};
|
|
- var maxClipFadeTime = 0.6; //渐变时间 s
|
|
|
|
-
|
|
|
|
|
|
+ var maxClipFadeTime = 3.6; //渐变时间 s
|
|
|
|
+ var pathStates = new Map();
|
|
//actions中可能包含没有动作的 如TPose
|
|
//actions中可能包含没有动作的 如TPose
|
|
|
|
|
|
//包括无动画的模型在内的各项属性的过渡
|
|
//包括无动画的模型在内的各项属性的过渡
|
|
@@ -81671,146 +81672,116 @@
|
|
}
|
|
}
|
|
var index = keys.findIndex(e => e.time > key.time);
|
|
var index = keys.findIndex(e => e.time > key.time);
|
|
if (index == -1) {
|
|
if (index == -1) {
|
|
- index = 0;
|
|
|
|
|
|
+ index = keys.length;
|
|
}
|
|
}
|
|
keys = [...keys.slice(0, index), key, ...keys.slice(index, keys.length)];
|
|
keys = [...keys.slice(0, index), key, ...keys.slice(index, keys.length)];
|
|
this[keyType + 'Keys'].set(model, keys);
|
|
this[keyType + 'Keys'].set(model, keys);
|
|
|
|
+ this.updateTimeRange();
|
|
}
|
|
}
|
|
removeKey(model, keyType, key) {
|
|
removeKey(model, keyType, key) {
|
|
var keys = this[keyType + 'Keys'].get(model);
|
|
var keys = this[keyType + 'Keys'].get(model);
|
|
if (!keys) return console.warn('removeKey没找到key');
|
|
if (!keys) return console.warn('removeKey没找到key');
|
|
var index = keys.indexOf(key);
|
|
var index = keys.indexOf(key);
|
|
index > -1 && keys.splice(index, 1);
|
|
index > -1 && keys.splice(index, 1);
|
|
|
|
+ this.updateTimeRange();
|
|
}
|
|
}
|
|
reOrderKey(model, keyType, key) {
|
|
reOrderKey(model, keyType, key) {
|
|
this.removeKey(model, keyType, key);
|
|
this.removeKey(model, keyType, key);
|
|
this.addKey(model, keyType, key);
|
|
this.addKey(model, keyType, key);
|
|
}
|
|
}
|
|
-
|
|
|
|
- /////////////////////////////////
|
|
|
|
-
|
|
|
|
- addPoseKey() {
|
|
|
|
- var {
|
|
|
|
- model,
|
|
|
|
- time,
|
|
|
|
- index
|
|
|
|
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
|
- /* if(replace){
|
|
|
|
- this.removeKey(model,'pose', index)
|
|
|
|
- } */
|
|
|
|
- var keys = this.poseKeys.get(model);
|
|
|
|
- if (!keys) {
|
|
|
|
- keys = [];
|
|
|
|
- }
|
|
|
|
- var key = {
|
|
|
|
- time,
|
|
|
|
- qua: model.quaternion.clone(),
|
|
|
|
- scale: model.scale.clone(),
|
|
|
|
- pos: model.position.clone()
|
|
|
|
- };
|
|
|
|
- if (index == void 0) index = keys.length;
|
|
|
|
- keys = [...keys.slice(0, index), key, ...keys.slice(index, keys.length)];
|
|
|
|
- this.poseKeys.set(model, keys);
|
|
|
|
- return key;
|
|
|
|
- }
|
|
|
|
- addClipKey() {
|
|
|
|
- var {
|
|
|
|
- model,
|
|
|
|
- time,
|
|
|
|
- index,
|
|
|
|
- dur,
|
|
|
|
- actionIndex,
|
|
|
|
- weight = 1,
|
|
|
|
- speed = 1 /* , replace */
|
|
|
|
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
|
- /* if(replace){
|
|
|
|
- this.removeKey(model,'clip',index)
|
|
|
|
- } */
|
|
|
|
- var keys = this.clipKeys.get(model);
|
|
|
|
- if (!keys) {
|
|
|
|
- keys = [];
|
|
|
|
- }
|
|
|
|
- var key = {
|
|
|
|
- time,
|
|
|
|
- //startTime
|
|
|
|
- dur,
|
|
|
|
- action: model.actions[actionIndex],
|
|
|
|
- speed,
|
|
|
|
- weight
|
|
|
|
|
|
+ at(time, delta) {
|
|
|
|
+ var _this = this;
|
|
|
|
+ if (time > this.duration + maxClipFadeTime / 2) return;
|
|
|
|
+ var transitionRatio = 0.05 * delta * 60; //渐变系数,越小缓动程度越高,越平滑 //假设标准帧率为60fps,当帧率低时(delta大时) 降低缓动。速度快时缓动太高会偏移路径
|
|
|
|
+ var _loop = function _loop() {
|
|
|
|
+ var atPath; //是否在path中 至多只有一个
|
|
|
|
+ var fadeToPath; //是否在过渡到path中
|
|
|
|
+ var fadeFromPath; //是否从path中过渡到下一pose
|
|
|
|
+ //以上三个权重越来越小,但都比pose大
|
|
|
|
+ keys.find(key => {
|
|
|
|
+ if (key.path.points.length < 2) return;
|
|
|
|
+ var startToFade = key.time - maxClipFadeTime / 2;
|
|
|
|
+ var endFade = key.time + key.dur + maxClipFadeTime / 2;
|
|
|
|
+ atPath = time >= key.time && time <= key.time + key.dur;
|
|
|
|
+ if (atPath) {
|
|
|
|
+ atPath = key; //找到一个就退出
|
|
|
|
+ return true;
|
|
|
|
+ } else if (delta) {
|
|
|
|
+ //有delta代表是播放时,要缓动,如果是点击时间轴到这一帧,就不缓动
|
|
|
|
+ if (time > startToFade && time < key.time) {
|
|
|
|
+ fadeToPath = key;
|
|
|
|
+ } else if (!fadeToPath && time > key.time + key.dur && time < endFade) {
|
|
|
|
+ fadeFromPath = key;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ pathStates.set(model, {
|
|
|
|
+ atPath,
|
|
|
|
+ fadeToPath,
|
|
|
|
+ fadeFromPath
|
|
|
|
+ });
|
|
|
|
+ if (atPath) {
|
|
|
|
+ //沿着curve行走,目视curve前方 (参照CameraAnimationCurve,搜quaFromCurveTan)
|
|
|
|
+ var percent = (time - atPath.time) / atPath.dur;
|
|
|
|
+ var {
|
|
|
|
+ position: _position,
|
|
|
|
+ quaternion: _quaternion
|
|
|
|
+ } = _this.getPoseAtPathKey(atPath, percent);
|
|
|
|
+ model.position.copy(_position);
|
|
|
|
+ _quaternion && model.quaternion.copy(_quaternion);
|
|
|
|
+ } else if (fadeToPath) {
|
|
|
|
+ var {
|
|
|
|
+ position: _position2,
|
|
|
|
+ quaternion: _quaternion2
|
|
|
|
+ } = _this.getPoseAtPathKey(fadeToPath, 0);
|
|
|
|
+ _quaternion2 && lerp.quaternion(model.quaternion, _quaternion2)(transitionRatio); //每次只改变一点点
|
|
|
|
+ lerp.vector(model.position, _position2)(transitionRatio);
|
|
|
|
+ }
|
|
|
|
+ if (atPath || fadeToPath) {
|
|
|
|
+ model.dispatchEvent('position_changed'); //暂时都这么写,以后再判断是否真的改变了
|
|
|
|
+ model.dispatchEvent('rotation_changed');
|
|
|
|
+ }
|
|
};
|
|
};
|
|
- if (index == void 0) index = keys.length;
|
|
|
|
- keys = [...keys.slice(0, index), key, ...keys.slice(index, keys.length)];
|
|
|
|
- this.clipKeys.set(model, keys);
|
|
|
|
- }
|
|
|
|
- addPathKey() {
|
|
|
|
- var {
|
|
|
|
- model,
|
|
|
|
- time,
|
|
|
|
- index,
|
|
|
|
- dur,
|
|
|
|
- path /* , replace */
|
|
|
|
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
|
- //what if path is deleted ?
|
|
|
|
- /* if(replace){
|
|
|
|
- this.removeKey(model,'path',index)
|
|
|
|
- } */
|
|
|
|
- var keys = this.pathKeys.get(model);
|
|
|
|
- if (!keys) {
|
|
|
|
- keys = [];
|
|
|
|
|
|
+ for (var [model, keys] of this.pathKeys) {
|
|
|
|
+ _loop();
|
|
}
|
|
}
|
|
- var key = {
|
|
|
|
- time,
|
|
|
|
- //startTime
|
|
|
|
- dur,
|
|
|
|
- path
|
|
|
|
- };
|
|
|
|
- if (index == void 0) index = keys.length;
|
|
|
|
- keys = [...keys.slice(0, index), key, ...keys.slice(index, keys.length)];
|
|
|
|
- this.pathKeys.set(model, keys);
|
|
|
|
- }
|
|
|
|
- addDescKey() {
|
|
|
|
- var {
|
|
|
|
- model,
|
|
|
|
- time,
|
|
|
|
- index,
|
|
|
|
- dur,
|
|
|
|
- desc /* , replace */
|
|
|
|
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
|
- /* if(replace){
|
|
|
|
- this.removeKey(model,'desc',index)
|
|
|
|
- } */
|
|
|
|
- var keys = this.descKeys.get(model);
|
|
|
|
- if (!keys) {
|
|
|
|
- keys = [];
|
|
|
|
|
|
+ for (var [_model, _keys] of this.poseKeys) {
|
|
|
|
+ /* keys = keys.filter(e=>e.pos && e.scale && e.qua)*/
|
|
|
|
+ if (_keys.length == 0) continue;
|
|
|
|
+ var {
|
|
|
|
+ atPath,
|
|
|
|
+ fadeFromPath,
|
|
|
|
+ fadeToPath
|
|
|
|
+ } = pathStates.get(_model) || {};
|
|
|
|
+ tweens.scale = new Tween$1(_keys.map(e => e.time), _keys.map(e => e.scale));
|
|
|
|
+ _model.scale.copy(tweens.scale.lerp(time));
|
|
|
|
+ if (!atPath && !fadeToPath) {
|
|
|
|
+ tweens.pos = new Tween$1(_keys.map(e => e.time), _keys.map(e => e.pos));
|
|
|
|
+ tweens.qua = new Tween$1(_keys.map(e => e.time), _keys.map(e => e.qua));
|
|
|
|
+ var time_ = time;
|
|
|
|
+ if (fadeFromPath) {
|
|
|
|
+ //但如果开始播放时模型已经在fadeFromPath这个区间里,也是直接过渡过去
|
|
|
|
+ time_ = fadeFromPath.time + fadeFromPath.dur + maxClipFadeTime / 2; //fadeTimeEnd
|
|
|
|
+ }
|
|
|
|
+ var position = tweens.pos.lerp(time_);
|
|
|
|
+ var quaternion = tweens.qua.lerp(time_);
|
|
|
|
+ if (fadeFromPath) {
|
|
|
|
+ lerp.quaternion(_model.quaternion, quaternion)(transitionRatio); //每次只改变一点点
|
|
|
|
+ lerp.vector(_model.position, position)(transitionRatio);
|
|
|
|
+ } else {
|
|
|
|
+ _model.position.copy(position);
|
|
|
|
+ _model.quaternion.copy(quaternion);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ _model.dispatchEvent('position_changed');
|
|
|
|
+ _model.dispatchEvent('rotation_changed');
|
|
}
|
|
}
|
|
- var key = {
|
|
|
|
- time,
|
|
|
|
- //startTime
|
|
|
|
- dur,
|
|
|
|
- desc
|
|
|
|
- };
|
|
|
|
- if (index == void 0) index = keys.length;
|
|
|
|
- keys = [...keys.slice(0, index), key, ...keys.slice(index, keys.length)];
|
|
|
|
- this.descKeys.set(model, keys);
|
|
|
|
- }
|
|
|
|
- at(time) {
|
|
|
|
- for (var [model, keys] of this.poseKeys) {
|
|
|
|
- /* keys = keys.filter(e=>e.pos && e.scale && e.qua)
|
|
|
|
- if(keys.length == 0)break */
|
|
|
|
-
|
|
|
|
- tweens.pos = new Tween$1(keys.map(e => e.time), keys.map(e => e.pos));
|
|
|
|
- tweens.qua = new Tween$1(keys.map(e => e.time), keys.map(e => e.qua));
|
|
|
|
- tweens.scale = new Tween$1(keys.map(e => e.time), keys.map(e => e.scale));
|
|
|
|
- model.position.copy(tweens.pos.lerp(time));
|
|
|
|
- model.quaternion.copy(tweens.qua.lerp(time));
|
|
|
|
- model.scale.copy(tweens.scale.lerp(time));
|
|
|
|
- model.dispatchEvent('position_changed'); //rotation_changed?//以后再写真的改变了才发送
|
|
|
|
- }
|
|
|
|
- var _loop = function _loop(_keys) {
|
|
|
|
- var weights = _keys.map((key, i) => {
|
|
|
|
- var _keys2, _keys3;
|
|
|
|
- var fadeTimeStart = Math.min(maxClipFadeTime, key.dur, ((_keys2 = _keys[i - 1]) === null || _keys2 === void 0 ? void 0 : _keys2.dur) || maxClipFadeTime) / 2; //half
|
|
|
|
- var fadeTimeEnd = Math.min(maxClipFadeTime, key.dur, ((_keys3 = _keys[i + 1]) === null || _keys3 === void 0 ? void 0 : _keys3.dur) || maxClipFadeTime) / 2;
|
|
|
|
|
|
+ var _loop2 = function _loop2(_keys2) {
|
|
|
|
+ if (_keys2.length == 0) return 1; // continue
|
|
|
|
+ var weights = _keys2.map((key, i) => {
|
|
|
|
+ var _keys3, _keys4;
|
|
|
|
+ var fadeTimeStart = Math.min(maxClipFadeTime, key.dur, ((_keys3 = _keys2[i - 1]) === null || _keys3 === void 0 ? void 0 : _keys3.dur) || maxClipFadeTime) / 2; //half of dur
|
|
|
|
+ var fadeTimeEnd = Math.min(maxClipFadeTime, key.dur, ((_keys4 = _keys2[i + 1]) === null || _keys4 === void 0 ? void 0 : _keys4.dur) || maxClipFadeTime) / 2;
|
|
var startTime1 = key.time - fadeTimeStart;
|
|
var startTime1 = key.time - fadeTimeStart;
|
|
var endTime1 = key.time + key.dur + fadeTimeEnd;
|
|
var endTime1 = key.time + key.dur + fadeTimeEnd;
|
|
if (time < startTime1 || time > endTime1) return 0; //out bound
|
|
if (time < startTime1 || time > endTime1) return 0; //out bound
|
|
@@ -81826,14 +81797,14 @@
|
|
}); //最多有两个>0的,在过渡, 且能保证两个是不同的action
|
|
}); //最多有两个>0的,在过渡, 且能保证两个是不同的action
|
|
|
|
|
|
var animateActions = []; //在播的动作
|
|
var animateActions = []; //在播的动作
|
|
- _keys.forEach((key, i) => {
|
|
|
|
|
|
+ _keys2.forEach((key, i) => {
|
|
weights[i] > 0 && !animateActions.includes(key.action) && animateActions.push(key.action);
|
|
weights[i] > 0 && !animateActions.includes(key.action) && animateActions.push(key.action);
|
|
});
|
|
});
|
|
|
|
|
|
//console.log(time, model.name, weights)
|
|
//console.log(time, model.name, weights)
|
|
|
|
|
|
var speed = 0;
|
|
var speed = 0;
|
|
- _keys.forEach((key, i) => {
|
|
|
|
|
|
+ _keys2.forEach((key, i) => {
|
|
if (animateActions.includes(key.action)) {
|
|
if (animateActions.includes(key.action)) {
|
|
var weight = weights[i] * key.weight;
|
|
var weight = weights[i] * key.weight;
|
|
if (weight > 0) {
|
|
if (weight > 0) {
|
|
@@ -81845,7 +81816,7 @@
|
|
key.action.stop();
|
|
key.action.stop();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
- _model.mixer.timeScale = speed;
|
|
|
|
|
|
+ _model2.mixer.timeScale = speed;
|
|
|
|
|
|
/* let key = keys.find(key=>key.time < time && key.time + key.dur > time)
|
|
/* let key = keys.find(key=>key.time < time && key.time + key.dur > time)
|
|
let action = key?.action
|
|
let action = key?.action
|
|
@@ -81861,8 +81832,8 @@
|
|
//inKey.action.paused
|
|
//inKey.action.paused
|
|
} */
|
|
} */
|
|
};
|
|
};
|
|
- for (var [_model, _keys] of this.clipKeys) {
|
|
|
|
- _loop(_keys);
|
|
|
|
|
|
+ for (var [_model2, _keys2] of this.clipKeys) {
|
|
|
|
+ if (_loop2(_keys2)) continue;
|
|
}
|
|
}
|
|
{
|
|
{
|
|
if (this.camFollowObject) {
|
|
if (this.camFollowObject) {
|
|
@@ -81871,11 +81842,11 @@
|
|
|
|
|
|
if (this.camFollowObject.length == 1) {
|
|
if (this.camFollowObject.length == 1) {
|
|
var dis = 4;
|
|
var dis = 4;
|
|
- var _model2 = this.camFollowObject[0];
|
|
|
|
- dir.multiplyScalar(dis).applyQuaternion(_model2.quaternion);
|
|
|
|
- var pos = new Vector3().addVectors(_model2.boundCenter, dir);
|
|
|
|
|
|
+ var _model3 = this.camFollowObject[0];
|
|
|
|
+ dir.multiplyScalar(dis).applyQuaternion(_model3.quaternion);
|
|
|
|
+ var pos = new Vector3().addVectors(_model3.boundCenter, dir);
|
|
viewer.mainViewport.view.position.copy(pos);
|
|
viewer.mainViewport.view.position.copy(pos);
|
|
- viewer.mainViewport.view.lookAt(_model2.boundCenter);
|
|
|
|
|
|
+ viewer.mainViewport.view.lookAt(_model3.boundCenter);
|
|
} else {
|
|
} else {
|
|
/* let dirAve = new THREE.Vector3
|
|
/* let dirAve = new THREE.Vector3
|
|
this.camFollowObject.forEach(model=>{
|
|
this.camFollowObject.forEach(model=>{
|
|
@@ -81885,11 +81856,28 @@
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ viewer.dispatchEvent('content_changed');
|
|
|
|
+ this.currentTime = time;
|
|
this.dispatchEvent({
|
|
this.dispatchEvent({
|
|
type: 'atTime',
|
|
type: 'atTime',
|
|
time
|
|
time
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
+ getPoseAtPathKey(key, percent) {
|
|
|
|
+ var percent2 = percent + 0.001;
|
|
|
|
+ var curve = key.path.curve.clone();
|
|
|
|
+ if (key.reverse) curve.points.reverse();
|
|
|
|
+ var position = curve.getPointAt(percent);
|
|
|
|
+ var quaternion;
|
|
|
|
+ if (percent2 <= 1) {
|
|
|
|
+ var position2 = curve.getPointAt(percent2);
|
|
|
|
+ quaternion = math.getQuaFromPosAim(position2, position);
|
|
|
|
+ }
|
|
|
|
+ return {
|
|
|
|
+ position,
|
|
|
|
+ quaternion
|
|
|
|
+ };
|
|
|
|
+ }
|
|
play() {
|
|
play() {
|
|
var {
|
|
var {
|
|
camFollowObject,
|
|
camFollowObject,
|
|
@@ -81900,15 +81888,13 @@
|
|
this.updateTimeRange();
|
|
this.updateTimeRange();
|
|
this.setCameraFollow(camFollowObject);
|
|
this.setCameraFollow(camFollowObject);
|
|
this.playing && this.pause();
|
|
this.playing && this.pause();
|
|
-
|
|
|
|
- //this.at(this.time) //first frame maybe has pose
|
|
|
|
|
|
+ var maxTime = this.duration + maxClipFadeTime / 2;
|
|
this.playing = true;
|
|
this.playing = true;
|
|
this.onUpdate = e => {
|
|
this.onUpdate = e => {
|
|
this.time += e.delta;
|
|
this.time += e.delta;
|
|
- if (this.time > this.duration + maxClipFadeTime / 2) return this.pause();
|
|
|
|
- this.at(this.time);
|
|
|
|
- /* if ( this.sizeTween.times.length > 0 )
|
|
|
|
- this.size = this.sizeTween.lerp( this.age/this.deathAge ); */
|
|
|
|
|
|
+ if (this.time >= maxTime) this.time = maxTime;
|
|
|
|
+ this.at(this.time, e.delta);
|
|
|
|
+ if (this.time >= maxTime) return this.pause();
|
|
};
|
|
};
|
|
viewer.addEventListener("update", this.onUpdate);
|
|
viewer.addEventListener("update", this.onUpdate);
|
|
}
|
|
}
|
|
@@ -81939,13 +81925,13 @@
|
|
updateTimeRange() {
|
|
updateTimeRange() {
|
|
var maxTime = 0;
|
|
var maxTime = 0;
|
|
for (var [model, keys] of this.poseKeys) {
|
|
for (var [model, keys] of this.poseKeys) {
|
|
- maxTime = Math.max(maxTime, keys[keys.length - 1].time);
|
|
|
|
|
|
+ keys.length > 0 && (maxTime = Math.max(maxTime, keys[keys.length - 1].time));
|
|
}
|
|
}
|
|
- for (var [_model3, _keys4] of this.clipKeys) {
|
|
|
|
- maxTime = Math.max(maxTime, _keys4[_keys4.length - 1].time + _keys4[_keys4.length - 1].dur);
|
|
|
|
|
|
+ for (var [_model4, _keys5] of this.clipKeys) {
|
|
|
|
+ _keys5.length > 0 && (maxTime = Math.max(maxTime, _keys5[_keys5.length - 1].time + _keys5[_keys5.length - 1].dur));
|
|
}
|
|
}
|
|
- for (var [_model4, _keys5] of this.pathKeys) {
|
|
|
|
- maxTime = Math.max(maxTime, _keys5[_keys5.length - 1].time + _keys5[_keys5.length - 1].dur);
|
|
|
|
|
|
+ for (var [_model5, _keys6] of this.pathKeys) {
|
|
|
|
+ _keys6.length > 0 && (maxTime = Math.max(maxTime, _keys6[_keys6.length - 1].time + _keys6[_keys6.length - 1].dur));
|
|
}
|
|
}
|
|
this.duration = maxTime; //不算开始和结束动画的过渡时间的话
|
|
this.duration = maxTime; //不算开始和结束动画的过渡时间的话
|
|
|
|
|
|
@@ -81954,20 +81940,119 @@
|
|
} */
|
|
} */
|
|
}
|
|
}
|
|
|
|
|
|
- /* updatemaxClipFadeTime (){
|
|
|
|
-
|
|
|
|
- for(let [model, keys] of this.clipKeys){
|
|
|
|
- keys.forEach(key)
|
|
|
|
- }
|
|
|
|
- } */
|
|
|
|
|
|
+ /////////////////////////////////
|
|
|
|
|
|
|
|
+ addPoseKey() {
|
|
|
|
+ var {
|
|
|
|
+ model,
|
|
|
|
+ time,
|
|
|
|
+ index
|
|
|
|
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
|
+ /* if(replace){
|
|
|
|
+ this.removeKey(model,'pose', index)
|
|
|
|
+ } */
|
|
|
|
+ var keys = this.poseKeys.get(model);
|
|
|
|
+ if (!keys) {
|
|
|
|
+ keys = [];
|
|
|
|
+ }
|
|
|
|
+ var key = {
|
|
|
|
+ time,
|
|
|
|
+ qua: model.quaternion.clone(),
|
|
|
|
+ scale: model.scale.clone(),
|
|
|
|
+ pos: model.position.clone()
|
|
|
|
+ };
|
|
|
|
+ if (index == void 0) index = keys.length;
|
|
|
|
+ keys = [...keys.slice(0, index), key, ...keys.slice(index, keys.length)];
|
|
|
|
+ this.poseKeys.set(model, keys);
|
|
|
|
+ return key;
|
|
|
|
+ }
|
|
|
|
+ addClipKey() {
|
|
|
|
+ var {
|
|
|
|
+ model,
|
|
|
|
+ time,
|
|
|
|
+ index,
|
|
|
|
+ dur,
|
|
|
|
+ actionIndex,
|
|
|
|
+ weight = 1,
|
|
|
|
+ speed = 1 /* , replace */
|
|
|
|
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
|
+ /* if(replace){
|
|
|
|
+ this.removeKey(model,'clip',index)
|
|
|
|
+ } */
|
|
|
|
+ var keys = this.clipKeys.get(model);
|
|
|
|
+ if (!keys) {
|
|
|
|
+ keys = [];
|
|
|
|
+ }
|
|
|
|
+ var key = {
|
|
|
|
+ time,
|
|
|
|
+ //startTime
|
|
|
|
+ dur,
|
|
|
|
+ action: model.actions[actionIndex],
|
|
|
|
+ speed,
|
|
|
|
+ weight
|
|
|
|
+ };
|
|
|
|
+ if (index == void 0) index = keys.length;
|
|
|
|
+ keys = [...keys.slice(0, index), key, ...keys.slice(index, keys.length)];
|
|
|
|
+ this.clipKeys.set(model, keys);
|
|
|
|
+ }
|
|
|
|
+ addPathKey() {
|
|
|
|
+ var {
|
|
|
|
+ model,
|
|
|
|
+ time,
|
|
|
|
+ index,
|
|
|
|
+ dur,
|
|
|
|
+ path /* , replace */
|
|
|
|
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
|
+ //what if path is deleted ?
|
|
|
|
+ /* if(replace){
|
|
|
|
+ this.removeKey(model,'path',index)
|
|
|
|
+ } */
|
|
|
|
+ var keys = this.pathKeys.get(model);
|
|
|
|
+ if (!keys) {
|
|
|
|
+ keys = [];
|
|
|
|
+ }
|
|
|
|
+ var key = {
|
|
|
|
+ time,
|
|
|
|
+ //startTime
|
|
|
|
+ dur,
|
|
|
|
+ path
|
|
|
|
+ };
|
|
|
|
+ if (index == void 0) index = keys.length;
|
|
|
|
+ keys = [...keys.slice(0, index), key, ...keys.slice(index, keys.length)];
|
|
|
|
+ this.pathKeys.set(model, keys);
|
|
|
|
+ }
|
|
|
|
+ addDescKey() {
|
|
|
|
+ var {
|
|
|
|
+ model,
|
|
|
|
+ time,
|
|
|
|
+ index,
|
|
|
|
+ dur,
|
|
|
|
+ desc /* , replace */
|
|
|
|
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
|
+ /* if(replace){
|
|
|
|
+ this.removeKey(model,'desc',index)
|
|
|
|
+ } */
|
|
|
|
+ var keys = this.descKeys.get(model);
|
|
|
|
+ if (!keys) {
|
|
|
|
+ keys = [];
|
|
|
|
+ }
|
|
|
|
+ var key = {
|
|
|
|
+ time,
|
|
|
|
+ //startTime
|
|
|
|
+ dur,
|
|
|
|
+ desc
|
|
|
|
+ };
|
|
|
|
+ if (index == void 0) index = keys.length;
|
|
|
|
+ keys = [...keys.slice(0, index), key, ...keys.slice(index, keys.length)];
|
|
|
|
+ this.descKeys.set(model, keys);
|
|
|
|
+ }
|
|
save() {
|
|
save() {
|
|
//for test, 注意保证每个模型名字不同
|
|
//for test, 注意保证每个模型名字不同
|
|
var data = {
|
|
var data = {
|
|
poseKeys: {},
|
|
poseKeys: {},
|
|
clipKeys: {}
|
|
clipKeys: {}
|
|
};
|
|
};
|
|
- var _loop2 = function _loop2(model) {
|
|
|
|
|
|
+ var _loop3 = function _loop3(model) {
|
|
data.clipKeys[model.name] = keys.map(key => {
|
|
data.clipKeys[model.name] = keys.map(key => {
|
|
return {
|
|
return {
|
|
actionIndex: model.actions.indexOf(key.action),
|
|
actionIndex: model.actions.indexOf(key.action),
|
|
@@ -81979,10 +82064,10 @@
|
|
});
|
|
});
|
|
};
|
|
};
|
|
for (var [model, keys] of this.clipKeys) {
|
|
for (var [model, keys] of this.clipKeys) {
|
|
- _loop2(model);
|
|
|
|
|
|
+ _loop3(model);
|
|
}
|
|
}
|
|
- for (var [_model5, _keys6] of this.poseKeys) {
|
|
|
|
- data.poseKeys[_model5.name] = _keys6.map(key => {
|
|
|
|
|
|
+ for (var [_model6, _keys7] of this.poseKeys) {
|
|
|
|
+ data.poseKeys[_model6.name] = _keys7.map(key => {
|
|
return {
|
|
return {
|
|
qua: key.qua.toArray(),
|
|
qua: key.qua.toArray(),
|
|
pos: key.pos.toArray(),
|
|
pos: key.pos.toArray(),
|
|
@@ -81995,11 +82080,11 @@
|
|
return data;
|
|
return data;
|
|
}
|
|
}
|
|
buildFromData(data) {
|
|
buildFromData(data) {
|
|
- var _this = this;
|
|
|
|
|
|
+ var _this2 = this;
|
|
if (typeof data == 'string') {
|
|
if (typeof data == 'string') {
|
|
data = JSON.parse(data);
|
|
data = JSON.parse(data);
|
|
}
|
|
}
|
|
- var _loop3 = function _loop3(name) {
|
|
|
|
|
|
+ var _loop4 = function _loop4(name) {
|
|
var model = viewer.objs.children.find(e => e.name == name);
|
|
var model = viewer.objs.children.find(e => e.name == name);
|
|
if (!model) {
|
|
if (!model) {
|
|
console.warn('没找到pose模型', name);
|
|
console.warn('没找到pose模型', name);
|
|
@@ -82013,12 +82098,12 @@
|
|
time: e.time
|
|
time: e.time
|
|
};
|
|
};
|
|
});
|
|
});
|
|
- _this.poseKeys.set(model, keys);
|
|
|
|
|
|
+ _this2.poseKeys.set(model, keys);
|
|
};
|
|
};
|
|
for (var name in data.poseKeys) {
|
|
for (var name in data.poseKeys) {
|
|
- if (_loop3(name)) continue;
|
|
|
|
|
|
+ if (_loop4(name)) continue;
|
|
}
|
|
}
|
|
- var _loop4 = function _loop4(_name) {
|
|
|
|
|
|
+ var _loop5 = function _loop5(_name) {
|
|
var model = viewer.objs.children.find(e => e.name == _name);
|
|
var model = viewer.objs.children.find(e => e.name == _name);
|
|
if (!model) {
|
|
if (!model) {
|
|
console.warn('没找到clip模型', _name);
|
|
console.warn('没找到clip模型', _name);
|
|
@@ -82033,10 +82118,10 @@
|
|
speed: e.speed
|
|
speed: e.speed
|
|
};
|
|
};
|
|
});
|
|
});
|
|
- _this.clipKeys.set(model, keys);
|
|
|
|
|
|
+ _this2.clipKeys.set(model, keys);
|
|
};
|
|
};
|
|
for (var _name in data.clipKeys) {
|
|
for (var _name in data.clipKeys) {
|
|
- if (_loop4(_name)) continue;
|
|
|
|
|
|
+ if (_loop5(_name)) continue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|