three.js

[ERROR] react + useGLTF사용시 gltf파일 load가 안될때(+CRA 환경변수 사용)

dohye1 2024. 8. 4. 16:08
반응형

에러상황

gltf 파일이 들어있는 폴더를 public폴더 하위에 두고 useGLTF 훅을 사용해 gltf파일을 로드하는 코드를 실행시키면 아래와 같은 에러가 발생한다...

const gltf = useGLTF('/cute_little_duck/scene.gltf');

에러 메시지를 읽어보면 gltf에 html코드가 들어가있다는 느낌의 메시지같은데, 실제로 내 코드의 public폴더에 들어있는 gltf파일을 보면 html이 아닌 JSON 데이터이라는것을 확인할 수 있음...

{
  "accessors": [
    {
      "bufferView": 2,
      "componentType": 5126,
      "count": 9187,
      "max": [
        0.2389347106218338,
        0.8449134826660156,
        0.2963702976703644
      ],
      "min": [
        -0.22957777976989746,
        0.12154372781515121,
        -0.5001304745674133
      ],
      "type": "VEC3"
    },
...
}

 

그럼 브라우저에서 gltf파일을 어떻게 받아오는지 보면 gltf파일이 아니라 html파일을 받아오고있다

 

해결책

process.env.PUBLIC_URL을 다운로드 경로에 추가해주면된다.

const gltf = useGLTF(process.env.PUBLIC_URL + '/cute_little_duck/scene.gltf');

 

gltf파일의 경로앞에 process.env.PUBLIC_URL을 붙여주니 gltf파일의 다운로드 경로가 달라졌다

원인

CRA로 생성한 리액트 보일러플레이트는 public폴더 사용시 주의해야할점이있다.

 

Using the Public Folder | Create React App

Note: this feature is available with react-scripts@0.5.0 and higher.

create-react-app.dev

Only files inside the public folder will be accessible by %PUBLIC_URL% prefix. 

 

public폴더에있는 자원을 사용하려면 PUBLIC_URL을 앞에 붙여서 접근해야한다!!

 

일단 모듈 시스템 외부에서 assets를 사용할때 public폴더에 추가해줄수있는데, 여기서 주의할점은 public폴더에 추가한 assets들은 웹팩으로 빌드되지않는다. 그래서 빌드폴더에 수정되지않은상태로 복사된다.