/// <summary> /// Casts a ray into the scene and returns the first intersected collidable object. /// </summary> /// <param name="startposition">World space start position of the ray.</param><param name="endposition">World space end position of the ray.</param><param name="firsthit">Output intersection information.</param> /// <returns> /// Returns true if an intersection occurs. /// </returns> public bool RayCast(Vector3 startposition, Vector3 endposition, out RayCollisionPoint firsthit) { Ray ray; float length; if (!TestRay(ref startposition, ref endposition, out ray, out length)) { firsthit = new RayCollisionPoint(); return(false); } return(RayCast(ray, length, out firsthit)); }
public static RayCollisionPoint GetCollision(Ray ray, BoundPlaneCollision plane) { RayCollisionPoint rcp = RayOnPlaneCollision.GetCollision(ray, plane, out float s1, out float s2); if (!rcp.DidCollide) { return(rcp); } rcp.SetCollide(plane.Restriction(s1, s2)); return(rcp); }
/// <summary> /// Casts a ray into the scene and returns all intersected collidable object. /// </summary> /// <param name="hits">Resulting intersection information.</param><param name="ray">Normalized world space ray.</param><param name="castdistance">Distance to cast ray.</param> public void RayCast(List <RayCollisionPoint> hits, Ray ray, float castdistance) { var results = new List <RayCastResult>(); if (Space.RayCast(ray, castdistance, results)) { foreach (var result in results) { var collisionPoint = new RayCollisionPoint(); BuildRayRollisionPoint(ref collisionPoint, result); hits.Add(collisionPoint); } } }
/// <summary> /// Casts a ray into the scene and returns the first intersected collidable object. /// </summary> /// <param name="ray">Normalized world space ray.</param><param name="castdistance">Distance to cast ray.</param><param name="firsthit">Output intersection information.</param> /// <returns> /// Returns true if an intersection occurs. /// </returns> public bool RayCast(Ray ray, float castdistance, out RayCollisionPoint firsthit) { RayCastResult result; if (!Space.RayCast(ray, castdistance, out result)) { firsthit = new RayCollisionPoint(); return(false); } firsthit = new RayCollisionPoint(); BuildRayRollisionPoint(ref firsthit, result); return(true); }
private void BuildRayRollisionPoint(ref RayCollisionPoint rayCollisionPoint, RayCastResult rayCastResult) { rayCollisionPoint.ContactTime = rayCastResult.HitData.T; rayCollisionPoint.ContactPoint = rayCastResult.HitData.Location; rayCollisionPoint.SurfaceNormal = rayCastResult.HitData.Normal; if (rayCollisionPoint.SurfaceNormal != Vector3.Zero) { rayCollisionPoint.SurfaceNormal.Normalize(); } var collisionObject = rayCastResult.HitObject.Tag as ICollisionObject; if (collisionObject != null) { rayCollisionPoint.ContactObject = collisionObject; rayCollisionPoint.Material = collisionObject.DefaultCollisionMaterial; } }
public RayCollisionPoint CollideRay(Ray ray) { // get all objects var collidables = ColliderObjects.GetAllObjects((GameObject go) => go is ICollidable); var nearestCollision = new RayCollisionPoint(); foreach (var collidable in collidables) { //Console.WriteLine($"Testing RCP with {collidable}"); RayCollisionPoint rcp = CollisionManager.GetRayCollision(ray, collidable.Collision); // check if the point is closer if (rcp.DidCollide && rcp.RayDistance < nearestCollision.RayDistance && rcp.RayDistance >= 0.0f) { nearestCollision = rcp; } } return(nearestCollision); }