Kyrah Abattoir Posted June 9, 2020 Share Posted June 9, 2020 (edited) This is something I've been wondering about since I saw Wulfie's most recent script contribution. Is there a "cheap" way to perform a "volumetric raycast" That is, figure out what objects are inside (or partially inside) a volume projected from the avatar's bounding box in an arbitrary direction and "depth". EDIT: Added a visual aid. Edited June 9, 2020 by Kyrah Abattoir Link to comment Share on other sites More sharing options...
Wulfie Reanimator Posted June 9, 2020 Share Posted June 9, 2020 (edited) For context: I don't know if my function can be made any more efficient, short of maybe replacing the LL functions with "manual math." It works as long as the center of the target is inside the cone. For cases where an object is partially inside the cone, without the center being in the cone, there would always need to be at least one (or multiple) raycasts inside of the cone, such as finding the closest edge within the cone and firing a ray along it, in hopes that it can still hit the target. But that would be unreliable as you could no longer assume that "if nothing is hit, there must've been line of sight." The ray would have to actually hit the target, which creates some caveats like moving targets and weirdly-shaped targets. (Imagine trying to hit the center an L-shaped target.) You would also have to discard the arc and range checks, since the target's center could be just outside the range of the cone, but still extend into range. I think this would sacrifice performance in cases where the target is nowhere near the cone. Edited June 9, 2020 by Wulfie Reanimator Link to comment Share on other sites More sharing options...
animats Posted June 9, 2020 Share Posted June 9, 2020 Oh, I could really use that. I think Havok has that function, as "cast beam". Finding out if a space is empty takes too many ray casts. Here's what I do in my NPCs to check if an NPC-sized cylinder is empty. if (obstacleraycasthoriz(p0+halfheight+fwdoffset, pc + halfheight)) { return(-1.0); }// Horizontal cast at mid height, any hit is bad if (obstacleraycasthoriz(p0+fullheight+fwdoffset, pc + fullheight)) { return(-1.0); }// Same at full height to check for low clearances if (obstacleraycasthoriz(p0+halfheight+fwdoffset+sideoffset, pa + halfheight)) { return(-1.0); }// Horizontal cast at mid height, any hit is bad if (obstacleraycasthoriz(p0+halfheight+fwdoffset-sideoffset, pb + halfheight)) { return(-1.0); }// Horizontal cast at mid height, any hit is bad // Crosswise horizontal check. if (obstacleraycasthoriz(pa+halfheight,pb+halfheight)) { return(-1.0); } // Horizontal cast crosswize at mid height, any hit is bad // Downward ray casts only. Must hit a walkable. // Center of cell is clear and walkable. Now check upwards at front and side. // The idea is to check at points that are on a circle of diameter "gPathWidth" if (obstacleraycastvert(pa+fullheight,pa-mazedepthmargin) < 0) { return(-1.0); } if (obstacleraycastvert(pb+fullheight,pb-mazedepthmargin) < 0) { return(-1.0); } // cast downwards, must hit walkable if (obstacleraycastvert(pc+fullheight,pc-mazedepthmargin) < 0) { return(-1.0); } // cast downwards, must hit walkable if (obstacleraycastvert(pd+fullheight,pc-mazedepthmargin) < 0) { return(-1.0); } // cast at steep angle, must hit walkable // Need to do all four corners of the square. Used when testing and not coming from a known good place. if (obstacleraycastvert(pd+fullheight,pd-mazedepthmargin) < 0) { return(-1.0); }; // cast downwards for trailing point 10 calls to llCastRay for each square as the maze solver plans its way around an obstacle. The script doing this sometimes runs for two minutes on hard cases. There are horizontal ray casts to catch vertical obstacles, and vertical ray casts to catch horizontal obstacles. If a ray cast starts inside an obstacle, it doesn't see it, so all this is necessary. Even with all this, it can miss a thin pole. Link to comment Share on other sites More sharing options...
Lucia Nightfire Posted June 10, 2020 Share Posted June 10, 2020 Why not file a feature request for it? Curious if such a feature would bring back the casting pools of yore, though, heh. Link to comment Share on other sites More sharing options...
Estelle Pienaar Posted June 11, 2020 Share Posted June 11, 2020 I would definately support a feature request. However it would probably be more usefull if LL would fix pathfinder. Then the "fix" to raycasting your NPCs way would probably not be (as) necessary. Link to comment Share on other sites More sharing options...
Recommended Posts
Please take a moment to consider if this thread is worth bumping.
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now