public override RefStructure Build(Matrix4x4 toWorld) { var s = RefStructure.CreateNew(); var stepSize = Mathf.PI * 2f / _resolution; //パーティクルを配置 var p = new RefParticle[_resolution]; for (var i = 0; i < _resolution; ++i) { var t = stepSize * i; var x = Mathf.Cos(t) * _radius; var y = Mathf.Sin(t) * _radius; p[i] = _particleBuilder.Add(s, new Vector2(x, y)); } // エッジを配置 for (var i = 0; i < _resolution; ++i) { _edgeBuilder.Add(s, p[i], p[(i + 1) % _resolution]); for (var j = 0; j < _supportIntervals.Length; ++j) { _supportEdgeBuilder.Add(s, p[i], p[(i + _supportIntervals[j]) % _resolution]); } } s.TranslateParticles(toWorld); return(s); }
public override RefStructure Build(Matrix4x4 toWorld) { _s = RefStructure.CreateNew(); var origin = _branchParticleBuilder.Add(_s, Vector2.zero, 0f); var maxDepth = _branchMaxDepth.randomInt; // 枝の作成 MakeBranch(0, maxDepth, origin, 90f * Mathf.Deg2Rad); // 支持枝の作成 var count = _s.GetParticleCount(); for (int i = 0, n = _supportEdgeInterval.Length; i < n; ++i) { var interval = _supportEdgeInterval[i]; for (int j = interval, n2 = count; j < n2; ++j) { _branchEdgeBuilder.Add(_s, j - interval, j, 0f); } } _s.TranslateParticles(toWorld); return(_s); }
public override RefStructure Build(Matrix4x4 toWorld) { var s = RefStructure.CreateNew(); var origin = s.AddParticle(Vector2.zero, _branchJointSize, RandomGradient(_leafColor), _branchJointMaterialID); /*var next = */ MakeBranch(s, _maxBranchDepth, origin, 90f, _basebranchLength); s.TranslateParticles(toWorld); return(s); }
public override RefStructure Build(Matrix4x4 toWorld) { var s = RefStructure.CreateNew(); var origin = _branchParticleBuilder.Add(s, Vector2.zero); _tempBaseBranchLength = _baseBranchLength.random; MakeBranch(s, _maxDepth.randomInt, origin, 90f, _tempBaseBranchLength); s.TranslateParticles(toWorld); return(s); }
private void Start() { if (!_structure) { _structure = RefStructure.CreateNew(); } _editHistory = new List <string>(); LinkUIInputHandlers(); // 初期状態を編集履歴に追加 AddEditHistory(); }
/// <summary> /// 特定のパーティクルの距離によるミックスを行う。多分これが一番シンプルな方法何じゃないかな? /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <param name="dist"></param> /// <param name="edgeBuilder"></param> /// <returns></returns> public static RefStructure Mix(RefStructure a, RefStructure b, float dist, BaseEdgeBuilder edgeBuilder) { Assert.IsNotNull(a); Assert.IsNotNull(b); Assert.IsNotNull(edgeBuilder); var dst = RefStructure.CreateNew(); // それぞれの構造体の中から一定の距離感にある。パーティクル同士をエッジでつなげる。 var aParticles = a.GetParticles(); var bParticles = b.GetParticles(); var pairDict = new Dictionary <RefParticle, int[]>(); for (var i = 0; i < aParticles.Length; ++i) { var t = aParticles[i]; var neighbours = FindParticles(t, dist, bParticles); pairDict.Add(t, neighbours); } // とりあえずペアを見つけ出したので、つないでみる。 // ここで注意なのがパーティクルがaとbのどちらに属しているのかということ。 // それらを意識しながら、接続関係をまとめていく。 var aCount = aParticles.Length; // 一旦すべてのパーティクルとエッジを追加する AddParticles(dst, aParticles); AddParticles(dst, bParticles); // エッジの追加にはパーティクルのUIDからIdxへのマッピング辞書が必要。 var aEdges = a.GetEdges(); var bEdges = b.GetEdges(); var uid2IdxDictA = CreateUID2IdxDictionary(aParticles); var uid2IdxDictB = CreateUID2IdxDictionary(bParticles); // Debug.Log(uid2IdxDictA.Count); AddEdges(dst, aEdges, uid2IdxDictA, 0); AddEdges(dst, bEdges, uid2IdxDictB, aCount); // ここから新しい接続用のエッジを追加していく。 foreach (var pair in pairDict) { if (pair.Value.Length == 0) { continue; } var idx = uid2IdxDictA[pair.Key.uid]; for (var i = 0; i < pair.Value.Length; ++i) { var tIdx = pair.Value[i] + aCount; // 2つのインデックスが揃ったのでエッジを作る edgeBuilder.Add(dst, idx, tIdx); } } return(dst); }