You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React Three Fiber中缩放后的GLB模型添加拖尾效果时出现位置偏移的问题求助

React Three Fiber中缩放后的GLB模型添加拖尾效果时出现位置偏移的问题求助

我现在在给小叮当(Tinkerbell)的GLB模型加拖尾效果,已经把逻辑拆成了四个组件:

  • SimpleTrail.jsx:负责渲染指定目标ref的拖尾(功能正常)
  • Tinkerbell.jsx:展示小叮当模型并处理翅膀扇动动画(功能正常)
  • TinkerbellUI.jsx:控制小叮当在页面中的整体动画(功能正常)
  • TrailTarget.jsx:创建拖尾效果的目标ref(这里出问题了)

核心问题是:拖尾和屏幕上移动的小叮当之间有巨大的偏移——虽然拖尾确实在跟着她,但位置差得特别远。我猜测是因为我把小叮当的模型缩放了很多,拖尾显示的位置是原尺寸小叮当应该在的地方,而不是缩放后的迷你版小叮当的实际位置。

相关代码片段

1. TinkerbellUI.jsx(缩放小叮当的位置)

这是我对小叮当模型进行缩放的代码部分:

return (
  <group ref={tinkerRef} {...props}>
    <group name="trailAnchor">
      <Tinkerbell ref={trailAnchorRef} scale={0.002} />
    </group>
  </group>
);

2. Experience.jsx(调用TinkerbellUI的父组件)

{/* CONTACT */}
<group 
  position-x={isMobile ? 3.75 * SECTION_DISTANCE : 0} 
  position-z={isMobile ? -4 : 4 * SECTION_DISTANCE} 
  rotation-y={Math.PI / 5} 
  name="contact"
>
  <Cursor tinkerRef={tinkerbellRef}></Cursor>
  <SectionTitle position-x={0.4}>CONTACT</SectionTitle>
  <TinkerbellController 
    ref={tinkerbellRef} 
    position-z={-12} 
    position-y={1} 
    position-x={isMobile ? 10 : 0}
    rotation-y={Math.PI / 15} 
    rotation-x={Math.PI / 9} 
    rotation-z={-Math.PI / 25}
  ></TinkerbellController>
</group>

3. 获取小叮当位置的逻辑(拖尾跟踪部分)

// 动画用的引用
const target = useRef();
const tmpVec = new THREE.Vector3();

useFrame((_, delta) => {
  console.log(
    "Following world pos of:",
    tinkerRef.current.name,
    tinkerRef.current.position
  );
  if (tinkerRef.current && target.current) {
    // 获取小叮当的世界坐标
    tinkerRef.current.updateMatrixWorld(true);
    tinkerRef.current.getWorldPosition(tmpVec);
    // 我尝试过手动调整偏移,但没找到通用的合适值
    // tmpVec.x += 3.5;
    // tmpVec.y += 1;
    // tmpVec.z += 3.5;
    // 平滑 lerp 拖尾到目标位置
    target.current.position.lerp(tmpVec, delta * 12);
  }
});

我尝试过的解决方法

  • 给小叮当套了一个名为trailAnchor的group,把拖尾的目标ref绑到这个group上,想绕开缩放的影响,但没成功
  • 手动调整tmpVec的x/y/z值来修正偏移,但因为不同场景下小叮当的位置会变化,这种硬编码的方式不通用

现在想请教:有没有什么可靠的方法能让拖尾准确跟着缩放后的小叮当的实际位置?或者有没有更好的方案来实现这个拖尾跟随的需求?

内容来源于stack exchange

火山引擎 最新活动