본문 바로가기
이슈관리

Three.js R3F: P is not part of the THREE namespace! Did you forget to extend? 오류

by Forsaken Developer 2023. 4. 27.
728x90
728x90

문제 상황

react에서 Three.js를 활용해서 3D 모델을 띄우려고 했다.

Canvas가 로딩되는 동안 Progress 컴포넌트를 렌더링 하기위해 Suspense의 fallback 속성을 사용하였지만 다음과 같은 오류가 발생하였다.

⚠️R3F: P is not part of the THREE namespace! Did you forget to extend?

잘못된 코드

React Three Fiber Canvas 요소 내에 표준 HTML 태그를 추가하려고 하면 발생하는 문제였다.

React에서는 Three.js를 사용할 때 Dom을 직접 조작하지 않고 React Three Fiber를 사용한다.

React Three Fiber는 HTML 태그를 해석할 수 없고 Three.js scene을 렌더링 하기 때문에 HTML 태그를 직접 사용하면 오류가 발생되는 것으로 보인다.

const HomePage = () => {
  return (
    <StyledMain className="main">
      <Canvas>
        <Suspense
          fallback={
            <GifProgress
              width="15rem"
              src={pikachuGif}
              text="Loading..."
              fontSize="1.5rem"
            />
          }
        >
          <Model />
          <OrbitControls />
          <Environment files="/pokemon-center.hdr" background />
        </Suspense>
      </Canvas>
    </StyledMain>
  );
};

export default HomePage;

개선한 코드

const HomePage = () => {
  return (
    <StyledMain className="main">
      <Canvas>
        <Suspense
          fallback={
            <Html center>
                <GifProgress
                  width="15rem"
                  src={pikachuGif}
                  text="Loading..."
                  fontSize="1.5rem"
                />
            </Html>
          }
        >
          <Model />
          <OrbitControls />
          <Environment files="/pokemon-center.hdr" background />
        </Suspense>
      </Canvas>
    </StyledMain>
  );
};

@react-three/drei에서 Html 컴포넌트로 Progress를 wrapping 하여 해결하였다.

728x90
반응형

댓글