フィボナッチ数列と黄金比でなにかしてみる

ayumegu(プログラマー)
よろしくお願いします。

今回は数学フィボナッチ数列をちょっとやってみました。

フィボナッチ数列は
0 1 1 2 3 5 8 13 21 34
と前の二つを足した数が次の数になるものです。
自然界でもよく見られる数値らしいです。
最終的には黄金比に収束し、計算式的には
(1+√5) / 2 となります。

なににつかえるかというと、大量のものを重なりなく美しく配置したい場合なんかにもってこい!

こんなの

位置を決めるところの計算はこれだけです。

1
2
3
4
5
6
7
8
   public void SetPosition(int num, GameObject obj)
  {
      float angle = num * Mathf.PI * 2.0f * ((1f + Mathf.Sqrt(5f)) / 2f);
      Vector3 pos = Vector3.zero;
      pos.x = ((num * 0.03f) + 1) * Mathf.Cos(angle);
      pos.z = ((num * 0.03f) + 1) * Mathf.Sin(angle);
      obj.transform.localPosition = pos;
  }

あとはちょろっといじいじして・・・。
敵を倒したときのコインばらまくところなどに使えそうな美しいばらまきをやってみました。

なんだ?モデルか?シェーダーか?なんだかシュールだけれど、これで終了w ちなみにソースはこんな感じです iTweenを使用しています

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   public GameObject coin;

  void Start () {
      StartCoroutine(DropCoin());
  }

  private IEnumerator DropCoin()
  {
      yield return new WaitForSeconds(1f);
      float lobHeight = 2;
      float lobTime = .5f;
      for(int i = 0; i < 200; i++)
      {
          GameObject obj = (GameObject)Instantiate(coin);

          Vector3 pos = GetPosition(i);
          GameObject child = obj.transform.FindChild("Sphere").gameObject;
          iTween.MoveBy(child, iTween.Hash("y", lobHeight, "time", lobTime/2, "easeType", iTween.EaseType.easeOutQuad));
          iTween.MoveBy(child, iTween.Hash("y", -lobHeight, "time", lobTime/2, "delay", lobTime/2, "easeType", iTween.EaseType.easeInCubic));
          iTween.MoveTo(obj, iTween.Hash("position", pos, "time", lobTime, "easeType", iTween.EaseType.linear));

          yield return new WaitForSeconds(0.02f);
      }
  }
  
  public Vector3 GetPosition(int num)
  {
      float angle = num * Mathf.PI * 2.0f * ((1f + Mathf.Sqrt(5f)) / 2f);
      Vector3 pos = Vector3.zero;
      pos.x = ((num * 0.03f) + 1) * Mathf.Cos(angle);
      pos.z = ((num * 0.03f) + 1) * Mathf.Sin(angle);
      return pos;
  }

ちなみにコインのオブジェクトは
空オブジェクトの子にコインのsphereをおいています。
子のほうで高さのTweenを親の方で位置のTweenをしてドロップさせています。

それでは今回はここまで〜