function CapsuleVSphere(pos1, pos2: TAffinevector; h, r1, r2: single; dir: TAffinevector): single;var s, e: TAffinevector;begin h := h * 0.5; s := vectoradd(pos1, vectorscale(dir, h)); e := vectorsubtract(pos1, vectorscale(dir, h)); result := PointSegmentDistance(pos2, s, e); if result > r1 + r2 then result := -1 else result := (r1 + r2) - result;end;function CapsuleVCapsule(pos1, pos2: TAffinevector; h1, h2, r1, r2: single; dir1,dir2: TAffinevector): single;var s1, e1, s2, e2: TAffinevector;begin h1 := h1 * 0.5; s1 := vectoradd(pos1, vectorscale(dir1, h1)); e1 := vectorsubtract(pos1, vectorscale(dir1, h1)); h2 := h2 * 0.5; s2 := vectoradd(pos2, vectorscale(dir2, h2)); e2 := vectorsubtract(pos2, vectorscale(dir2, h2)); result := SegmentSegmentDistance(s1, e1, s2, e2); if result > r1 + r2 then result := -1 else result := (r1 + r2) - result;end;function CapsuleVPlane(Plane:TVector;pos: TAffinevector; h, r: single; dir: TAffinevector): single;var s, e, pos2: TAffinevector; temp:single;begin h := h * 0.5; s := vectoradd(pos, vectorscale(dir, h)); e := vectorsubtract(pos, vectorscale(dir, h)); //find the closest point on the plane // IntersectLinePlane(pos,vectornegate(PAffinevector(@plane)^),plane,@pos2); IntersectLinePlane(pos,PAffinevector(@plane)^,plane,@pos2); result := PointSegmentDistance(pos2, s, e); result := r - result;end;
Sphere and Cylinder vs Ellipsoid problem
I came across a couple of segment functions that made my life easier. Capsules should come in very handy for loads of different situations. Here's what I came up with..
I am not very familiar with Pascal Syntax, but that sounds about right, it comes down to finding the closest point to the object you're checking against on the capsule segment defined by the points capsule_pos,capsule_pos+(0,0,height), and then find out if the distance between the closest points on each object overlap the radius.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement