03-16-2006 12:03
I setup a monitoring cam system which uses FollowCam to do remote monitoring on another AV within cam sensor range. This is just a generic setup that folks can mess with. I posted here rather than library cause it's not something professionaly finished plus not something I would prefer lagging SL with. Basically just for experimenting and getting ideas. The method I used is a pretty laggish method but it makes it work. I think you could set it up for multiple "Security Camera"s with some additional code but that's for you to experiment with.

Security Camera Monitor (The AV monitoring wears this device)
CODE
camera(vector cam_pos, vector cam_offset)
{
llSetCameraParams([
CAMERA_ACTIVE, 1,
CAMERA_FOCUS, cam_offset,
CAMERA_POSITION, cam_pos + <0,0,0.25>,
CAMERA_POSITION_LOCKED, TRUE,
CAMERA_FOCUS_LOCKED, TRUE
]);
}

default
{
attach(key id)
{
if (id != NULL_KEY)
{
llRequestPermissions(id, PERMISSION_CONTROL_CAMERA);
}
}

run_time_permissions(integer perm)
{
if ((perm & PERMISSION_CONTROL_CAMERA) == PERMISSION_CONTROL_CAMERA)
{
llSetCameraParams([CAMERA_ACTIVE, 0]);
llOwnerSay("Camera permissions have been taken");

llListen(230, "Security Camera", NULL_KEY, "");
}
}

listen(integer channel, string name, key id, string message)
{
list parsed = llParseString2List(message, ["!"], []);

camera((vector)llList2String(parsed, 0), (vector)llList2String(parsed, 1));
}
}


Security Camera (On camera parent prim the Z axis is forward/back, X axis is up/down)
CODE
integer enabled = FALSE;

float range = 10.0; // Sense range in meters
rotation rot_init;
rotation rot_idle;

default
{
sensor(integer num_detected)
{
if (!llGetStatus(STATUS_PHYSICS))
llSetStatus(STATUS_PHYSICS | STATUS_BLOCK_GRAB, TRUE);

llLookAt(llDetectedPos(0), 0.80, 0.25);

llShout(230, (string)llGetPos() + "!" + (string)llDetectedPos(0));
}

no_sensor()
{
if (llGetStatus(STATUS_PHYSICS))
llSetStatus(STATUS_PHYSICS, FALSE);
}

touch_start(integer num_detected)
{
if (llDetectedKey(0) == llGetOwner())
{
if (!enabled)
{
rot_idle = llGetRot();

vector eul = llRot2Left(llGetRot());
eul *= 25;
eul *= DEG_TO_RAD;
rot_init = llEuler2Rot(eul);

llSetRot(llGetRot() * rot_init);

if (!llGetStatus(STATUS_PHYSICS))
llSetStatus(STATUS_PHYSICS | STATUS_BLOCK_GRAB, TRUE);

llMoveToTarget(llGetPos(), 1.0);

llSensorRepeat("", NULL_KEY, AGENT, range, PI, 0.5);

enabled = TRUE;
}
else
{
llSensorRemove();

if (llGetStatus(STATUS_PHYSICS))
llSetStatus(STATUS_PHYSICS, FALSE);

llSetRot(rot_idle);

enabled = FALSE;
}
}
}
}