728x90
728x90
Three.js
들어가며
- 웹 브라우저에서 3D 그래픽을 쉽게 구현할 수 있게 해주는 라이브러리인 Three.js에 대해 간단하게 정리해본다.

Three.js
개념
- 웹 브라우저에서 3D 그래픽을 쉽게 구현할 수 있도록 도와주는 JavaScript 라이브러리
- 웹에서 3D 콘텐츠를 보여주기 위해 거의 필수로 사용되는 도구
Three.js – JavaScript 3D Library
threejs.org
핵심 개념
① Scene (장면)
- 모든 3D 객체가 배치되는 무대 공간
- 나무, 빛, 카메라 등 모든 객체는 이 @scene@에 추가되어야 화면에 렌더링된다.
- 여러 객체를 그룹화하거나 배경색, 안개 효과 등을 설정할 수 있다.
const scene = new THREE.Scene();
// 배경색을 검정색으로 설정
scene.background = new THREE.Color(0x000000);
② Camera (카메라)
- 실제로 장면을 바라보는 눈 역할을 한다.
- 주로 사용하는 카메라로는 2가지가 있다.
- @PerspectiveCamera@ : 원근감 있는 일반적인 카메라 (현실과 유사)
- @OrthographicCamera@ : 평행 투영 카메라 (게임 UI나 CAD 등에서 사용)
const camera = new THREE.PerspectiveCamera(
75, // ✅ 시야각(FOV)
window.innerWidth / window.innerHeight, // ✅ 종횡비
0.1, // ✅ 가까운 클리핑 거리
1000 // ✅ 먼 클리핑 거리
);
// 카메라를 z축 방향으로 이동
camera.position.z = 5;
③ Renderer (렌더러)
- @scene@과 @camera@를 기반으로 실제 화면에 3D 그래픽을 그려주는 엔진
- 일반적으로 WebGLRenderer를 사용한다. (GPU 가속)
- DOM 요소(@<canvas>@)에 결과를 그린다.
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
// 캔버스를 페이지에 추가
document.body.appendChild(renderer.domElement);
④ Mesh (메쉬 = 형태 + 재질)
- 보이는 3D 객체 그 자체
- 2가지로 구성된다.
- Geometry : 모양 (정육면체, 구, 평면 등)
- Material : 표면 특성 (색, 반사, 투명도 등)
const geometry = new THREE.BoxGeometry(1, 1, 1); // 가로(W), 세로(H), 깊이(D)
const material = new THREE.MeshStandardMaterial({ color: 0xff0000 });
const cube = new THREE.Mesh(geometry, material);
// 장면에 추가
scene.add(cube);
⑤ Light (조명)
- 3D 공간에 빛을 추가하여 재질과 그림자가 자연스럽게 보이게 해준다.
- 주로 사용되는 조명의 종류는 다음과 같다.
- @AmbientLight@ : 전체 공간에 퍼지는 부드러운 빛
- @PointLight@ : 특정 위치에서 퍼지는 빛 (예: 전구의 빛)
- @DirectionalLight@ : 태양빛처럼 한 방향에서 비추는 빛
- @SpotLight@ : 특정 각도로 비추는 스포트라이트
const light = new THREE.DirectionalLight(0xffffff, 1); // 흰색, 밝기 1
light.position.set(5, 10, 7);
// 장면에 추가
scene.add(light);
⑥ Controls (조작 컨트롤)
- 마우스나 터치로 카메라를 움직일 수 있게 해주는 유틸리티
- 대표적인 도구
- @OrbitControls@ : 마우스로 회전/줌/이동
- @FlyControls@ : 비행 시점
- @FirstPersonControls@ : 1인칭 시점
- 해당 기능을 사용하려면 별도로 @import@를 해주어야 한다.
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
const controls = new OrbitControls(camera, renderer.domElement);
// 부드러운 회전 기능 설정
controls.enableDamping = true;
주요 기능
- 박스, 구, 원기둥, 평면, 텍스처 등 다양한 3D 객체 표현
- Ambient, Point, Directional, Spot 등의 조명 효과 표현
- 그림자와 반사 표현
- 마우스/키보드로 조작 가능
- @.obj@, @.gltf@, @.fbx@ 등 다양한 3D 파일 불러오기
- 블러, 그림자, 반사 등 고급 효과 표현 (포스트 프로세싱)
사용되는 분야
- 게임, 메타버스
- 3D 제품 뷰어 (전자상거래)
- 건축/인테리어 시뮬레이션
- 데이터 시각화
- 인터랙티브 아트
공식 문서
three.js docs
threejs.org
사용 예제
import * as THREE from 'three';
// 1. Scene 생성
const scene = new THREE.Scene();
// 2. Camera 생성
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;
// 3. Renderer 생성
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// 4. Mesh (도형 + 재질) 만들기
const geometry = new THREE.BoxGeometry(); // 정육면체
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); // 초록색 재질
const cube = new THREE.Mesh(geometry, material);
scene.add(cube); // 씬에 추가
// 5. 애니메이션 루프
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01; // 회전
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
리액트(React)에서 Three.js 사용하기
- 리액트(React)에서 Three.js를 사용하는 방법은 다음과 같이 2가지 방법이 있다.
방법 ① : Three.js 직접 사용하기
- 리액트 프로젝트 안에서 DOM이 준비된 후, Three.js를 수동으로 초기화하는 방법이다.
- @useRef@로 @<div>@ 요소를 가져온 후, 해당 요소에 WebGL 캔버스를 삽입한다.
사용 예제 코드
import { useRef, useEffect } from 'react';
import * as THREE from 'three';
const MyThreeScene = () => {
const mountRef = useRef(null);
useEffect(() => {
// (1) 기본 설정
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
mountRef.current.clientWidth / mountRef.current.clientHeight,
0.1,
1000
);
camera.position.z = 5;
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(mountRef.current.clientWidth, mountRef.current.clientHeight);
mountRef.current.appendChild(renderer.domElement);
// (2) 오브젝트 생성
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(3, 3, 3);
scene.add(light);
// (3) 애니메이션
const animate = () => {
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
requestAnimationFrame(animate);
};
animate();
// (4) 클린업
return () => {
mountRef.current.removeChild(renderer.domElement);
};
}, []);
return (
<div
ref={mountRef}
style={{ width: '100%', height: '400px' }}
/>
);
};
export default MyThreeScene;
방법 ② : @react-three/fiber 라이브러리(R3F) 사용하기
- @@react-three/fiber@(R3F)는 Three.js를 리액트 방식으로 완전히 래핑한 라이브러리이다.
- 리액트에서 사용 친화적이고, 간단하게 Three.js 기능을 구현할 수 있다.
라이브러리 설치하기
$ npm install three @react-three/fiber # yarn add three @react-three/fiber
함께 사용하는 라이브러리
- 아래의 라이브러리들을 함께 사용할 수 있다.
| 라이브러리 | 설명 |
| @@react-three/drei@ | @OrbitControls@, @Text@, @Environment@ 등 자주 쓰는 유틸리티 제공 |
| @three-stdlib@ | @GLTFLoader@ 등 로더 기능을 @fiber@에서 쓰기 위한 라이브러리 |
| @@react-three/postprocessing@ | 후처리 효과 (블룸, 노이즈 등) |
| @@react-three/flex@ | - Three.js 안에서 CSS Flexbox 스타일 레이아웃 구현 가능 - 구현 가능 기능 예 : Flexbox처럼 3D 텍스트와 버튼을 정렬 |
| @@react-three/cannon@ | 물리 엔진 (Cannon.js 기반). 중력, 충돌, 힘 적용 가능 |
| @@react-three/rapier@ | - 고성능 물리 엔진 Rapier.js 바인딩 (cannon보다 빠르고 정밀함) - 구현 가능 기능 예 : 3D 캐릭터가 중력 따라 떨어지고 장애물과 부딪히는 효과 |
| @@react-three/keyboard-controls@ | 키보드 조작을 쉽게 설정할 수 있는 훅 |
| @@react-three/interactive@ | 오브젝트에 onClick, onHover 같은 인터랙션 처리 지원 |
| @leva@ | - 실시간 UI 컨트롤 패널 - 조명 밝기, 위치 등 즉석에서 값 조정 - 구현 가능 기능 예 : UI 슬라이더로 빛의 세기를 조절하면서 실시간 테스트 |
| @three/examples/jsm@ | OrbitControls, GLTFLoader, EffectComposer 등 기본 Three.js 예제 기능들 |
| @three-mesh-bvh@ | 고속 레이캐스팅 및 충돌 감지용 Bounding Volume Hierarchy(BVH) |
| @three-pathfinding@ | - 3D 공간 내 경로 탐색(NavMesh) 기능 제공 - 구현 가능 기능 예 : AI 캐릭터가 NavMesh를 따라 움직임 |
| @troika-three-text@ | - 고품질 3D 텍스트 렌더링 (TrueType 폰트 지원) - 구현 가능 기능 예 : 한글, 영어 모두 매끄럽게 표현되는 3D 텍스트 |
| @three-nebula@ | 입자 효과(파티클) 시스템 |
| @threejs-toys@ | 실험적/예술적 효과를 쉽게 적용할 수 있는 유틸 모음 |
공식 문서
Introduction - React Three Fiber
React-three-fiber is a React renderer for three.js.
r3f.docs.pmnd.rs
사용하기
사용 예제 코드
import { Canvas } from '@react-three/fiber';
const Box = () => {
return (
<mesh rotation={[0.4, 0.2, 0]}>
<boxGeometry />
<meshStandardMaterial color="orange" />
</mesh>
);
};
const MyCanvas = () => {
return (
<Canvas style={{ width: '100%', height: '400px' }}>
<ambientLight intensity={0.5} />
<directionalLight position={[3, 3, 3]} />
<Box /> // ✅
</Canvas>
);
};
export default MyCanvas;
Three.js를 처음 배우는 경우, 방법①(기본 Three.js + useEffect 방식)으로 먼저 개념을 익히고, 익숙해졌거나 프로젝트에 사용할 경우 방법②(@react-three/fiber + drei 조합)를 이용하여 개발을 진행한다.
참고 사이트
Three.js – JavaScript 3D Library
threejs.org
Introduction - React Three Fiber
React-three-fiber is a React renderer for three.js.
r3f.docs.pmnd.rs
728x90
728x90