Smooth Sliding Door: Difference between revisions
No edit summary |
No edit summary |
||
| Line 114: | Line 114: | ||
==See also== | ==See also== | ||
*[[ Script_Library | Script Library ]] | *[[ Script_Library | Script Library ]] | ||
[[Category:LSL Library|Smooth Sliding Door Script]] | |||
Revision as of 20:44, 13 October 2010
| LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Smooth Sliding Door Script
Introduction
It really annoys me that there are so many bad looking doors out there that jerk around. While you can use llSetPos for a sliding door you have no control at what speed it moves. This sliding door script i created because i wanted to time my sliding door movements with the door sounds i had. It uses llMoveToTarget to move the door, with the door temporally turning phantom as it moves.
In laggy sims it will behave a little bit funky .. the door sometimes seeming to zoom off to the side before popping into the correct final position as the door becomes a physical object. However, even with that defect it still looks much better IMHO
The Script
<lsl> // ******************************************************************** // // Basic Physical Sliding Door Script // by SimonT Quinnell // 11/07/2009 // // NOTE: If you are going to reposition the door, do it while the door is closed. // Otherwise it will try and use the old close position as a reference point. // // Licensed under the "OpenCollar License" // Ie. Licensed under the GPLv2, with the additional requirement that these scripts remain "full perms" in Second Life. // // Edit: Simplified the script to be just a basic move script .. removed the sound triggers (5/1/2010) // // ********************************************************************
// ********************************************************************
// CONSTANTS
// ********************************************************************
// Movement Constants vector OFFSET = <-2.0, 0.0, 0.0>; // Directional offset for moving the door in x,y,z coordinates float OPENTIME = 3.5; // Time taken to open door float CLOSETIME = 3.5; // Time taken to close door
// ********************************************************************
// Variables
// ********************************************************************
vector vPosition; rotation rRot; float omega=0.0; vector vTargetPos; integer bOpen = FALSE; integer bMoving = FALSE;
// ********************************************************************
// Functions
// ********************************************************************
MoveDoor()
{
if(!bOpen)
{ // Initial conditions
bOpen = TRUE;
rRot = llGetRot();
vPosition = llGetPos();
// Target Position
omega=OPENTIME/llVecDist(<0,0,0>,OFFSET);
vTargetPos = vPosition+OFFSET*rRot;
// Set the timer to cleanup position
llSetTimerEvent(OPENTIME);
}else
{
bOpen = FALSE;
// Target Position
omega=CLOSETIME/llVecDist(<0,0,0>,OFFSET);
vTargetPos = vPosition;
// Set the timer to cleanup position
llSetTimerEvent(CLOSETIME);
}
// Set Door Physical and move it
bMoving = TRUE;
llSetStatus(STATUS_PHANTOM, TRUE);
llSetStatus(STATUS_PHYSICS, TRUE);
llMoveToTarget(vTargetPos,omega);
}
default
{
state_entry()
{ // Initial conditions
rRot = llGetRot();
vPosition = llGetPos();
}
touch_start(integer num_detected)
{
MoveDoor();
}
timer()
{
// Clean up Position
bMoving = FALSE;
llSetTimerEvent(0.0);
llSetStatus(STATUS_PHYSICS, FALSE);
llSetStatus(STATUS_PHANTOM, FALSE);
llSetPrimitiveParams([ PRIM_POSITION, vTargetPos, PRIM_ROTATION, rRot ]);
}
}</lsl>