void Create_GP(int depth) { for(int i = 0; i<20; i++) { Vector3 v0 = aMD.vertices[aMD.triangles[i*3]]; Vector3 v1 = aMD.vertices[aMD.triangles[i*3 +1]]; Vector3 v2 = aMD.vertices[aMD.triangles[i*3 + 2]]; Color col = getWhite(); subdivide(v0, v1, v2, depth, col); } } void addTriangle(Vector3 v0, Vector3 v1, Vector3 v2, Color col) { mD_Tri.Clear(); mD_Tri = MeshDraft.Triangle(v0, v1, v2); mD_Tri.Paint(col); aMD_IcosaSphere.AddTriQual(mD_Tri); } void subdivide(Vector3 v1, Vector3 v2, Vector3 v3, int depth, Color col) { Vector3 v12, v23, v31; Vector3 v12_n, v23_n, v31_n; int i; if (depth == 0) { addTriangle(v1, v2, v3, col); return; } v12 = (v1 + v2) / 2.0f; v23 = (v2 + v3) / 2.0f; v31 = (v3 + v1) / 2.0f; /* extrude midpoints to lie on unit sphere */ v12_n = v12.normalized * radius; v23_n = v23.normalized * radius; v31_n = v31.normalized * radius; /* recursively subdivide new triangles */ subdivide(v1, v12_n, v31_n, depth - 1, col); subdivide(v2, v23_n, v12_n, depth - 1, col); subdivide(v3, v31_n, v23_n, depth - 1, col); subdivide(v12_n, v23_n, v31_n, depth - 1, col); }
New Mesh Generation from IcoSphere
Subdivide as above
http://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-11-352
Instead of stamping, unroll it.
int iQuality = TriQual.UNDEFINED; float x, y; for (int i = 0; i < numVerts - 2; i += 3) { //Triangle Center Location for test vTC = tCent[tL[i]];//requires this.transform at origin - can generalize if (Vector3.Dot(vTC, transform.forward) > 0f) //mirrors directly backwards otherwise { //project onto UV Plane vTCProjection.x = Vector3.Dot(vTC, transform.right) * cosaHedra.radius / Vector3.Dot(vTC, transform.forward); vTCProjection.y = Vector3.Dot(vTC, transform.up) * cosaHedra.radius / Vector3.Dot(vTC, transform.forward); vTCProjection.z = 0f; //2D UV Plane if (vTCProjection.magnitude < m_fRadius_UV)//in range of texture { //Determine Triangle Center quality here iQuality = Find_UV_PointQuality(vTCProjection); for (int k = i; k < i + 3; k++) { vVert = vL[tL[k]]; vVProj.x = Vector3.Dot(vVert, transform.right) * cosaHedra.radius / Vector3.Dot(vVert, transform.forward); vVProj.y = Vector3.Dot(vVert, transform.up) * cosaHedra.radius / Vector3.Dot(vVert, transform.forward); vVProj.z = 0f; vVProj /= m_fRadius_UV * 2; x = 0.5f + vVProj.x; y = 0.5f + vVProj.y; if (x >= 0 && x <= 1 && y >= 0 && y <= 1)//Check if each triangle vertex is within bounds of texture { uv[k - i] = new Vector2(x, y); } else reject = true; } if (!reject && iQuality < tQual[tL[i]]) { for (int k = i; k < i + 3; k++) { uvL[tL[k]] = uv[k - i]; tQual[tL[i]] = iQuality; } } reject = false; } } } cosaHedra.writeMesh();
public void Paint_UV(float fCelHeight) { Vector3 cPos = transform.forward * cosaHedra.radius;//m_vPointingLoc ICO_ArgosDraft = cosaHedra.getArgosMeshDraft(); List<int> tL = ICO_ArgosDraft.triangles; List<Vector3> vL = ICO_ArgosDraft.vertices; List<Vector2> uvL = ICO_ArgosDraft.uv; List<int> tQual = ICO_ArgosDraft.vQual;//triangle center quality List<Vector3> tCent = ICO_ArgosDraft.vTriCenter; int numVerts = tL.Count; Vector3 vTCProjection; //Tri Center Projection Vector3 vTC; //Tri Center Location Vector3 vVProj; //Tri Vertex Projection Vector2[] uv = new Vector2[3]; bool reject = false; Vector3 vIn; Vector3 vUp; Vector3 vRight; int iQuality = TriQual.UNDEFINED; float x, y; for (int i = 0; i < numVerts - 2; i += 3) { vTC = tCent[tL[i]];//requires this.transform at origin - can generalize //project onto UV Plane vTCProjection.x = Vector3.Dot(vTC, transform.right) * cosaHedra.radius / Vector3.Dot(vTC, transform.forward); vTCProjection.y = Vector3.Dot(vTC, transform.up) * cosaHedra.radius / Vector3.Dot(vTC, transform.forward); vTCProjection.z = 0f; //2D UV Plane if (vTCProjection.magnitude < m_fRadius_UV)//in range of texture { //Determine quality here iQuality = Find_UV_PointQuality(vTCProjection); for (int k = i; k < i + 3; k++) { vUp = transform.up; vIn = vL[tL[k]].normalized; vRight = Vector3.Cross(vUp, vIn); Vector3.Normalize(vRight); vUp = Vector3.Cross(vIn, vRight); vVProj = vL[tL[k]] - m_vPointingLoc; //TODO NOT PROJ YET - push out to plane of UV - Avoid Lensing vVProj /= m_fRadius_UV * 2; x = 0.5f + Vector3.Dot(vVProj, vRight); y = 0.5f + Vector3.Dot(vVProj, vUp); if (x >= 0 && x <= 1 && y >= 0 && y <= 1)//Check if each triangle vertex is within bounds of texture { uv[k - i] = new Vector2(x, y); } else reject = true; } if (!reject) { for (int k = i; k < i + 3; k++) { uvL[tL[k]] = uv[k - i]; } } reject = false; } } cosaHedra.writeMesh(); }
Vector2[] vQualCenter = new[] { new Vector2( 0, 0), //A new Vector2( 0, 1), //B (m_fCelHt) new Vector2( Mathf.Sqrt(3f)/2f, 0.5f), //C new Vector2( Mathf.Sqrt(3f)/2f, -0.5f), //D new Vector2( 0, -1), //E new Vector2( -Mathf.Sqrt(3f)/2f, -0.5f), //F new Vector2( -Mathf.Sqrt(3f)/2f, 0.5f), //G new Vector2( 0, 2), //H new Vector2( 3f/(2f*Mathf.Sqrt(3f)), 3f/2f), //I *** new Vector2( Mathf.Sqrt(3f), 1f), //J new Vector2( 3f/Mathf.Sqrt(3f), 0), //K *** new Vector2( Mathf.Sqrt(3f), -1f), //L new Vector2( 3f/(2f*Mathf.Sqrt(3f)), -3f/2f), //M *** new Vector2( 0, -2), //N new Vector2( -3f/(2f*Mathf.Sqrt(3f)), -3f/2f), //O *** new Vector2( -Mathf.Sqrt(3f), -1f), //P new Vector2( -3f/Mathf.Sqrt(3f), 0), //Q *** new Vector2( -Mathf.Sqrt(3f), 1f), //R new Vector2( -3f/(2f*Mathf.Sqrt(3f)), 3f/2f), //S *** };