You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Three.js中修改displacementMap的displacementScale时如何添加过渡效果

Three.js displacementScale 属性平滑过渡实现方案

你遇到的跳变问题是因为每秒直接为displacementScale赋值新随机值,要实现平滑过渡可通过逐帧插值缓动逻辑实现,无需额外依赖,修改后的完整代码如下:

const planeGeo = new THREE.PlaneBufferGeometry(10, 10, 65, 65)
const planeMaterial = new THREE.MeshStandardMaterial({
    color: 'gray',
    map: texture,
    displacementMap: clouds,
    displacementScale: 1.5,
    // 添加alpha map以消除硬边缘
    alphaMap: alpha,
    transparent: true,
    depthTest: false,
})
const planeMesh = new THREE.Mesh(planeGeo, planeMaterial)
scene.add(planeMesh)
planeMesh.rotation.x = 200

// 新增:存储位移缩放目标值、缓动系数(取值0-1,数值越小过渡越慢)
let targetDisplacementScale = planeMesh.material.displacementScale
const easeFactor = 0.08

const animateDisplacementMap = () => {
    // 仅更新目标值,不直接修改材质属性
    targetDisplacementScale = .3 + Math.floor(Math.random() * 550) * .003
    setTimeout(() => {
        animateDisplacementMap()
    }, 1000);
}
animateDisplacementMap()

const animate = () => {
    // 新增:每帧插值更新displacementScale
    planeMesh.material.displacementScale += (targetDisplacementScale - planeMesh.material.displacementScale) * easeFactor
    // 渲染
    renderer.render(scene, camera)
    window.requestAnimationFrame(animate)
}
animate()

上述实现采用指数缓动逻辑,每帧让当前值向目标值移动固定比例的差值,过渡自然且性能开销极低。如果需要自定义缓动曲线(如弹性、减速效果),也可以使用GSAP等补间动画库简化实现:

// 引入GSAP后只需修改animateDisplacementMap逻辑即可
const animateDisplacementMap = () => {
    const newScale = .3 + Math.floor(Math.random() * 550) * .003
    gsap.to(planeMesh.material, {
        displacementScale: newScale,
        duration: 0.8, // 过渡时长,单位秒
        ease: "power2.out" // 缓动曲线,可按需调整
    })
    setTimeout(() => {
        animateDisplacementMap()
    }, 1000);
}

内容的提问来源于stack exchange,提问作者SaboSuke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 02:00:03