コード例 #1
0
        public void Wrap(MeshFilter meshFilter, MeshCollider meshCollider, Axis axis, int[] curveIndices, int sliceCount)
        {
            if (curveIndices.Length < 1)
            {
                throw new ArgumentException("at least one curveIndex required", "curveIndices");
            }

            CurveIndices = curveIndices;
            m_up         = Up(axis);
            if (axis == Axis.Z)
            {
                m_axisRotation = Quaternion.identity;
            }
            else if (axis == Axis.X)
            {
                m_axisRotation = Quaternion.AngleAxis(-90.0f, Vector3.up);
            }
            else
            {
                m_axisRotation = Quaternion.AngleAxis(90.0f, Vector3.right);
            }

            if (meshFilter == null || meshFilter.sharedMesh == null)
            {
                m_meshFilter     = null;
                m_meshCollider   = null;
                m_slices         = new Slice[curveIndices.Length * (sliceCount + 1)];
                m_colliderSlices = new Slice[curveIndices.Length * (sliceCount + 1)];
                for (int i = 0; i < m_slices.Length; ++i)
                {
                    m_slices[i]         = new Slice(Vector3.zero, -1, 0, new int[0]);
                    m_colliderSlices[i] = new Slice(Vector3.zero, -1, 0, new int[0]);
                }
                return;
            }

            sliceCount = Math.Max(sliceCount / curveIndices.Length, 1);

            Vector3 boundsFrom;
            Vector3 boundsTo;

            meshFilter.sharedMesh.GetBounds(axis, out boundsFrom, out boundsTo);

            m_meshFilter = meshFilter;
            m_slices     = CreateSlices(m_meshFilter.sharedMesh, boundsFrom, boundsTo, axis, curveIndices, sliceCount);

            if (meshCollider == null || meshCollider.sharedMesh == null)
            {
                m_meshCollider   = null;
                m_colliderSlices = new Slice[curveIndices.Length * (sliceCount + 1)];
                for (int i = 0; i < m_colliderSlices.Length; ++i)
                {
                    m_colliderSlices[i] = new Slice(Vector3.zero, -1, 0, new int[0]);
                }
            }
            else
            {
                m_meshCollider   = meshCollider;
                m_colliderSlices = CreateSlices(m_meshCollider.sharedMesh, boundsFrom, boundsTo, axis, curveIndices, sliceCount);
            }
        }
コード例 #2
0
        private Slice[] CreateSlices(Mesh mesh, Vector3 boundsFrom, Vector3 boundsTo, Axis axis, int[] curveIndices, int sliceCount)
        {
            Slice[]   result   = new Slice[curveIndices.Length * (sliceCount + 1)];
            Vector3[] vertices = mesh.vertices;
            List <int>[,] slices = new List <int> [curveIndices.Length, sliceCount + 1];
            for (int i = 0; i < curveIndices.Length; ++i)
            {
                for (int s = 0; s <= sliceCount; ++s)
                {
                    slices[i, s] = new List <int>(vertices.Length / result.Length);
                }
            }

            Vector3 delta = (boundsTo - boundsFrom) / curveIndices.Length;

            for (int v = 0; v < vertices.Length; ++v)
            {
                Vector3 vertex = vertices[v];

                int   minI   = -1;
                int   minS   = -1;
                float minMag = float.MaxValue;

                Vector3 offset = boundsFrom;
                for (int i = 0; i < curveIndices.Length; ++i)
                {
                    float t = 0.0f;
                    for (int s = 0; s <= sliceCount; ++s)
                    {
                        Vector3 point  = Vector3.Lerp(offset, offset + delta, t);
                        float   sqrMag = (vertex - point).sqrMagnitude;
                        if (sqrMag < minMag)
                        {
                            minMag = sqrMag;
                            minI   = i;
                            minS   = s;
                        }
                        t += 1.0f / sliceCount;
                    }
                    offset += delta;
                }
                slices[minI, minS].Add(v);
            }

            {
                Vector3 offset = boundsFrom;
                for (int i = 0; i < curveIndices.Length; ++i)
                {
                    int   curveIndex = curveIndices[i];
                    float t          = 0.0f;
                    for (int s = 0; s <= sliceCount; ++s)
                    {
                        result[i * (sliceCount + 1) + s] = new Slice(Vector3.Lerp(offset, offset + delta, t), curveIndex, t, slices[i, s].ToArray());
                        t += 1.0f / sliceCount;
                    }
                    offset += delta;
                }
            }

            return(result);
        }