「がんばれない」けど「がんばりたい」

ITエンジニアの仕事のこと。AI、機械学習、ディープラーニング。地頭力。車のこと。

Flocking System|Nature of Code

■Overview

1. Separation: Steer to avoid colliding with your neighbors.

2. Alignment: Steer in the same direction as your neighbors.

3. Cohesion: Steer towards the center of your neighbors. (stay with the group)


というように今まで1つずつ試してきた1〜3を組み合わせると、 FLocking Systemが出来る。

Separation, Alignment, Cohesion それぞれのコードは非常に良く似ているので、 その特徴・目的を再度記述して整理しておこうと思う。

[共通点]

  • その他のオブジェクト全てとの距離を比較する。
  • 距離が予め決めたしきい値よりも  小さいオブジェクトに対して処理を行う。
  • それぞれのメソッドから返却されるものはベクトル。
  • それぞれのメソッドから返却されるベクトルは  次フレームの位置や速度を決定する力(Force)として使用する。
  • 自分自身を比較しないようにする(distance > 0の条件をいれる)

[Separation]

「自分自身が対象のオブジェクトから離れる」ベクトルを持たないといけないので、生成されるベクトルの方向は対象オブジェクトから自分自身への方向になるように計算する(自分位置 - 他オブジェクト位置)。 また近ければ近いほど離れる力は大きくし、遠いほど力は小さくする。

flock_separation

[Alignment]

「他オブジェクトの速度ベクトルと自分の速度ベクトルの平均」になるのでSeparationでは「位置ベクトル」から算出していたが、Alignmentでは速度ベクトルから算出する

flock_alignment

[Cohesion]
「他オブジェクトとの位置関係からグループが形成される」。しきい値内にいる他オブジェクト群の位置ベクトルの平均を算出し(ここまではSeparationと同じ。※ただし、近い・遠いの関係はないのでSeparationで行っていた力の調整は行わない)、その平均位置ベクトルをseekするベクトルをCohesionとする。 flock_cohesion