Ejemplo n.º 1
0
    public static int FindClosestFaceOnMesh(Quad[] meshFaces, Vector3[] meshVertexPositions, Vector3 targetPoint)
    {
        int   bestFaceIdx  = -1;
        float bestFaceDist = float.PositiveInfinity;

        for (int faceIdx = 0; faceIdx < meshFaces.Length; ++faceIdx)
        {
            Quad quad = meshFaces[faceIdx];
            for (int i = 0; i < 2; ++i)
            {
                int         vertexIdxA            = quad.GetCorner(i + 0);
                int         vertexIdxB            = quad.GetCorner(i + 1);
                int         vertexIdxC            = quad.GetCorner(i + 2);
                PointOnMesh closestOnFace         = PointOnMesh.MakeClosestToFace(meshVertexPositions, vertexIdxA, vertexIdxB, vertexIdxC, targetPoint);
                Vector3     closestOnFacePosition = closestOnFace.AsPosition(meshVertexPositions);

                float dist = Vector3.DistanceSquared(targetPoint, closestOnFacePosition);

                if (dist < bestFaceDist)
                {
                    bestFaceIdx  = faceIdx;
                    bestFaceDist = dist;
                }
            }
        }

        return(bestFaceIdx);
    }
Ejemplo n.º 2
0
    public static PointOnMesh FindClosestPointOnMesh(Quad[] meshFaces, Vector3[] meshVertexPositions, Vector3 targetPoint)
    {
        PointOnMesh bestPointOnMesh     = default(PointOnMesh);
        float       bestPointOnMeshDist = float.PositiveInfinity;

        foreach (Quad quad in meshFaces)
        {
            for (int i = 0; i < 2; ++i)
            {
                int         vertexIdxA            = quad.GetCorner(i + 0);
                int         vertexIdxB            = quad.GetCorner(i + 1);
                int         vertexIdxC            = quad.GetCorner(i + 2);
                PointOnMesh closestOnFace         = PointOnMesh.MakeClosestToFace(meshVertexPositions, vertexIdxA, vertexIdxB, vertexIdxC, targetPoint);
                Vector3     closestOnFacePosition = closestOnFace.AsPosition(meshVertexPositions);

                float dist = Vector3.DistanceSquared(targetPoint, closestOnFacePosition);

                if (dist < bestPointOnMeshDist)
                {
                    bestPointOnMesh     = closestOnFace;
                    bestPointOnMeshDist = dist;
                }
            }
        }

        return(bestPointOnMesh);
    }