Three.js动态实现GLTF模型子对象平滑透明过渡的问题
Three.js动态实现GLTF模型子对象平滑透明过渡的问题
嘿,我来帮你排查下这个TWEEN动画没生效的问题~
你遇到的情况其实是Three.js结合TWEEN库时很常见的新手坑,主要有几个关键点没注意到:
- TWEEN动画需要在渲染循环里更新:TWEEN库本身不会自动跟着Three.js的渲染帧走,你必须在每一帧的渲染函数里调用
TWEEN.update(),不然动画根本不会启动。 - 材质更新需要通知Three.js:克隆材质后,手动设置
needsUpdate: true,确保Three.js识别到材质属性的变化,不然可能不会实时渲染透明度的变化。 - 动画目标的引用要准确:虽然你已经把
child.material替换成了克隆的新材质,但直接用newMaterial作为TWEEN的目标会更稳妥,避免潜在的引用问题。
下面是修改后的完整代码片段:
loadedObject.traverse((child) => { if (child.material) { console.log('Alpha', child.name); if (child.name === 'Crossbars') { let newMaterial = child.material.clone(); newMaterial.transparent = true; newMaterial.needsUpdate = true; // 通知Three.js材质已更新 child.material = newMaterial; // 对新材质执行平滑透明度动画 new TWEEN.Tween(newMaterial) .to({ opacity: 0.1 }, 50000) .start(); } } });
另外,一定要记得在你的渲染循环中添加TWEEN的更新逻辑,比如:
function animate() { requestAnimationFrame(animate); TWEEN.update(); // 这行必须加,驱动TWEEN动画 renderer.render(scene, camera); } animate();
这样调整后,你的Crossbars子对象应该就能平滑过渡到0.1的透明度了~
备注:内容来源于stack exchange,提问作者Bob Haslett
相关产品推荐
相关产品推荐

