3D 오브젝트로 동물원 구성
프로젝트 준비
모델 다운로드 및 폴더 정리
프로젝트의 public/models 경로에 3D Object asset을 넣어줌
사용할 3D 오브젝트 카테고리
- animals (동물 모델)
- dinos (공룡 모델)
- map (환경 모델)

프로젝트 구조 정리
- scr폴더에서 불필요한 asset폴더 삭제
- components 폴더 생성, 환경을 담당할 Environments.jsx 파일 생성
Environments.jsx 초기 코드
import { OrbitControls } from "@react-three/drei";
export const Environments = () => {
return (
<>
<OrbitControls />
<mesh>
<boxGeometry />
</mesh>
</>
);
};
3D 모델 불러오기
Animal 컴포넌트 생성
components
폴더에Animal.jsx
파일을 만듦useGLTF
를 사용, GLTF 포맷의 3D 모델을 불러옴
import { useGLTF } from "@react-three/drei";
export const Animal = ({ name, ...props }) => {
const { scene } = useGLTF(`/models/animals/${name}.glb`);
return <primitive {...props} object={scene}></primitive>;
};
조명 추가
Environments.jsx
에 조명을 추가하여 모델이 더 선명하게 보이도록 설정
<ambientLight intensity={4} />
<directionalLight intensity={4} position={[3, 3, 3]} />
Animal
컴포넌트 수정 (중복 렌더링 방지 해결)
SkeletonUtils.clone
을 활용, 동일한 모델 중복 생성 가능 - 모델의 복제본을 만들어 렌더링
import { useGLTF } from "@react-three/drei";
import { SkeletonUtils } from "three-stdlib";
import { useMemo } from "react";
export const Animal = ({ name, ...props }) => {
const { scene } = useGLTF(`/models/animals/${name}.glb`);
const clone = useMemo(() => SkeletonUtils.clone(scene), [scene]);
return <primitive {...props} object={clone}></primitive>;
};
Animal
컴포넌트 적용
Environments.jsx
에서Animal
컴포넌트를 불러와 사용
import { Animal } from "./Animal";
export const Environments = () => {
return (
<>
<ambientLight intensity={4} />
<directionalLight intensity={4} position={[3, 3, 3]} />
<OrbitControls />
<Animal name={"Alpaca"} />
</>
);
};
FBX 파일 불러오기
ZooMap
컴포넌트 생성
components
폴더에ZooMap.jsx
파일을 만들고,useFBX
를 사용하여 FBX 파일을 불러옴
import { useFBX } from "@react-three/drei";
export const ZooMap = () => {
const fbx = useFBX(`/models/map/zoo.FBX`);
return <primitive object={fbx}></primitive>;
};
Environments
에 ZooMap
추가
import { ZooMap } from "./ZooMap";
export const Environments = () => {
return (
<>
<gridHelper args={[10, 10]} />
<ambientLight intensity={4} />
<directionalLight intensity={4} position={[3, 3, 3]} />
<OrbitControls />
<ZooMap />
</>
);
};
공룡 모델 추가하기
Dino.jsx
컴포넌트 생성
components
폴더에Dino.jsx
파일을 만들고,Animal
컴포넌트를 참고하여 공룡 모델을 불러옴
import { useGLTF } from "@react-three/drei";
import { SkeletonUtils } from "three-stdlib";
import { useMemo } from "react";
export const Dino = ({ name, ...props }) => {
const { scene } = useGLTF(`/models/dinos/${name}.glb`);
const clone = useMemo(() => SkeletonUtils.clone(scene), [scene]);
return <primitive {...props} object={clone}></primitive>;
};
Environments
에서 공룡 추가
- 기존의
ZooMap
을 주석 처리하고,Dino
컴포넌트를 추가하여 공룡 배치
import { Dino } from "./Dino";
export const Environments = () => {
return (
<>
<gridHelper args={[10, 10]} />
<ambientLight intensity={4} />
<directionalLight intensity={4} position={[3, 3, 3]} />
<OrbitControls />
{/* <ZooMap /> */}
<Dino name={"TRex"} />
<Dino name={"Triceratops"} position={[10, 0, 0]} />
</>
);
};
'React > ReactThreeFiber' 카테고리의 다른 글
물리 엔진 추가하기 (0) | 2025.03.14 |
---|---|
오브젝트 위치 조정 및 애니메이션 적용 (0) | 2025.03.14 |
useContext (0) | 2025.03.14 |
useEffect & useRef (2) | 2025.03.14 |
React로 사고하기 (1) | 2025.03.13 |