React에서 깊이 인식 Boids 애니메이션 만들기

스타일과 시차효과가 있는 무리 짓기

React에서 깊이 인식 Boids 애니메이션 만들기: 스타일과 시차 효과가 있는 무리 짓기

디지털 조류학자와 호기심 많은 React 개발자 여러분, 환영합니다! 🪶 오늘은 React와 Framer Motion을 활용해 깊이 인식 및 시차 속도 조절이 가능한 Boids 애니메이션을 어떻게 만들었는지 재미있고 깊이 있게 다뤄보겠습니다. 이건 평범한 <canvas> 기반 Boids가 아닙니다—이 무리는 생동감 넘치고, 터치에 반응하며, 최신 React 프로젝트에 완벽히 어울립니다.

이 글은 애니메이션을 사랑하고, 상호작용을 갈망하며, 랜딩 페이지에서 "내가 코딩할 줄 안다"는 메시지를 은근히 전하고 싶은 개발자를 위한 글입니다.


Boids란 무엇인가요?

Boids는 1986년 크레이그 레이놀즈(Craig Reynolds)가 새, 물고기, 그리고 모든 무리 움직임을 모방하기 위해 고안한 작은 시뮬레이션 생명체입니다. 그 마법은 세 가지 규칙에서 옵니다:

  1. 분리: 이웃과 너무 가까이 붙지 말 것.
  2. 정렬: 친구들이 날고 있는 방향으로 날 것.
  3. 응집: 그룹 근처에 머물 것.

결과는? 자연발생적인 생생한 떼 지어 다니는 행동이 만들어져, 전 세계 창조적 코더들의 사랑을 받았습니다.

Image boids
Image boids

왜 React로 Boids를 만들까?

전통적으로 Boids 시뮬레이션은 캔버스나 WebGL 환경에서 구동됩니다. 그러나 오늘날의 강력한 UI와 Framer Motion 같은 도구 덕분에 DOM 노드를 효율적으로 애니메이션하고, React와 손쉽게 통합하며, 상호작용과 심지어 스크롤 기반 효과까지 누릴 수 있습니다.

SEO 팁: 이 방법은 SEO와 접근성이 중요한 웹사이트 및 앱에 적합합니다—멋진 비주얼을 접근 불가능한 <canvas> 안에 숨길 필요가 없습니다!


컴포넌트 구조

무리 짓기 로직은 단일 React 컴포넌트 <FlockingAnimation />에 감쌉니다. 코드는 모듈화되어 있고 props로 커스터마이징이 가능하며 다음을 지원합니다:

  • 무리 크기 (자동 계산 또는 고정)
  • 최대 속도 및 힘
  • 규칙 가중치
  • 손쉬운 스타일링을 위한 커스텀 클래스

Props:

export type Props = {
  className?: string;
  initialCount?: number;
  maxSpeed?: number;
  maxForce?: number;
  weights?: Partial<Weights>;
};

Boid 동작: 알고리즘

각 Boid는 자신의 위치, 속도, 가속도, 그리고 무엇보다 시차 효과를 위한 깊이 정보를 가진 클래스 인스턴스입니다.

핵심 로직은 실제 무리 행동을 모방합니다:

flock(boids, weights, maxSpeed, maxForce) {
  // 1. 분리, 정렬, 응집 벡터 계산
  // 2. 가중치를 곱하고 합산
  // 3. 가속도에 적용
  // 4. 가속도는 최대 힘으로 제한
}

각 규칙은 특정 범위 내의 근처 Boids를 검사하여 조종 벡터를 계산합니다:

  • 분리: 너무 가까운 Boids로부터 멀어지기.
  • 정렬: 평균 속도로 방향 맞추기.
  • 응집: 평균 위치 쪽으로 조종하기.

깊이와 시차 효과: 감탄 포인트 더하기

각 Boid는 생성 시 무작위 깊이 값(0과 1 사이)을 받습니다. 깊이는 세 가지 효과를 발생시킵니다:

  1. 시차 속도: 멀리 있는 Boids는 느리게, 가까운 Boids는 빠르게 움직임.
  2. 크기: 전경 Boids가 더 크다.
  3. 불투명도: 깊은 Boids는 희미하고, 가까운 Boids는 선명하다.

이것은 업데이트 루프에서 처리됩니다:

const speedFactor = 1 + (1 - this.depth) * PARALLAX_FACTOR;
const dtScalar = dtBase * speedFactor;

렌더링 시 각 Boid의 크기와 불투명도는 깊이에 맞게 매핑되어 무리가 정말 3D처럼 보입니다. VR의 몰입감은 그대로, 복잡함은 뺀 셈이죠.


반응형이자 재미있게 만들기!

  • 스크롤 기반 페이드: useScroll()useTransform()을 사용해 스크롤 시 애니메이션이 점점 사라져 화면에 과도하게 남지 않게 했습니다.
  • 포인터 상호작용: 마우스나 손가락으로 드래그하면 커서 위치에 새로운 Boid가 생성됩니다. 무리의 지배자가 된 기분을 느껴보세요.
  • 무작위 무리 분포: 마운트 시 Boids 그룹이 무작위 중심에서 생성되어 자연스럽게 퍼집니다.

Boid 생성 예제:

for (let j = 0; j < groupSize; j++) {
  const ang = Math.random() * Math.PI * 2;
  const rad = Math.random() * SPAWN_RADIUS;
  boidsRef.current.push(
    new Boid(center.x + Math.cos(ang) * rad, center.y + Math.sin(ang) * rad)
  );
}

최적화와 개발 팁

  • 가시성 인식 렌더링: Intersection Observer를 사용해 컴포넌트가 보이지 않을 때 업데이트를 중단해 CPU와 배터리 소비를 줄였습니다 (모바일 사용자나 노트북 팬을 위해).
  • 효율적인 상태 업데이트: 필요할 때만 React 상태를 갱신해 렌더링을 최소화했습니다.
  • Motion Values: Framer Motion의 motionValue<motion.div>를 활용해 DOM 안에서 부드러운 변환을 구현했습니다.

전체 소스 코드

아래 링크에서 완전한 플러그인 가능 코드를 확인하세요! (Framer Motion과 Tailwind CSS 셋업은 별도로 필요합니다.)

GitHub.


결론

React에서 Boids 무리를 만드는 것은 다소 특이한 선택일 수 있지만, 최신 애니메이션 라이브러리를 사용하면 상호작용, 성능 그리고 소중한 개발자 경험까지 모두 얻을 수 있습니다.

Categories