Example #1
0
        /// <summary>
        /// Gets first picking position of giving ray
        /// </summary>
        /// <param name="ray">Picking ray</param>
        /// <param name="rayPickingParams">Ray picking params</param>
        /// <param name="result">Picking result</param>
        /// <returns>Returns true if ground position found</returns>
        public virtual bool PickFirst(Ray ray, RayPickingParams rayPickingParams, out PickingResult <Triangle> result)
        {
            result = new PickingResult <Triangle>()
            {
                Distance = float.MaxValue,
            };

            var bsph = this.GetBoundingSphere();

            if (bsph.Intersects(ref ray))
            {
                bool facingOnly = !rayPickingParams.HasFlag(RayPickingParams.AllTriangles);
                var  triangles  = this.GetVolume(rayPickingParams.HasFlag(RayPickingParams.Geometry));

                if (triangles.Any() && Intersection.IntersectFirst(ray, triangles, facingOnly, out Vector3 p, out Triangle t, out float d))
                {
                    result.Position = p;
                    result.Item     = t;
                    result.Distance = d;

                    return(true);
                }
            }

            return(false);
        }
Example #2
0
        /// <summary>
        /// Pick ground nearest position
        /// </summary>
        /// <param name="ray">Ray</param>
        /// <param name="rayPickingParams">Ray picking params</param>
        /// <param name="result">Picking result</param>
        /// <returns>Returns true if picked position found</returns>
        public bool PickNearest(Ray ray, RayPickingParams rayPickingParams, out PickingResult <Triangle> result)
        {
            bool res = false;

            result = new PickingResult <Triangle>()
            {
                Distance = float.MaxValue,
            };

            bool facingOnly = !rayPickingParams.HasFlag(RayPickingParams.AllTriangles);

            if (this.groundPickingQuadtree != null && this.groundPickingQuadtree.PickNearest(ray, facingOnly, out PickingResult <Triangle> gResult))
            {
                if (result.Distance > gResult.Distance)
                {
                    result = gResult;
                }

                res = true;
            }

            return(res);
        }
Example #3
0
 /// <summary>
 /// Gets nearest picking position of giving ray
 /// </summary>
 /// <param name="ray">Picking ray</param>
 /// <param name="result">Picking result</param>
 /// <returns>Returns true if ground position found</returns>
 public bool PickNearest(Ray ray, out PickingResult <Triangle> result)
 {
     return(PickNearest(ray, RayPickingParams.Default, out result));
 }
Example #4
0
 /// <summary>
 /// Gets first picking position of giving ray
 /// </summary>
 /// <param name="ray">Picking ray</param>
 /// <param name="result">Picking result</param>
 /// <returns>Returns true if ground position found</returns>
 public virtual bool PickFirst(Ray ray, out PickingResult <Triangle> result)
 {
     return(PickFirst(ray, RayPickingParams.Default, out result));
 }