LocalToWorld() 공개 메소드

public LocalToWorld ( Vector3 point ) : Vector3
point Vector3
리턴 Vector3
    private void GeneratePitch()
    {
        if (mMesh == null)
        {
            mMesh      = new Mesh();
            mMesh.name = "Road Segment";
            m_MeshFilter.sharedMesh = mMesh;
        }

        mMesh.Clear();  //clear existing data
        int            vCount   = VertexCount;
        List <Vector3> vertices = new List <Vector3> ();
        List <Vector3> normals  = new List <Vector3> ();
        List <Vector2> uvs      = new List <Vector2> ();

        for (int i = 0; i < m_CurveDetailLevel + 1; i++)
        {
            float t = i / (float)m_CurveDetailLevel;

            OrientedPoint bezierPoint = GetBezierOrientation(t);

            Vector3 localLeftVector  = bezierPoint.LocalToWorld(-Vector3.right * (m_CurveThickness * 0.1f)); //(bezierPoint.position) + (Vector3.left * m_RoadThickness * 0.5f);
            Vector3 localRightVector = bezierPoint.LocalToWorld(Vector3.right * (m_CurveThickness * 0.1f));  //(bezierPoint.position) + (Vector3.right * (m_CurveThickness * 0.1f));

            vertices.Add(localLeftVector);
            normals.Add(-Vector3.up);  // in localspace

            vertices.Add(localRightVector);
            normals.Add(-Vector3.up);  // in localspace

            Gizmos.DrawSphere(localLeftVector, 0.005f);
            Gizmos.DrawSphere(localRightVector, 0.005f);

            uvs.Add(new Vector2(1, t));
            uvs.Add(new Vector2(0, t));
        }

        List <int> triangleIndices = new List <int> ();

        for (int i = 0; i < m_CurveDetailLevel; i++)
        {
            int rootIndex   = i * 2;
            int rtInner     = rootIndex + 1;
            int rtOuterNext = (rootIndex + 2);
            int rtInnerNext = (rootIndex + 3);

            triangleIndices.Add(rootIndex);
            triangleIndices.Add(rtOuterNext);
            triangleIndices.Add(rtInnerNext);

            triangleIndices.Add(rootIndex);
            triangleIndices.Add(rtInnerNext);
            triangleIndices.Add(rtInner);
        }

        mMesh.SetVertices(vertices);
        mMesh.SetTriangles(triangleIndices, 0);
        mMesh.SetNormals(normals);
        mMesh.SetUVs(0, uvs);
    }
    private void GenerateRoad()
    {
        if (mMesh == null)
        {
            mMesh      = new Mesh();
            mMesh.name = "RoadSegment";
            m_MeshFilter.sharedMesh = mMesh;
        }

        mMesh.Clear();

        //vertices
        List <Vector3> allVertsAlongRoad = new List <Vector3> ();
        List <Vector3> allNormals        = new List <Vector3> ();

        for (int ring = 0; ring < m_VerticalSliceCount; ring++)
        {
            float t = ring / (m_VerticalSliceCount - 1f);

            OrientedPoint op = GetBezierOrientation(t);
            for (int i = 0; i < m_Shape2D.vertices.Length; i++)
            {
                allVertsAlongRoad.Add(op.LocalToWorld(m_Shape2D.vertices[i].points));
                allNormals.Add(op.LocalToWorldVec(m_Shape2D.vertices[i].normals));
                //allNormals.Add (m_Shape2D.vertices[i].normals);//without rotation
            }
        }

        //Trianlges
        List <int> allTriangles = new List <int> ();

        for (int ring = 0; ring < m_VerticalSliceCount - 1; ring++)
        {
            int rootIndex        = ring * m_Shape2D.GetVertexCount();
            int rootIndexForward = (ring + 1) * m_Shape2D.GetVertexCount();

            for (int line = 0; line < m_Shape2D.GetLineCount(); line += 2)
            {
                int lineA = m_Shape2D.lineIndices[line];
                int lineB = m_Shape2D.lineIndices[line + 1];

                int currentA = rootIndex + lineA;
                int currentB = rootIndex + lineB;
                int nextA    = rootIndexForward + lineA;
                int nextB    = rootIndexForward + lineB;

                allTriangles.Add(currentA);
                allTriangles.Add(nextA);
                allTriangles.Add(nextB);

                allTriangles.Add(nextB);
                allTriangles.Add(currentB);
                allTriangles.Add(currentA);
            }
        }
        mMesh.SetVertices(allVertsAlongRoad);
        mMesh.SetTriangles(allTriangles, 0);
        mMesh.SetNormals(allNormals);
    }
    private void OnDrawGizmos()
    {
        for (int i = 0; i < 4; i++)
        {
            Gizmos.DrawSphere(GetPos(i), 0.02f);
        }

        Handles.DrawBezier(
            GetPos(0),  // start pos
            GetPos(3),  // end pos
            GetPos(1),  // start tangent
            GetPos(2),  // end tangent
            Color.white, EditorGUIUtility.whiteTexture, m_CurveThickness);

        Gizmos.color = Color.magenta;

        OrientedPoint percentPoint = GetBezierOrientation(m_CurvePointPercent);

        Gizmos.DrawSphere(percentPoint.position, 0.03f);
        Handles.PositionHandle(percentPoint.position, percentPoint.rotation);

        //void DrawPoint (Vector2 localPos) => Gizmos.DrawSphere (percentPoint.LocalToWorld (localPos), 0.1f);

        Vector3[] verts = m_Shape2D.vertices.Select(v => percentPoint.LocalToWorld(v.points)).ToArray();

        for (int i = 0; i < m_Shape2D.lineIndices.Length; i += 2)
        {
            Vector3 a = verts[m_Shape2D.lineIndices[i]];
            Vector3 b = verts[m_Shape2D.lineIndices[i + 1]];

            Gizmos.DrawLine(a, b);
        }

        Gizmos.color = Color.red;
        GenerateRoad();
    }
