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

基于Three.js+GSAP+React的3D手机轮播开发问题咨询

3D手机轮播组件问题解决方案

1. 解决「所有手机渲染同一视频且倒置」问题

  • 视频重复问题:循环渲染手机组件时,为每个<Phone>实例传入独立的视频源(如不同的videoUrl或独立的videoRef),避免共用同一个纹理对象。例如在父组件中遍历视频列表,给每个手机组件分配专属的视频资源:
    {videoList.map((url, index) => (
      <Phone key={index} videoUrl={url} index={index} />
    ))}
    
  • 视频倒置问题:Three.js视频纹理默认Y轴翻转,在创建纹理后直接设置texture.flipY = false即可修正。如果使用react-three/fiber的useVideoTexture钩子,可在纹理初始化后立即修改该属性:
    const texture = useVideoTexture(videoRef.current);
    texture.flipY = false;
    

2. 实现活跃幻灯片的手机缩放突出效果

  • 父组件维护currentIndex状态,标记当前活跃的幻灯片索引,每个<Phone>组件接收isActive(判断index === currentIndex)和自身index属性。
  • 利用GSAP监听isActive状态变化,触发缩放动画:
    const meshRef = useRef();
    useEffect(() => {
      if (isActive) {
        gsap.to(meshRef.current.scale, { x: 1.2, y: 1.2, z: 1.2, duration: 0.5, ease: "power2.out" });
      } else {
        gsap.to(meshRef.current.scale, { x: 1, y: 1, z: 1, duration: 0.5, ease: "power2.in" });
      }
    }, [isActive]);
    
  • 切换轮播时,可通过GSAP Timeline编排动画顺序:先让上一个活跃项缩回到默认尺寸,再让新活跃项放大,保证过渡流畅。

3. 解决「视频纹理覆盖整个Canvas」问题

  • 确保手机模型的屏幕部分为独立Mesh:无论是自定义模型还是外部导入模型,都要将屏幕与手机边框拆分为不同部件。自定义模型时,可分别创建边框(大尺寸Box)和屏幕(小尺寸Box嵌套在边框内)两个Mesh,仅给屏幕Mesh应用视频纹理材质,边框使用普通金属/塑料材质。
  • 检查UV映射:若使用外部模型,需确保建模时已给屏幕部分正确展开UV;若手动创建模型,可调整geometry.uvs数组并设置geometry.uvsNeedUpdate = true,保证视频纹理仅在屏幕区域显示,无拉伸或溢出。

额外注意事项

  • 视频资源加载:为每个手机创建独立的<video>元素,避免共用缓存导致的资源冲突,可使用react-three/fiber的useVideo钩子实现。
  • Canvas固定宽度:在<Canvas>组件中设置style={{ width: '800px', height: '600px' }}(根据需求调整数值),同时更新相机的aspect属性为width/height,保证渲染适配固定尺寸。
  • 轮播位置控制:根据手机索引计算X轴位置,让活跃项居中,左右项依次排列,切换时配合GSAP做位移动画,实现完整轮播逻辑。

内容的提问来源于stack exchange,提问作者The Old County

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:50:00