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)
我将如何在反应三纤维中做到这一点?有什么明显的我失踪了吗?谢谢。
我玩了一下,但找不到一个干净的解决方案。这就是为什么我制作了自己的钩子,其构建方式与 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)
归档时间: |
|
查看次数: |
3357 次 |
最近记录: |