using UnityEngine; using System.Collections; using ProceduralToolkit; using UnityEngine.UI; using System.Collections.Generic; using System.IO; public class ArgosFibonacci : MonoBehaviour { public float m_fRadius = 1.5f; public ArgosMeshDraft_Fibonacci aMF_Base = new ArgosMeshDraft_Fibonacci(); public ArgosMeshDraft_Fibonacci aMF_Full = new ArgosMeshDraft_Fibonacci(); StreamWriter sWrite; public GameObject vert_Prefab; public class GO_Tracker { public GameObject go; public FibVert fV_FuncVert; } public List<GO_Tracker> lstFIB_GO = new List<GO_Tracker>(); void Start () { sWrite = new StreamWriter("Argos_Fib_Voronoi.txt"); Quaternion q; Vector3 vN_In; sphere_fibonacci_build_cartesian(2500); for (int i = 0; i < aMF_Base.funcVerts.Count; i++) { vN_In = aMF_Base.funcVerts[i].vPos.normalized; q = Quaternion.LookRotation(vN_In); int lev0, lev1, lev2, lev3; GameObject gO; GO_Tracker gT; gO = (GameObject)Instantiate(vert_Prefab, aMF_Base.funcVerts[i].vPos, q); gT = new GO_Tracker(); gT.fV_FuncVert = new FibVert(); gT.go = gO; gT.fV_FuncVert.vPos = aMF_Base.funcVerts[i].vPos; lstFIB_GO.Add(gT); lstFIB_GO[lstFIB_GO.Count - 1].go.GetComponentInChildren<Text>().text = i.ToString(); } foreach (GO_Tracker gActedUpon in lstFIB_GO) { gActedUpon.go.transform.position = gActedUpon.fV_FuncVert.vPos; } } void sphere_fibonacci_build_cartesian(int num) { float fSeam = 0.5f; float offset = 2.0f / num; float increment = Mathf.PI * (3 - Mathf.Sqrt(5.0f)); for (int i = 0; i < num; i++) { float y = (i * offset) - 1 + (offset / 2.0f); float r = Mathf.Sqrt(1 - Mathf.Pow(y, 2)); float phi = ((i + fSeam) % num) * increment; float x = Mathf.Cos(phi) * r; float z = Mathf.Sin(phi) * r; FibVert fV = new FibVert(); fV.vPos = new Vector3(x, y, z); fV.vPos *= m_fRadius; fV.idx = i; aMF_Base.funcVerts.Add(fV); } } void Update () { } }
using UnityEngine; using System; using System.Collections; using ProceduralToolkit; using System.Collections.Generic; namespace ProceduralToolkit { public class FibVert { public Vector3 vPos; public float dist; public Vector3 vForce; //constrain position to sphere radius public Vector3 vVel; public float maxDistToNeighbor = 0; public float minDistToNeighbor = float.MaxValue; public int idx; public class NB { public FibVert fV; public float distFrom; public NB() { fV = null; distFrom = float.MaxValue; } } public List<NB> avNeigbor = new List<NB>(); public FibVert() { for (int i = 0; i < 6; i++) { avNeigbor.Add(new NB()); avNeigbor[i].fV = this; } vPos = new Vector3(); } public float getMaxDistToNeighbor() { maxDistToNeighbor = 0; for (int i = 0; i < 6; i++) { if (avNeigbor[i].distFrom > maxDistToNeighbor) { maxDistToNeighbor = avNeigbor[i].distFrom; } } return maxDistToNeighbor; } public float getMinDistToNeighbor() { minDistToNeighbor = float.MaxValue; for (int i = 0; i < 6; i++) { if (avNeigbor[i].distFrom < minDistToNeighbor) { minDistToNeighbor = avNeigbor[i].distFrom; } } return minDistToNeighbor; } public bool isAVinNeighborList(FibVert fV) { for (int i = 0; i < 6; i++) { if (avNeigbor[i].fV == fV) return true; } return false; } public int isLessThan(float dist) { for (int i = 0; i < 6; i++) { if (dist < avNeigbor[i].distFrom) return i; } return -1; } public bool goesHere(int i, float dist, FibVert aV_Contender) { if (dist < avNeigbor[i].distFrom) { NB nb = new NB(); nb.fV = aV_Contender; nb.distFrom = dist; avNeigbor.Insert(i, nb); avNeigbor.RemoveAt(6); return true; } return false; } public void insNeighbor_One_Shot(float dist, FibVert aV_Contender) { for (int i = 0; i < 6; i++) { if (goesHere(i, dist, aV_Contender)) return; } } } public class ArgosMeshDraft_Fibonacci : MeshDraft { public List<Vector3> vTriCenter = new List<Vector3>(); public List<int> vQual = new List<int>(); public List<FibVert> funcVerts = new List<FibVert>(); public ArgosMeshDraft_Fibonacci() : base() { } public void Add_ITN_Node(MeshDraft tri, int sector, int nodePath, int ITG_idx) { Vector3 vC = (tri.vertices[0] + tri.vertices[1] + tri.vertices[2]) / 3f; FibVert fV = new FibVert(); fV.vPos = vC; fV.idx = ITG_idx; funcVerts.Add(fV); } public void SetSortDist(Vector3 Apex) { foreach (FibVert fV in funcVerts) { fV.dist = (fV.vPos - Apex).magnitude; } } public void sortPointCloud() { funcVerts.Sort((x, y) => x.dist.CompareTo(y.dist)); } public void AddTriQual(MeshDraft tri) { Vector3 vC = (tri.vertices[0] + tri.vertices[1] + tri.vertices[2]) / 3f; Add(tri); for (int i = 0; i < 3; i++)//Track the quality of the triangle UVs { vTriCenter.Add(vC); //vQual.Add(qual); } } public void AddHex(MeshDraft tri)//from triangle see: http://argos.vu/wp-content/uploads/2016/04/HCs-1.png { Vector3 HC = (tri.vertices[0] + tri.vertices[1] + tri.vertices[2]) / 3f; Vector3 H0 = (tri.vertices[1] + tri.vertices[0]) / 2f; Vector3 H1 = (tri.vertices[1] + HC) / 2f; Vector3 H2 = (tri.vertices[2] + tri.vertices[1]) / 2f; Vector3 H3 = (tri.vertices[2] + HC) / 2f; Vector3 H4 = (tri.vertices[0] + tri.vertices[2]) / 2f; Vector3 H5 = (tri.vertices[0] + HC) / 2f; List<Vector3> vL = new List<Vector3>(8) { HC, H0, H1, H2, H3, H4, H5, H0 }; List<Vector2> uvMapL = new List<Vector2>(8) { new Vector2(0.5f, 0.5f), new Vector2(0.5f, 1f), new Vector2(1, 0.75f), new Vector2(1, 0.25f), new Vector2(0.5f, 0), new Vector2(0, 0.25f), new Vector2(0, 0.75f), new Vector2(0.5f, 1f) }; Add(HexFan(vL, uvMapL)); } public void AddTriQual(MeshDraft tri, int qual) { Vector3 vC = (tri.vertices[0] + tri.vertices[1] + tri.vertices[2]) / 3f; Add(tri); for (int i = 0; i < 3; i++)//Track the quality of the triangle UVs { vTriCenter.Add(vC); vQual.Add(qual); } } } }