@react-三/纤维:如何为阴影相机创建助手?

And*_*ung 6 three.js react-three-fiber

所以我习惯这样设置助手:

useHelper(sLightRef, THREE.SpotLightHelper);

return <spotLight
        castShadow
        ref={sLightRef}
        position={[0, 2, 2]}
        args={["#fff", 0.4, 10, Math.PI * 0.3]}
        ></spotLight>
Run Code Online (Sandbox Code Playgroud)

这将在 SpotLight 对象上创建一个助手。

我不明白的是如何在 SpotLight 的阴影相机上创建一个。(spotlight.shadow.camera) 我们无法为其分配 ref(),因为它不在我的 return 语句中。它是在 SpotLight 组件内部创建的。

在普通的 Three.js 中,这很简单:

const helper = new THREE.CameraHelper(spotlight.shadow.camera);
scene.add(helper);
Run Code Online (Sandbox Code Playgroud)

我将如何在反应三纤维中做到这一点?有什么明显的我失踪了吗?谢谢。

Rol*_*ten 7

我玩了一下,但找不到一个干净的解决方案。这就是为什么我制作了自己的钩子,其构建方式与 useHelper 钩子类似。

// Components==============
import { useFrame, useThree } from '@react-three/fiber';
import React, { useRef } from 'react';
import { CameraHelper, Light } from 'three';
// =========================

export default function useShadowHelper(
  ref: React.MutableRefObject<Light | undefined>
) {
  const helper = useRef<CameraHelper>();
  const scene = useThree((state) => state.scene);

  React.useEffect(() => {
    if (!ref.current) return;

    helper.current = new CameraHelper(ref.current?.shadow.camera);
    if (helper.current) {
      scene.add(helper.current);
    }

    return () => {
      if (helper.current) {
        scene.remove(helper.current);
      }
    };
  }, [helper.current?.uuid, ref.current]);

  useFrame(() => {
    if (helper.current?.update) {
      helper.current.update();
    }
  });
}
Run Code Online (Sandbox Code Playgroud)