예제 #1
0
        /// <summary>
        /// Finds point on edge given mouse ray.
        /// </summary>
        private Vector3 FindClosestPointOnEdge(MeshUtils.Edge edge)
        {
            var ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);

            return(ShapeUtils.ShortestDistanceSegmentSegment(ray.origin,
                                                             ray.GetPoint(500f),
                                                             edge.Start,
                                                             edge.End).PointOnSegment2);
        }
예제 #2
0
        /// <summary>
        /// Finds closest triangle edge given ray and valid raycast result. The
        /// Result.ClosestEdge field will be updated.
        /// </summary>
        /// <param name="ray">Ray in world coordinate system.</param>
        /// <param name="result">Reference to valid result.</param>
        private static void FindClosestEdge(Ray ray, ref Result result)
        {
            var rayStart = ray.origin;
            var rayEnd   = ray.GetPoint(5000.0f);
            var d1       = ShapeUtils.ShortestDistanceSegmentSegment(rayStart,
                                                                     rayEnd,
                                                                     result.Triangle.Vertex1,
                                                                     result.Triangle.Vertex2);
            var d2 = ShapeUtils.ShortestDistanceSegmentSegment(rayStart,
                                                               rayEnd,
                                                               result.Triangle.Vertex2,
                                                               result.Triangle.Vertex3);
            var d3 = ShapeUtils.ShortestDistanceSegmentSegment(rayStart,
                                                               rayEnd,
                                                               result.Triangle.Vertex3,
                                                               result.Triangle.Vertex1);

            result.ClosestEdge = d1.Distance < d2.Distance && d1.Distance < d3.Distance ? new Edge()
            {
                Start  = result.Triangle.Vertex1,
                End    = result.Triangle.Vertex2,
                Normal = result.Triangle.Normal,
                Type   = Edge.EdgeType.Triangle
            } :
            d2.Distance < d1.Distance && d2.Distance < d3.Distance ? new Edge()
            {
                Start  = result.Triangle.Vertex2,
                End    = result.Triangle.Vertex3,
                Normal = result.Triangle.Normal,
                Type   = Edge.EdgeType.Triangle
            } :
            new Edge()
            {
                Start  = result.Triangle.Vertex3,
                End    = result.Triangle.Vertex1,
                Normal = result.Triangle.Normal,
                Type   = Edge.EdgeType.Triangle
            };
        }