Boids 알고리즘은 많겠지만 간단한 알고리즘을 써봤습니다.
youtube 영상에서 boids 시뮬레이션을 보고, gtihub 주소가 있어 확인했습니다.
https://github.com/jackaperkins/boids
내용 중 boids 알고리즘 부분은 다소 간단하게 확인할 수 있습니다.
"boids.pde" 내용으로 아래 절차를 따르고 있습니다.
1. update
1-1. collect boids
1-2. adjust parameters
1-2-1. friend ( F ) : collecting nearest boids
1-2-2. crowd ( C - Red ) : push out other boids
1-2-3. avoid ( A ) : avoid objects
1-2-4. cohes ( C - Sky ) : cohes that nearst boids
1-2-5. noise ( N ) : randomize
1-3. sum of parmeters
1-4. update shape ( color )
핵심은 아래 내용입니다.
1. 내 인접 Boid 들을 수집하고 friend 로 취급한다.
friends 의 direction ( 이전 update 의 이동 진행 방향 ) 을 더한다.
* direction 은 normal vector 입니다
* 이 값에 나와 대상의 distance ( 거리 ) 를 나누어 줍니다
이를 통해 거리가 가까울 수록 가중치가 더 큽니다.
2. Crowd 거리 내 Boid 의 위치와 나의 반대 방향 ( 멀어지는 ) 을 더한다.
이 역시 distance 에 따라 가중치를 다르게 적용합니다.
* 가까울 수록 가중치가 더 커지므로 무조건 멀어집니다
3. Avoid 대상들의 위치의 반대 방향을 더합니다 ( crowd 와 유사 )
* avoid 는 crowd 보다 우선 순위가 높으므로 가중치를 따로 더 해줍니다
4. Cohesion 대상들의 중심점 ( center of weight ) 의 위치로 가까워지는 방향을 더한다.
* distance 의 가중치가 아닌 0.05 ( 매직넘버.. ) 를 적용합니다
5. Random ( noise ) 의 적은 가중치를 더합니다.
위 Parameters 의 합을 다음 이동에 반영합니다.
주의할 점은 weight 들의 sum 으로 이동이 결정되기 때문에 각각의 요소 ( parameter ) 가 가지는
중요도를 적절하게 결정해야 하며 ( 본문에서는 magic number )
그들의 sum 을 조정하기 위해 각 요소들은 Normal Vector 를 사용한다는 점 입니다.
적용되는 환경에 따라 새로운 weight 들을 설정하고 적용하여도 재밌을 듯 싶어 흥미가 가는 내용이였습니다.
나머지 GroupId 라고 표현했지만 Shape 는 Friend Boid 의 shape 의 avg ( 평균 ) 을 적용하여 동일한 값을 갖도록 유도합니다. 이는 color ( 군집에 따라 다름 ) 을 보여주기 위한 내용입니다.
그럼 더 좋은 아이디어가 있다면 적용해보고 싶네요.
c# 으로 포팅한 github repository 를 공유하며 마무리합니다.
'알고리즘' 카테고리의 다른 글
Minkowski Sum (1) | 2024.04.26 |
---|---|
Alias method Algorithm (0) | 2023.04.27 |
피보나치 힙 (0) | 2015.12.15 |
문자열 매칭 알고리즘 (0) | 2015.12.05 |
A* Algorithm (0) | 2015.11.25 |