수영을 재현하고 싶다! ~무리 알고리즘 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)
Reference
이 문제에 관하여(수영을 재현하고 싶다! ~무리 알고리즘 Boids~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/odanny/items/e0c0a00e13c2b4839cec
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
무리를 시뮬레이션하는 알고리즘으로 새 퇴비를 줄여 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)
Reference
이 문제에 관하여(수영을 재현하고 싶다! ~무리 알고리즘 Boids~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/odanny/items/e0c0a00e13c2b4839cec
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
function Rule1():
Vector3 vec = (zero vector)
foreach boid in (群れの仲間):
Vector3 dif = self.position - boid.position
vec += dif / (dif.magnitude^2)
return vec / (群れの仲間の数)
function Rule2():
Vector3 vel = (zero vector)
foreach boid in (群れの仲間):
vel += boid.velocity
vel /= (群れの仲間の数)
return vel - self.velocity
function Rule3():
Vector3 pos = (zero vector)
foreach boid in (群れの仲間):
pos += boid.position
pos /= (群れの仲間の数)
return pos - self.position
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)
Reference
이 문제에 관하여(수영을 재현하고 싶다! ~무리 알고리즘 Boids~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/odanny/items/e0c0a00e13c2b4839cec
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(수영을 재현하고 싶다! ~무리 알고리즘 Boids~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/odanny/items/e0c0a00e13c2b4839cec텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)