5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

再帰関数で木を生成

Last updated at Posted at 2023-02-07
  • 友人が再帰関数がどうのいってたので再帰関数で木を作りたくなった
  • Unity内で長さ1m(ScaleYが0.5)のシリンダーに始点(pivot)を設定し、そこから終点までのベクトルを求めて再帰的に2本ずつはやしていった
  • はやした後20度程度曲げて、生える前の枝のベクトルを回転軸としてランダムな角度を与えて回転させた
  • 3Dオブジェクトのpivotが自由に移動できないので空のゲームオブジェクトを作ってどうにかした(Unityの機能でほしい・・・)
  • 以下コード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RecursiveTree : MonoBehaviour
{
    [SerializeField]
    GameObject mBranch;

    // Start is called before the first frame update
    void Start()
    {
        CreateRecursiveTree(9, transform);
    }

    /// <summary>
    /// 再帰関数で木を生成するプログラム
    /// </summary>
    /// <param name="n">nには分岐したい回数を入れる</param>
    /// <param name="trans">transには原点のTransformを入れる</param>
    void CreateRecursiveTree(int n, Transform trans)
    {
        for (int i = 0; i < 2; i++)
        {
            GameObject obj = Instantiate(mBranch, trans.position + trans.up * trans.localScale.x, trans.rotation);
            //まず生成した枝を傾ける
            obj.transform.Rotate(0, 0, -20, Space.World);
            //生えてきた元の枝に沿ってランダムに回転
            obj.transform.rotation = Quaternion.AngleAxis(Random.RandomRange(10f + 180f * i, 170f + 180f * i), trans.up) * obj.transform.rotation;
            //生成した枝の大きさ調整
            obj.transform.localScale *= 0.6f;
            if (n > 0)
            {
                //再帰
                CreateRecursiveTree(n - 1, obj.transform);
            }
        }
    }
}

  • 結果:
    再帰関数ツリー.png
  • ちゃんと木っぽくてすごい
  • でも乱数によってはバランスの悪い木になるので要改良
  • 自然って案外規則的・アルゴリズム的にできてるのかもしれない
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?