수영을 재현하고 싶다! ~무리 알고리즘 Boids~

수영이란?




작은 물고기들이 무리를 이루고 큰 물고기를 몰아내는 장면이 인상적인 그림책입니다. 자신도 수영이 되고 싶어서 만들었습니다. (Osaka 귀여운)

이 기사에서 설명하는 Boids라는 알고리즘은 쉽고 재미 있습니다. python3의 구현 예 (pyxel 사용)는 여기(GitHub)입니다.

Boids 개요



무리를 시뮬레이션하는 알고리즘으로 새 퇴비를 줄여 Boids라고합니다. 이 알고리즘은 세 가지 규칙만으로 무리를 표현합니다. Batman Returns (1992)의 한 장면에서는 박쥐의 무리가 진짜처럼 날고 있습니다!



룰은 이하의 3개. (2019/04/14 추가: 그림의 오류를 정정했습니다.)


규칙 1 : 분리 (Separation)
무리의 동료에게 너무 가까워져 부딪히지 않도록 한다.

규칙 2: 정렬(Alignment)
무리의 동료와 진행 방향을 맞추려고한다.

규칙 3: 조인
무리의 동료 근처에 있고 싶다. 무리의 중심 방향으로 향한다.

각 boid는 그림의 원과 같은 시야(Field Of Vision: FOV)를 가지고 있어 시야중에 있는 동료를 무리로 인식합니다. 그림은 2차원이지만 쉽게 3차원으로 확장할 수 있습니다.

의사 코드 돌아가기



각 규칙을 자세히 살펴 보겠습니다. 여기에서는 각 boid 는 위치(position)·속도(velocity)·가속도(acceleration)를 각각 3차원 벡터로 가지고 있다고 합니다.

규칙 1(분리)



동료와의 거리가 멀 때는 천천히, 너무 가까워지면 급선회해 피하도록 합니다. 이웃 친구들로부터 멀어지는 방향으로 거리에 반비례하는 크기의 벡터를 만듭니다. 모든 이웃 친구들에 대해 계산하고 그 평균을 반환합니다.
function Rule1():
    Vector3 vec = (zero vector)
    foreach boid in (群れの仲間):
        Vector3 dif = self.position - boid.position
        vec += dif / (dif.magnitude^2)
    return vec / (群れの仲間の数)

규칙 2(정렬)



전체 무리의 속도 벡터의 평균에 맞추십시오.
function Rule2():
    Vector3 vel = (zero vector)
    foreach boid in (群れの仲間):
        vel += boid.velocity
    vel /= (群れの仲間の数)
    return vel - self.velocity

규칙 3(결합)



무리의 중심으로 이동하려고합니다. 무리의 무게 중심 위치로 향하는 벡터를 반환합니다.
function Rule3():
    Vector3 pos = (zero vector)
    foreach boid in (群れの仲間):
        pos += boid.position
    pos /= (群れの仲間の数)
    return pos - self.position

각 boid 업데이트



이번에는 단순히 위치 벡터에 속도 벡터를 더하는 것만으로 구현했습니다. (위치의 갱신에 가속도도 사용하는 것이 정중합니다만, 이것으로 충분히 움직였습니다). 앞서 정의한 벡터를 계수와 함께 합쳐서 갱신합니다.
function update():
    self.acceralation = COEF_1*Rule1() + COEF_2*Rule2() + COED_3*Rule3()
    self.velocity += self.acceralation
    self.postion += self.velocity

한 걸음 앞으로



벽이나 장애물에 boid를 삽입
장애물에 좌표를 고정한 boid 를 채워 두는 것으로, 각 boid 는 장애물을 피해 움직이게 됩니다 (표현이 글로).


무리를 조종하다
수이미 같게 하기 위해서 「눈」이 되는 검은 물고기를 리더로 하여, 무리를 조작할 수 있도록 했습니다. 무리의 물고기가 리더의 속도와 좌표에 맞게 움직이도록 규칙을 조금 변경하면 됩니다.

실제로 코드로 하는 경우는 속도에 상한을 마련하거나, 열심히 각 파라미터를 조정해 자연스러운 움직임을 목표로 하고 싶습니다.

참고



wikipedia(Boids)
성냥갑 두뇌
인터랙티브 프로그래밍 - 무리(boid) 만들기
알기 쉬운 슬라이드(English)

좋은 웹페이지 즐겨찾기