private void CreateBolt(LineRenderer line) { //lineObject.material.SetTextureScale("_MainTex", new Vector2(distance * zigZagPerMeter, 1.0f)); //lineObject.numPositions = vertexCount; float totalDistance = _pathComp.TotalDistance; int numPositions = Mathf.CeilToInt(totalDistance * zigZagPerMeter); Vector3[] points = new Vector3[numPositions]; line.positionCount = numPositions; line.material.SetTextureScale("_MainTex", new Vector2(totalDistance * zigZagPerMeter, 1.0f)); // set the ends points[0] = _pathComp.GetPathPoint(0.0f).point; points[numPositions - 1] = _pathComp.GetPathPoint(totalDistance).point; Vector2 previousOffset = Vector2.zero; for (int i = 1; i < numPositions - 1; i++) { Path_Point pathPoint = _pathComp.GetPathPoint(Math_Functions.Value_from_another_Scope(i, 0, numPositions - 1, 0, totalDistance)); Vector2 offset = new Vector2(Random.Range(-1.0f, 1.0f), Random.Range(-1.0f, 1.0f)); offset *= zigZagIntensity; previousOffset = offset; points[i] = pathPoint.point + (pathPoint.right * offset.x) + (pathPoint.up * offset.y); } line.SetPositions(points); }
private void AddTriangle(int[] indices, int submesh) { // vertices Vector3[] verts = new Vector3[3] { segmentSourceMesh.vertices[indices[0]], segmentSourceMesh.vertices[indices[1]], segmentSourceMesh.vertices[indices[2]] }; // normals Vector3[] norms = new Vector3[3] { segmentSourceMesh.normals[indices[0]], segmentSourceMesh.normals[indices[1]], segmentSourceMesh.normals[indices[2]] }; // uvs Vector2[] uvs = new Vector2[3] { segmentSourceMesh.uv[indices[0]], segmentSourceMesh.uv[indices[1]], segmentSourceMesh.uv[indices[2]] }; // tangent Vector4[] tangents = new Vector4[3] { segmentSourceMesh.tangents[indices[0]], segmentSourceMesh.tangents[indices[1]], segmentSourceMesh.tangents[indices[2]] }; // apply offset float lerpValue = 0.0f; Vector3 pointA, pointB; Vector3 normA, normB; Vector4 tangentA, tangentB; //Matrix4x4 4*4 矩阵;Transform.localToWorldMatrix 局部转世界矩阵 Matrix4x4 localToWorld_A = _helpTransform1.localToWorldMatrix; Matrix4x4 localToWorld_B = _helpTransform2.localToWorldMatrix; Matrix4x4 worldToLocal = transform.worldToLocalMatrix; for (int i = 0; i < 3; i++) { lerpValue = Math_Functions.Value_from_another_Scope(verts[i].z, _segment_MinZ, _segment_MaxZ, 0.0f, 1.0f); verts[i].z = 0.0f; pointA = localToWorld_A.MultiplyPoint(verts[i]); // to world pointB = localToWorld_B.MultiplyPoint(verts[i]); verts[i] = worldToLocal.MultiplyPoint(Vector3.Lerp(pointA, pointB, lerpValue)); // to local normA = localToWorld_A.MultiplyVector(norms[i]); normB = localToWorld_B.MultiplyVector(norms[i]); norms[i] = worldToLocal.MultiplyVector(Vector3.Lerp(normA, normB, lerpValue)); tangentA = localToWorld_A.MultiplyVector(tangents[i]); tangentB = localToWorld_B.MultiplyVector(tangents[i]); tangents[i] = worldToLocal.MultiplyVector(Vector3.Lerp(tangentA, tangentB, lerpValue)); } _maker.AddTriangle(verts, norms, uvs, tangents, submesh); }
public void AddTriangle(int[] indices, int submesh) { // vertices Vector3[] verts = new Vector3[3] { segment_sourceMesh.vertices[indices[0]], segment_sourceMesh.vertices[indices[1]], segment_sourceMesh.vertices[indices[2]] }; // normals Vector3[] norms = new Vector3[3] { segment_sourceMesh.normals[indices[0]], segment_sourceMesh.normals[indices[1]], segment_sourceMesh.normals[indices[2]] }; // uvs Vector2[] uvs = new Vector2[3] { segment_sourceMesh.uv[indices[0]], segment_sourceMesh.uv[indices[1]], segment_sourceMesh.uv[indices[2]] }; // apply offset float lerpValue = 0.0f; Vector3 pointA, pointB; Vector3 normA, normB; for (int i = 0; i < 3; i++) { lerpValue = Math_Functions.Value_from_another_Scope(verts[i].z, _segment_MinZ, _segment_MaxZ, 0.0f, 1.0f); verts[i].z = 0.0f; pointA = _helpTransform1.TransformPoint(verts[i]); // to world pointB = _helpTransform2.TransformPoint(verts[i]); verts[i] = transform.InverseTransformPoint(Vector3.Lerp(pointA, pointB, lerpValue)); // to local normA = _helpTransform1.TransformDirection(norms[i]); normB = _helpTransform2.TransformDirection(norms[i]); norms[i] = transform.InverseTransformDirection(Vector3.Lerp(normA, normB, lerpValue)); } _maker.AddTriangle(verts, norms, uvs, submesh); }
public void AddTriangle(int[] indices, int submesh) { // vertices Vector3[] verts = new Vector3[3] { segment_sourceMesh.vertices[indices[0]], segment_sourceMesh.vertices[indices[1]], segment_sourceMesh.vertices[indices[2]] }; // normals Vector3[] norms = new Vector3[3] { segment_sourceMesh.normals[indices[0]], segment_sourceMesh.normals[indices[1]], segment_sourceMesh.normals[indices[2]] }; // apply offset float lerpValue = 0.0f; Vector3 pointA, pointB; Vector3 normA, normB; for (int i = 0; i < 3; i++) { lerpValue = Math_Functions.Value_from_another_Scope(verts[i].z, _segment_MinZ, _segment_MaxZ, 0.0f, 1.0f); verts[i].z = 0.0f; pointA = _helpTransform1.TransformPoint(verts[i]); // to world pointB = _helpTransform2.TransformPoint(verts[i]); verts[i] = transform.InverseTransformPoint(Vector3.Lerp(pointA, pointB, lerpValue)); // to local normA = _helpTransform1.TransformDirection(norms[i]); normB = _helpTransform2.TransformDirection(norms[i]); norms[i] = transform.InverseTransformDirection(Vector3.Lerp(normA, normB, lerpValue)); // is this new? int index = -1; if (shouldOptimizeMesh) { for (int iterator = 0; iterator < _vertices.Count; iterator++) { if (_vertices[iterator] == verts[i] && _normals[iterator] == norms[i] && _uvs[iterator] == segment_sourceMesh.uv[indices[i]]) { index = iterator; break; } } } // it is if (index == -1) { _subIndices[submesh].Add(_vertices.Count); _triangles.Add(_vertices.Count); _vertices.Add(verts[i]); _normals.Add(norms[i]); _uvs.Add(segment_sourceMesh.uv[indices[i]]); } else // it is not { numDoubles++; _subIndices[submesh].Add(index); _triangles.Add(index); } } }