void InitVertexParam(int face_id, int vertex_id) { //if (init_ok[vertex_id]) return; if (vertexParms.ContainsKey(vertex_id)) { return; } var tangent = mesh.tangents[vertex_id]; var normal = mesh.normals[vertex_id]; var tan3 = new Vector3(tangent.x, tangent.y, tangent.z); var u1 = Vector3.Cross(tan3, normal).normalized *tangent.w; var u2 = Vector3.Cross(u1, normal).normalized; float angle1 = Vector3.Angle(u1, normal) - 90; float angle2 = Vector3.Angle(u2, normal) - 90; float angle3 = Vector3.Angle(u1, u2) - 90; Debug.Assert(angle1 <= float.Epsilon, angle1.ToString()); Debug.Assert(angle2 <= float.Epsilon, angle2.ToString()); Debug.Assert(angle3 <= float.Epsilon, angle3.ToString()); var parm = new VertexParm(vertex_id, face_id, u1, u2); vertexParms.Add(vertex_id, parm); }
void OnDrawGizmos() { if (visible_gizmo && initControlMesh && controlMesh != null) { var mesh = GetComponent <MeshFilter>().sharedMesh; var vertices = mesh.vertices; Debug.Assert(mesh.vertexCount == controlMesh.vertexParms.Count); //for (int i = 0; i < vertices.Length; i++) foreach (var vertex_param in controlMesh.vertexParms) { int vid = vertex_param.Key; VertexParm param = vertex_param.Value; var vertics_world = transform.localToWorldMatrix.MultiplyPoint3x4(vertices[vid]); float line_length = transform.lossyScale.x * 0.02f; Gizmos.color = Color.red; Gizmos.DrawLine(vertics_world, vertics_world + param.U1 * line_length); Gizmos.color = Color.green; Gizmos.DrawLine(vertics_world, vertics_world + param.U2 * line_length); //Gizmos.color = Color.white; //Gizmos.DrawLine(vertics_world, vertics_world + tan_sum * line_length); } } }
public void UpdateMeshTest(float w1, float w2) { var vertices = mesh.vertices; Debug.Assert(mesh.vertexCount == vertexParms.Count); Vector3[] newVertices = new Vector3[mesh.vertexCount]; foreach (var vertex_param in vertexParms) { int vid = vertex_param.Key; VertexParm param = vertex_param.Value; var vec_sum = param.U1 * w1 + param.U2 * w2; newVertices[vid] = vertices[vid] + vec_sum; } mesh.vertices = newVertices; }