Wandering Soulstar Posted November 29, 2018 Share Posted November 29, 2018 Hi All, On my latest project I want to detect when an Av passes through a doorway, and know from which side of the doorway they have 'entered'. Basically want to know if they have entered or left the space (an Elevator). While I realise that if they manage to TP in, or they TP out there is more to do, but for now just working on simple movement. So to do this I'll have a transparent, thin prim, with llVolumeDetect set. From reading through the wiki my conclusion is I'll need to use the collision_start event, and then using llDetectedPos check the result against the detector prim's position to calculate which side they hit, correct? Or is there a way to see which face they collided with that I am missing? Thanks! Wanda Link to comment Share on other sites More sharing options...
Wandering Soulstar Posted November 29, 2018 Author Share Posted November 29, 2018 (edited) hmmm .. just thought of a solution .. I think ... please correct me if I am mistaken: Make the detector prim the same size as the elevator. Then collision_start is triggered when they enter, and collision_end when they leave. This as well, from what I have read, would trigger if they TP'd in or out .. no? If so then the only question is .. would the events trigger if the logged out/in from inside the elevator (detector prim)? Edited November 29, 2018 by Wandering Soulstar spelling Link to comment Share on other sites More sharing options...
Wulfie Reanimator Posted November 29, 2018 Share Posted November 29, 2018 (edited) Your first method is right on track, it'll take a tiny bit of math because there is no (well, maybe one) way to detect which face was collided with. The second method would also work fine for one person. What if someone is already in the elevator and another walks in with them? It's not impossible to work around, just something to keep track of. The one possible way for face detection I mentioned is with llCastRay. Essentially, you instantly draw a line from A to B and see what the line collided with. You can find out which way the prim's face is... facing... but you'd still need to do the same "directional math" as with an avatar collision. I don't recommend doing this as a practical solution. Edited November 29, 2018 by Wulfie Reanimator Link to comment Share on other sites More sharing options...
Wandering Soulstar Posted November 29, 2018 Author Share Posted November 29, 2018 (edited) @Wulfie Reanimator Thanks, as I suspected. Your comment on the second method though has me confused. Even if one AV had entered the detector prim, and was still there, would a second AV entering not also trigger the collision_start event (or _end as the case may be)? Edited November 29, 2018 by Wandering Soulstar spelling Link to comment Share on other sites More sharing options...
Wulfie Reanimator Posted November 29, 2018 Share Posted November 29, 2018 6 minutes ago, Wandering Soulstar said: @Wulfie Reanimator Thanks, as I suspected. Your comment on the second method though has me confused. Even if on AV had entered the detector prim, and was still there, would a second AV entering not also trigger the collision_start event (or _end as the case may be)? It would. But that is a very important detail to know, depending on what your script does on _start or _end. If your elevator immediately reacts to either of those events, it'll likely break, depending on what it's doing and how. Link to comment Share on other sites More sharing options...
Wandering Soulstar Posted November 29, 2018 Author Share Posted November 29, 2018 (edited) Ok .. thanks .. and it actually will do very little. Just advise if there is anybody in the elevator or not .. actual movement of the elevator works another way default { state_entry() { llVolumeDetect(TRUE); //will correspond to position (up/down) ME = llGetObjectDesc(); llListen(MAIN_CH, EMPTY_STR, NULL_KEY, EMPTY_STR); //Ask main for where we are .. if main does not reespond, not on yet llWhisper(MAIN_CH, F_REQ_POSITION); } listen(integer channel, string name, key id, string message) { if (channel == MAIN_CH) { //main advising where the elevator is list data = llParseString2List(message, [FUNC_SEP], [EMPTY_STR]); if (llList2String(data, 0) == F_POSITION) { gCurPosit = llList2String(data, 1); } } } collision_start(integer total_number) { //someone has come into the elevator/detector //advise if the elevator is actually in my position if (gCurPosit == ME) { llWhisper(MAIN_CH, F_ENTER + FUNC_SEP + (string)total_number); } } collision_end(integer total_number) { //someone has left the elevator/detector //advise if the elevator is actually in my position if (gCurPosit == ME) { llWhisper(MAIN_CH, F_EXIT + FUNC_SEP + (string)total_number); } } } Edited November 29, 2018 by Wandering Soulstar 1 Link to comment Share on other sites More sharing options...
Innula Zenovka Posted November 29, 2018 Share Posted November 29, 2018 This is how I detect if someone is entering or leaving a room, using an invisible prim with llVolumeDetect(TRUE); set. This assumes that the detector prim has its positive x axis facing out of the room (so you collide with face 2 on your way in and with face 4 on your way out), but it's easy to change. collision_start(integer num_detected) { rMyRot = llGetRot(); vMyPos = llGetPos()/rMyRot;//discount the prim's local rotation key kCollider = llDetectedKey(0); vector vDetectedPos = llDetectedPos(0)/rMyRot;//discount the prim's rotation here, too, so vDetectedPos is now the same as it would be if the prim were rotated at <0,0,0> float f = vDetectedPos.x - vMyPos.x; // llOwnerSay((string)f); if(f>0.0){ //entering room } else if (f<0.0){ //leaving room } } 3 Link to comment Share on other sites More sharing options...
Wandering Soulstar Posted November 29, 2018 Author Share Posted November 29, 2018 @Innula Zenovka Thanks for that. The one thing I like about the full space implementation that I put above is that it covers someone TPing in or out ... of course on the exit it only tells you after they have left, whilst yours tells as the are leaving .. Link to comment Share on other sites More sharing options...
Innula Zenovka Posted November 29, 2018 Share Posted November 29, 2018 (edited) Does it really matter in an elevator if the avatar teleports out? Presumably the elevator simply continues on its way to the selected floor. On arrival it stops and opens the door, just as it would if the avatar hadn't teleported out. ETA: I've always had very mixed results when trying to use collision events to track whether someone's standing on an object or not. Sooner or later, the logic always breaks down for no readily apparent reason, particularly if the avatar moves around on the surface that's doing the detecting. I've generally ended up using additional tests, based on the IsPointInPolygon2D function, to keep track of when avatars are, in fact, no longer standing on the surface, though I would imagine that adding avatars to a list (if they're not already on it) in the collision_start event and removing them from it in the collision_end event should work, too. Edited November 29, 2018 by Innula Zenovka 2 Link to comment Share on other sites More sharing options...
Wandering Soulstar Posted November 30, 2018 Author Share Posted November 30, 2018 @Innula Zenovka You are correct in that it is really immaterial to the movement of the elevator if the AV TPs out while in movement. I want to track the in/out of the elevator for actions that occur whilst the elevator is at rest. And while in movement I'd have no idea if the AV had left or not. To use the detector prim I'd need to move it along with the elevator as it cannot be linked, llVolumeDetect turns it and anything attached phantom. Link to comment Share on other sites More sharing options...
Innula Zenovka Posted November 30, 2018 Share Posted November 30, 2018 5 hours ago, Wandering Soulstar said: To use the detector prim I'd need to move it along with the elevator as it cannot be linked, llVolumeDetect turns it and anything attached phantom. Alternatively, you might have a linked detector prim that is normally solid but, when someone collides with it, briefly turns into PRIM_PHYSICS_SHAPE_NONE (and possibly gives them a gentle shove to stop them blocking the doorway). 1 Link to comment Share on other sites More sharing options...
animats Posted December 2, 2018 Share Posted December 2, 2018 What about just detecting the avi with a collision event, then tracking its position for a while to see how it moves? Link to comment Share on other sites More sharing options...
Wandering Soulstar Posted December 3, 2018 Author Share Posted December 3, 2018 @animats Thanks for the suggestion but is over the top for what I need and as well would require a lot of additional code. All I need to know is if anyone has come into the elevator or has left. Do not care about the individual, rather just the total number of passengers inside the elevator. Tracking the AV would mean keeping track of all that have entered, and considering the space inside is not extensive (it is an elevator after all) the changes in position would be minimal, with their location inside the elevator being irrelevant. Link to comment Share on other sites More sharing options...
Qie Niangao Posted December 3, 2018 Share Posted December 3, 2018 On 11/29/2018 at 6:08 AM, Wandering Soulstar said: Make the detector prim the same size as the elevator. On 11/30/2018 at 3:36 AM, Wandering Soulstar said: To use the detector prim I'd need to move it along with the elevator as it cannot be linked, llVolumeDetect turns it and anything attached phantom. Or the whole elevator shaft could be filled with one llVolumeDetect column that talks to the elevator cab object. One or the other might be scripted to check that any colliding agents are really within the elevator cab's volume -- as opposed to plunging to their death, riding the top of the cab, climbing the cables, or any other drama unfolding in this elevator shaft. 1 1 Link to comment Share on other sites More sharing options...
Wandering Soulstar Posted December 3, 2018 Author Share Posted December 3, 2018 1 hour ago, Qie Niangao said: as opposed to plunging to their death, riding the top of the cab, climbing the cables, or any other drama unfolding in this elevator shaft. ha ha ha 1 Link to comment Share on other sites More sharing options...
animats Posted December 3, 2018 Share Posted December 3, 2018 On 11/30/2018 at 6:32 AM, Innula Zenovka said: Alternatively, you might have a linked detector prim that is normally solid but, when someone collides with it, briefly turns into PRIM_PHYSICS_SHAPE_NONE (and possibly gives them a gentle shove to stop them blocking the doorway). I do something like that with my escalator. There's a small invisible pusher at the end to nudge riders off the steps and onto the platform. Otherwise they can get stuck, walking in place. 1 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