如何以随机间隔在 three.js 中循环播放 GLTF 动画?
How can I loop a GLTF animation in three.js with random intervals?
我正在尝试使用 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 可能会有所帮助,请参阅 animation / skinning / morph 示例。
我正在尝试使用 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 可能会有所帮助,请参阅 animation / skinning / morph 示例。