基础知识:
xr-frame
中所有的动画都是通过动画系统AnimationSystem
统一管理的,在每帧的同一个时机统一更新。动画系统自身没有什么逻辑,所有的逻辑都是在动画组件Animator
和动画实现Animation
中的。
1.动画json数据(类似于CSS):
{
"keyframe": {
"cube": {
"0": {
"position": [-3, 0, 2]
},
"50": {
"rotation": [0, 0, 0],
"scale": [1, 1, 1]
},
"100": {
"position": [3, 0, 2],
"rotation": [0, 3.14, 0],
"scale": [1.4, 1.4, 1.4]
}
},
"sphere": {
"0": {
"position": [-3, 0, 0],
"scale": [0.8, 0.8, 0.8]
},
"50": {
"position": [0, 0.2, 0],
"scale": [1, 1, 1]
},
"100": {
"position": [3, 0, 0],
"scale": [0.8, 0.8, 0.8]
}
},
"cylinder": {
"0": {
"position": [-3, 0, -2],
"rotation": [0, 0, 0]
},
"50": {
"rotation": [0, 0, -3.14]
},
"100": {
"position": [3, 0, -2],
"rotation": [0, 0, 3.14]
}
},
"plane": {
"0": {
"material.u_baseColorFactor": [0.48, 0.78, 0.64, 1]
},
"50": {
"material.u_baseColorFactor": [0.368, 0.937, 0.176, 1]
},
"100": {
"material.u_baseColorFactor": [0.176, 0.368, 0.937, 1]
}
},
"spotLight": {
"0": {
"position": [-4, 1, -4]
},
"25": {
"position": [-4.3, 0.5, -2]
},
"75": {
"position": [-3, 1.5, 2]
},
"100": {
"position": [-4, 1, 4]
}
}
},
"animation": {
"default": {
"keyframe": "cube",
"duration": 1,
"ease": "ease-in-out",
"loop": 400000,
"delay": 1,
"direction": "both"
},
"sphere": {
"keyframe": "sphere",
"duration": 1,
"ease": "ease-out",
"loop": 400000,
"delay": 1,
"direction": "both"
},
"cylinder": {
"keyframe": "cylinder",
"duration": 1,
"ease": "ease-in",
"loop": 400000,
"delay": 1,
"direction": "both"
},
"plane": {
"keyframe": "plane",
"duration": 4,
"ease": "linear",
"loop": 400000,
"delay": 1,
"direction": "both"
},
"spotLight": {
"keyframe": "spotLight",
"duration": 2,
"ease": "ease-in-out",
"loop": 400000,
"delay": 1,
"direction": "both"
}
}
}
可以参与动画的属性:
"0": {
"material.u_baseColorFactor": [0.48, 0.78, 0.64, 1]
},
"100": {
"material.u_baseColorFactor": [0.176, 0.368, 0.937, 1]
}
2.引入动画(type="keyframe")
3.模型或者节点绑定动画
注明:此案例用到的动画:(default:cube")
1. anim-keyframe:绑定动画的名字对应动画资源asset-id;
2. anim-clipmap:绑定动画数据中的名字;
3. anim-autoplay:
.第一种情况不加参数:模型自身的动画;
.第二种情况加参数:anim-autoplay对应json中的动画名,还可以指定速度;
整体代码效果(来源于:动画系统 | 微信开放文档)
Component({
properties: {
a: Number,
},
data: {
loaded: false
},
lifetimes: {},
methods: {
handleReady({detail}) {
const xrScene = this.scene = detail.value;
console.log('xr-scene', xrScene);
},
handleAssetsProgress: function({detail}) {
console.log('assets progress', detail.value);
},
handleAssetsLoaded: function({detail}) {
console.log('assets loaded', detail.value);
this.setData({loaded: true});
},
handleRaf: function({detail}) {
console.log('raf', detail.value);
}
}
})
{
"keyframe": {
"cube": {
"0": {
"position": [-3, 0, 2]
},
"50": {
"rotation": [0, 0, 0],
"scale": [1, 1, 1]
},
"100": {
"position": [3, 0, 2],
"rotation": [0, 3.14, 0],
"scale": [1.4, 1.4, 1.4]
}
},
"sphere": {
"0": {
"position": [-3, 0, 0],
"scale": [0.8, 0.8, 0.8]
},
"50": {
"position": [0, 0.2, 0],
"scale": [1, 1, 1]
},
"100": {
"position": [3, 0, 0],
"scale": [0.8, 0.8, 0.8]
}
},
"cylinder": {
"0": {
"position": [-3, 0, -2],
"rotation": [0, 0, 0]
},
"50": {
"rotation": [0, 0, -3.14]
},
"100": {
"position": [3, 0, -2],
"rotation": [0, 0, 3.14]
}
},
"plane": {
"0": {
"material.u_baseColorFactor": [0.48, 0.78, 0.64, 1]
},
"50": {
"material.u_baseColorFactor": [0.368, 0.937, 0.176, 1]
},
"100": {
"material.u_baseColorFactor": [0.176, 0.368, 0.937, 1]
}
},
"spotLight": {
"0": {
"position": [-4, 1, -4]
},
"25": {
"position": [-4.3, 0.5, -2]
},
"75": {
"position": [-3, 1.5, 2]
},
"100": {
"position": [-4, 1, 4]
}
}
},
"animation": {
"default": {
"keyframe": "cube",
"duration": 1,
"ease": "ease-in-out",
"loop": 400000,
"delay": 1,
"direction": "both"
},
"sphere": {
"keyframe": "sphere",
"duration": 1,
"ease": "ease-out",
"loop": 400000,
"delay": 1,
"direction": "both"
},
"cylinder": {
"keyframe": "cylinder",
"duration": 1,
"ease": "ease-in",
"loop": 400000,
"delay": 1,
"direction": "both"
},
"plane": {
"keyframe": "plane",
"duration": 4,
"ease": "linear",
"loop": 400000,
"delay": 1,
"direction": "both"
},
"spotLight": {
"keyframe": "spotLight",
"duration": 2,
"ease": "ease-in-out",
"loop": 400000,
"delay": 1,
"direction": "both"
}
}
}
xr-frame动画