【问题标题】:Animated textures with react-three-fibre使用 react-three-fiber 的动画纹理
【发布时间】:2020-07-16 17:43:36
【问题描述】:

我正在使用包three-plain-animator 来在我的网格中显示动画纹理。我使用的是 react-three-fiber 而不是普通的three.js,由于某种原因,它会加载纹理但不会对其进行动画处理。这是我的Sandbox 来说明我的意思。我什至尝试不使用useLoader,并完全复制了文档中提供的示例:

const texturePath = 'https://i.imgur.com/Oj6RJV9.png';
const animator = new PlainAnimator(new THREE.TextureLoader().load(texturePath), 4, 4, 10, 10);
const texture = animator.init();

这个包只适用于普通的three.js吗?还是我错过了什么?

【问题讨论】:

    标签: reactjs three.js react-three-fiber


    【解决方案1】:

    编辑:

    所以@hpalu 好心地指出,我之前的回答并不是最好的,因为它会导致同时呈现多个循环,当我尝试创建悬停事件时,here 可视化了。

    这里是 @hpalu 的工作 sandbox 更新代码,它利用 useFrame 允许组件参与渲染函数,该函数被调用 60 次/秒。

    如您所见here,鼠标事件在这段代码中运行良好,没有任何复杂性

    原答案:

    好的,请查看文档中提供的example。看起来我在动画函数中错过了animator.animate()。所以我不得不在我的精灵函数导出中包含这个函数:

      const animate = () => {
        animator.animate();
        requestAnimationFrame(animate);
      };
    

    然后在返回部分我调用了 animate 函数:

      return (
        <>
          <mesh/>
          </mesh>
          {animate()}
        </>
      )
    

    这是我更新的沙盒:link

    【讨论】:

    • 这可能是“危险的”,因为您将副作用放入渲染函数中。例如,另一个渲染和动画循环将运行两次。这就是 useFrame 的用武之地,它允许组件参与渲染函数,该函数被调用 60 次/秒:codesandbox.io/s/affectionate-colden-8juy5 ps。还有spectrum.chat/react-three-fiber - 通常你会很快得到帮助
    • @hpalu 是的,你是绝对正确的,正如我在使用 useEffect 添加事件时很快意识到的那样,它会多次渲染循环,然后像疯了一样做出反应。非常感谢您的帮助,我将更改我的答案。但是,我确实有一个问题,我意识到你放了useFrame(() =&gt; animator.animate()),但我似乎找不到它正在调用的动画函数,所以我不明白它是如何工作的。我想它可能是 react-three-fiber 的一部分,但我查看了文档,但似乎找不到它。抱歉,这似乎是一个显而易见的问题。
    • r3f 也在循环中运行,useFrame 订阅了它的组件。所以基本上它在 r3f 的内部 raf 循环中执行函数。和所有其他订阅者。这使得使用依赖循环的插件(控件、动画等)变得很容易,而且效率也很高,因为有多个 requestanimationframe-loop 会对性能产生负面影响。您还可以将 useFrame 用于基于帧的动画,例如:codesandbox.io/s/r3f-contact-shadow-3iv32
    猜你喜欢
    • 2020-08-13
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2020-12-04
    • 2022-11-30
    • 2020-10-31
    • 2021-11-12
    • 2021-12-23
    相关资源
    最近更新 更多