예제 #4
0
        private void GenerateMesh(int keepBuffer)
        {
            UpdatePath(keepBuffer);
            if (m_SplinePathIndex < 2)
            {
                return;
            }

            int numPath      = m_SplinePath.Count;
            int vertsInShape = shapeVertices.Count;

            int[]     triangleIndices = m_OMesh.triangles;
            Vector3[] vertices        = m_OMesh.vertices;
            Vector3[] normals         = m_OMesh.normals;
            Vector2[] uvs             = m_OMesh.uvs;

            int segments = numPath - m_MeshingNodeIndex;

            int tLengthNeeded = (m_MeshingIndex + segments * vertsInShape) * 6;

            if (tLengthNeeded >= triangleIndices.Length)
            {
                if (Overflow != null)
                {
                    Overflow.Invoke();
                }

                return;
            }

            int updateOffset = m_MeshingIndex;

            for (int i = 0; i < segments; i++)
            {
                OrientedPoint op     = m_SplinePath[m_MeshingNodeIndex];
                float         vCoord = ( float )i / (( float )segments) * textureScale;

                for (int iVertex = 0; iVertex < vertsInShape; iVertex++)
                {
                    Vertex v = shapeVertices[iVertex];

                    vertices[m_MeshingIndex] = op.LocalToWorld(v.point * shapeSize);
                    normals[m_MeshingIndex]  = op.LocalToWorldDirection(v.normal);
                    uvs[m_MeshingIndex]      = new Vector2(v.uCoord, vCoord);
                    m_MeshingIndex++;
                }

                m_MeshingNodeIndex++;
            }

            int index = updateOffset;
            int ti    = updateOffset * 6;

            if (index > vertsInShape)
            {
                index -= vertsInShape;
            }
            else
            {
                segments--;
            }

            for (int i = 0; i < segments; i++)
            {
                for (int iVertex = 0; iVertex < vertsInShape; iVertex++)
                {
                    int offset =
                        (iVertex == (vertsInShape - 1)) ?
                        -(vertsInShape - 1)
                                                : 1;
                    int a = index + vertsInShape;
                    int b = index;
                    int c = index + offset;
                    int d = index + offset + vertsInShape;

                    triangleIndices[ti++] = c;
                    triangleIndices[ti++] = a;
                    triangleIndices[ti++] = b;
                    triangleIndices[ti++] = a;
                    triangleIndices[ti++] = c;
                    triangleIndices[ti++] = d;

                    index++;
                }
            }

            m_OMesh.vertIndex = m_MeshingIndex;
            m_OMesh.triIndex  = ti;
            m_OMesh.UpdateBuffers();
        }