Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 4
0
        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);
                }
            }
        }