Vector in Boid

#math #vector #geometry #school #2025-09-09

탐구 주제

실제 새 무리의 움직임을 시뮬레이션 하는 Boid에서 사용되는 벡터

개념

내용

영화나 게임 등의 컴퓨터 매체에서 실제와 같은 새 무리의 움직임을 보여주고 싶을 때가 있을 수 있다. 이럴 때는 실제 새를 애니메이션으로 만드는 것 보다는 새 무리와 비슷한 인공 생명 모델을 만들어서 사용할 수 있다.

이를 위해 이용하는 것이 바로 Boid이다. Boid는 1986년에 크레이그 레이놀즈에 의해 개발된 인공 생명으로, 새 무리의 군집 행동을 시뮬레이션 하기 위해 만들어졌다.

Boid의 각 개체는 두가지 구성 요소 즉, 위치 벡터와 방향 벡터를 가진다. Boid는 각 프레임마다 위치벡터의 방향으로 이동하는데, 위치 벡터에 방향 벡터의 단위 벡터에 일정한 속도를 곱해서 더하는 방식으로 이루어 진다.

\[ \vec{b_0'} = \vec{b_0} + \hat{\vec{v_0}}\cdot\mathbf{s} \]

Boid는 세 가지 규칙 하에 움직인다. 분리separation, 정렬alignment, 응집cohesion 이 세 규칙으로 방향 벡터를 매 프레임마다 수정하여 새의 무리와 같은 움직임을 생성한다.

  1. 분리 Separation

일정 반경 이내에 있는 다른 개체들과의 거리가 너무 가까우면, 그 개체에서 멀어지기 위해서 방향 벡터를 조향한다.

현재 개체의 위치 벡터를 \(\vec{b_0}\), 방향 벡터를 \(\vec{v_0}\)이라고 하고, 가까운 개체의 위치 벡터를 \(\vec{b_1}\), 방향 벡터를 \(\vec{v_1}\)이라고 한다. 분리의 강도를 \(\mathbf{S}\)라 하면 다음과 같이 현재 개체의 방향 벡터를 조향할 수 있다.

\[ \begin{align} &\vec{v} = \vec{v_0} + (\vec{b_0}-\vec{b_1})\cdot \mathbf{S}\\ &\vec{v_0'} = \hat{\vec{v}} \end{align} \]

  1. 정렬 alignment

주변의 개체들과 일치/정렬되는 방향 벡터를 가지기 위해 평균 방향으로 조향한다.

현재 개체의 방향 벡터를 \(\vec{v_0}\)이라고 하고, 가까운 개체들의 방향 벡터를 \(\vec{v_n}\)이라고 한다. 분리의 강도를 \(\mathbf{A}\)라 하면 다음과 같이 현재 개체의 방향 벡터를 조향할 수 있다.

\[ \begin{align} &\vec{v} = \vec{v_0} + \frac{\displaystyle\sum_{k=1}^{n}{\vec{v_k}}}{n}\cdot \mathbf{A} \\ &\vec{v_0'} = \hat{\vec{v}} \end{align} \]

  1. 응집 cohesion

주변의 개체들과 무리를 이루기 위해, 주변 개체들의 중심으로 조향한다.

현재 개체의 위치 벡터를 \(\vec{b_0}\), 방향 벡터를 \(\vec{v_0}\)이라고 하고, 가까운 개체들의 위치 벡터를 \(\vec{b_n}\)이라고 한다. 응집의 강도를 \(\mathbf{C}\)라 하면 다음과 같이 현재 개체의 방향 벡터를 조향할 수 있다.

\[ \begin{align} &\vec{v} = \vec{v_0} + \Bigl(\frac{\sum_{k=1}^{n}{\vec{b_k}}}{n}-\vec{b_0}\Bigr)\cdot \mathbf{C} \\ &\vec{v_0'} = \hat{\vec{v}} \end{align} \]

이 과정을 통해 실제 새와 유사한 움직임을 보일 수 있는 boid의 작동 원리에 대해 탐구하였다.

자기평가

이번 탐구를 통해 위치 벡터와 방향 벡터가 비슷해 보일지 몰라도 그 활용에 차이가 있고, 방향 벡터를 잘 이용하여 가상 물체의 움직임에서의 방향과, 위치 벡터를 이용해 물체의 위치를 표현하는 실례를 분석하였고, 벡터가 단순한 두 수가 아닌 실제 세계나 모의 세계에 적용되어 시뮬레이션 될 수 있다는 점을 이해하였다. 이제 boid를 이용해 실제 코드를 작성하고, 해당 내용으로 더욱 탐구 해보고 싶다.