javascript - 如何以随机间隔在 three.js 中循环播放 GLTF 动画?
问题描述
我正在尝试使用 Three.js 创建游戏,我想问是否有办法为 GLFT 模型设置动画,但我不想使用动画循环,而是使用随机间隔。就我而言,游戏是关于照顾青蛙的(但我很酷,所以我拼写为 phrogs),作为一个空闲动画,我希望青蛙随机发出叫声。在进一步的开发中,我还想为运动、进食等添加随机播放动画,但现在我只需要呱呱叫的动画。这是加载模型并为其设置动画的代码:
const basePhrog = new GLTFLoader()
var obj
basePhrog.load('assets/models/Phrogs/base phrog/phrog.gltf', function (gltf) {
mixer = new THREE.AnimationMixer(gltf.scene)
obj = gltf.scene
var action = mixer.clipAction(gltf.animations[0])
scene.add(gltf.scene)
action.play()
})
我的动画循环如下所示:
function animate () {
requestAnimationFrame(animate)
var delta = clock.getDelta()
if (mixer) mixer.update(delta)
renderer.render(scene, camera)
}
animate()
我希望你能帮助并感谢你的任何建议!
解决方案
glTF 文件提供一个动画(或 Three.js 术语中的 THREE.AnimationClip),该剪辑的播放由THREE.AnimationAction实例管理。您示例中的代码将立即开始播放该动画,并永远循环播放,但 AnimationAction 不必以这种方式使用。
相反,您可以等待并以随机间隔播放动作:
var action = mixer.clipAction( animation );
action.loop = THREE.LoopOnce;
// Play animation randomly every 1-10s.
setInterval(() => {
action
.reset()
.play();
}, Math.random() * 9000 + 1000);
无论动画是否在任何给定时间播放,您都可以像现在一样继续更新 AnimationMixer。
如果您稍后尝试在同一个对象上播放多个动画,一些用于在两个动画之间转换的 API 可能会有所帮助,请参阅动画/蒙皮/变形示例。
推荐阅读
- csom - SharePoint 2019 CSOM 不保存 FieldUserValue
- java - 在微调器中选择项目时未调用“setOnItemSelectedListener()”
- php - 一个下拉菜单取决于 codeigniter 中的两个下拉菜单
- linux - 在多字符分隔符中时无法识别管道
- c# - MySql DB 和 EF Core 中的条件唯一性
- python - 如何使用 boto3 在 Windows EC2 实例中 RDP 和运行命令?
- javascript - Unity3D网页连接
- javascript - 如何解决对函数参数属性的分配
- html - 有没有办法在表单中提供颜色选项,并且这种颜色也被发送到数据库?
- javascript - i18next 在 React 应用程序上翻译多语言