private void saveTriangleIndexToFile(string fileName) { float[] shoulderL = planes.getControlPlane("shoulderLeft"); float[] shoulderR = planes.getControlPlane("shoulderRight"); //float[] back = planes.getControlPlane ("back"); int[] tri = clothMesh.triangles; //Vector3[] vertices = clothMesh.vertices; Vector3[] vertices = clothVertices; string data = ""; int index = 0; for (int i = 0; i < tri.Length; i += 3, index++) { for (int j = 0; j < 3; j++) { if (!AuxMath.isAbovePlane(vertices [tri [i + j]], shoulderL) && !AuxMath.isAbovePlane(vertices [tri [i + j]], shoulderR) ) { data += index.ToString() + " "; break; } } } FileOperator.SaveDataToFile(fileName, data); }
// 胸围 private void scaleBustGrith(float scale) { Vector3[] old = sizedMesh.vertices; Vector3[] tmp = templateMesh.vertices; Vector3[] tmpLen = templateLenMesh.vertices; ArrayList vertex = templateBody.vertexIndexsPerBone [HumanBone.Spine2]; float[] top = planes.getControlPlane("PlaneBustTop"); float[] topL = planes.getControlPlane("PlaneBustTopLeft"); float[] topR = planes.getControlPlane("PlaneBustTopRight"); float[] bust = planes.getControlPlane("PlaneBust"); float[] bottom = planes.getControlPlane("PlaneBustBottom"); Vector3 busthNormal = new Vector3(bust [0], bust [1], bust [2]); // Scale the left thigh for (int i = 0; i < vertex.Count; ++i) { if (AuxMath.isAbovePlane(tmp [(int)vertex [i]], top) != AuxMath.isAbovePlane(tmp [(int)vertex [i]], bottom)) { if (!AuxMath.isAbovePlane(tmp [(int)vertex [i]], topL) && !AuxMath.isAbovePlane(tmp [(int)vertex [i]], topR)) { Vector3 projectNormal = AuxMath.projectOnPlane(templateMesh.normals [(int)vertex [i]], busthNormal); float cosAngel = Vector3.Dot(projectNormal.normalized, Vector3.forward); float k = (scale - 1.0f) * cosAngel + Mathf.Sqrt((scale - 1.0f) * (scale - 1.0f) * cosAngel * cosAngel + 2 * scale - 1); old [(int)vertex [i]] = tmpLen [(int)vertex [i]] + (templateMesh.normals [(int)vertex [i]] * (k - 1.0f) * measurement [HumanSize.Bust_Grith]); } } } sizedMesh.vertices = old; }
// 臀围 private void scaleHipGrith(float scale) { Vector3[] old = sizedMesh.vertices; Vector3[] tmp = templateMesh.vertices; Vector3[] tmpLen = templateLenMesh.vertices; ArrayList vertex = templateBody.vertexIndexsPerBone [HumanBone.Pelvis]; float top = planes.getPlaneHeight("PlaneHipTop"); float[] topPlane = planes.getControlPlane("PlaneHipTop"); float hip = planes.getPlaneHeight("PlaneHip"); float bottom = planes.getPlaneHeight("PlaneHipBottom"); float height = top - bottom; float std = ControlPoints.hipBezier.getBezierPoint((hip - bottom) / height).z; for (int i = 0; i < vertex.Count; ++i) { if (!AuxMath.isAbovePlane(tmp [(int)vertex [i]], topPlane) && tmp [(int)vertex [i]].y > bottom) { float ratio = (tmp [(int)vertex [i]].y - bottom) / height; float p = (ControlPoints.hipBezier.getBezierPoint(ratio).z - std) / 5.0f + 1.0f; Vector3 projectNormal = AuxMath.projectOnPlane(templateMesh.normals [(int)vertex [i]], Vector3.up); float cosAngel = Vector3.Dot(projectNormal.normalized, Vector3.back); float k = (scale - 1.0f) * cosAngel + Mathf.Sqrt((scale - 1.0f) * (scale - 1.0f) * cosAngel * cosAngel + 2 * scale - 1); old [(int)vertex [i]] = tmpLen [(int)vertex [i]] + (templateMesh.normals [(int)vertex [i]] * (k - 1.0f) * measurement [HumanSize.Hip_Grith] * p); } } sizedMesh.vertices = old; }
// 大腿围 private void scaleThighGrith(float scale) { Vector3[] old = sizedMesh.vertices; Vector3[] tmp = templateMesh.vertices; Vector3[] tmpLen = templateLenMesh.vertices; ArrayList vertex = templateBody.vertexIndexsPerBone [HumanBone.L_Thigh]; float[] top = planes.getControlPlane("PlaneThighTopLeft"); float[] thigh = planes.getControlPlane("PlaneThigh"); float[] bottom = planes.getControlPlane("PlaneThighBottom"); Vector3 thighNormal = new Vector3(thigh [0], thigh [1], thigh [2]); // Scale the left thigh for (int i = 0; i < vertex.Count; ++i) { if (AuxMath.isAbovePlane(tmp [(int)vertex [i]], top) != AuxMath.isAbovePlane(tmp [(int)vertex [i]], bottom)) { Vector3 projectNormal = AuxMath.projectOnPlane(templateMesh.normals [(int)vertex [i]], thighNormal); float cosAngel = Vector3.Dot(projectNormal.normalized, Vector3.back); float k = (scale - 1.0f) * cosAngel + Mathf.Sqrt((scale - 1.0f) * (scale - 1.0f) * cosAngel * cosAngel + 2 * scale - 1); old [(int)vertex [i]] = tmpLen [(int)vertex [i]] + (templateMesh.normals [(int)vertex [i]] * (k - 1.0f) * measurement [HumanSize.Thigh_Grith]); } } // Scale the Right Thigh vertex = templateBody.vertexIndexsPerBone [HumanBone.R_Thigh]; top = planes.getControlPlane("PlaneThighTopRight"); for (int i = 0; i < vertex.Count; ++i) { if (AuxMath.isAbovePlane(tmp [(int)vertex [i]], top) != AuxMath.isAbovePlane(tmp [(int)vertex [i]], bottom)) { Vector3 projectNormal = AuxMath.projectOnPlane(templateMesh.normals [(int)vertex [i]], thighNormal); float cosAngel = Vector3.Dot(projectNormal.normalized, Vector3.back); float k = (scale - 1.0f) * cosAngel + Mathf.Sqrt((scale - 1.0f) * (scale - 1.0f) * cosAngel * cosAngel + 2 * scale - 1); old [(int)vertex [i]] = tmpLen [(int)vertex [i]] + (templateMesh.normals [(int)vertex [i]] * (k - 1.0f) * measurement [HumanSize.Thigh_Grith]); } } sizedMesh.vertices = old; }
private void initGrith(string planeName, HumanSize grithKey, HumanBone planeInBone) { float[] plane = { 0.0f, 0.0f, 0.0f, 0.0f }; planes.getControlPlane(planeName, plane); ArrayList grithList = new ArrayList(); ArrayList edgeList = templateBody.edgeIndexsPerBone [planeInBone]; for (int i = 0; i < edgeList.Count; i++) { Edge e = edgeList [i] as Edge; if (AuxMath.isAbovePlane(templateMesh.vertices [e.e1], plane) != AuxMath.isAbovePlane(templateMesh.vertices [e.e2], plane)) { Vector3 intersectPoint = AuxMath.intersectPlane(templateMesh.vertices [e.e1], templateMesh.vertices [e.e2], plane); if (intersectPoint != AuxMath.nullVector) { if (HumanSize.Thigh_Grith == grithKey) { if (intersectPoint.x < 0.0f) { grithList.Add(intersectPoint); } } else { grithList.Add(intersectPoint); } } } } if (grithList.Count > 0) { ArrayList grithIndex = new ArrayList(); AuxMath.convexInPlane(new Vector3(plane [0], plane [1], plane [2]), grithList, grithIndex); initMeasurements [(int)grithKey - 1] = AuxMath.getLength(grithIndex, grithList); measurement [grithKey] = initMeasurements [(int)grithKey - 1] / (2.0f * Mathf.PI); } }