Difference between revisions of "Smooth Sliding Door"
Kira Komarov (talk | contribs) (Added auto-close feature.) |
|||
Line 111: | Line 111: | ||
} | } | ||
}</lsl> | }</lsl> | ||
==The Script with Auto-Close== | |||
[[User:Kira Komarov|Kira Komarov]]: A minor off-spin of the script above would be to add an auto-close feature so that the door slides back after a certain user-defined period of time. | |||
<lsl> | |||
// ******************************************************************** | |||
// | |||
// Basic Physical Sliding Door Script | |||
// by SimonT Quinnell edited by Kira Komarov | |||
// for auto-close. | |||
// 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 | |||
float AUTO_CLOSE_TIME = 5; // Time to auto-close the door | |||
// ******************************************************************** | |||
// Variables | |||
// ******************************************************************** | |||
vector vPosition; | |||
rotation rRot; | |||
float omega=0.0; | |||
vector vTargetPos; | |||
integer bOpen = FALSE; | |||
integer bMoving = FALSE; | |||
integer destTarget; | |||
// ******************************************************************** | |||
// 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); | |||
destTarget = llTarget(vTargetPos, llVecDist(<0,0,0>,OFFSET)); | |||
llMoveToTarget(vTargetPos,omega); | |||
} | |||
default | |||
{ | |||
state_entry() | |||
{ // Initial conditions | |||
rRot = llGetRot(); | |||
vPosition = llGetPos(); | |||
} | |||
at_target(integer tnum, vector targetpos, vector ourpos) { | |||
if(llVecDist(targetpos, ourpos) < 0.1) { | |||
// Clean up Position | |||
bMoving = FALSE; | |||
llSetStatus(STATUS_PHYSICS, FALSE); | |||
llSetStatus(STATUS_PHANTOM, FALSE); | |||
llSetPrimitiveParams([ PRIM_POSITION, vTargetPos, PRIM_ROTATION, rRot ]); | |||
llTargetRemove(destTarget); | |||
if(bOpen) { | |||
llSetTimerEvent(AUTO_CLOSE_TIME); | |||
} | |||
} | |||
} | |||
touch_start(integer num_detected) | |||
{ | |||
MoveDoor(); | |||
} | |||
timer() | |||
{ | |||
llSetTimerEvent(0.0); | |||
MoveDoor(); | |||
} | |||
} | |||
</lsl> | |||
==See also== | ==See also== | ||
*[[ Script_Library | Script Library ]] | *[[ Script_Library | Script Library ]] | ||
[[Category:LSL Library|Smooth Sliding Door Script]] | [[Category:LSL Library|Smooth Sliding Door Script]] |
Revision as of 06:35, 17 June 2011
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>
The Script with Auto-Close
Kira Komarov: A minor off-spin of the script above would be to add an auto-close feature so that the door slides back after a certain user-defined period of time.
<lsl> // ******************************************************************** // // Basic Physical Sliding Door Script // by SimonT Quinnell edited by Kira Komarov // for auto-close. // 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 float AUTO_CLOSE_TIME = 5; // Time to auto-close the door
// ******************************************************************** // Variables // ********************************************************************
vector vPosition; rotation rRot; float omega=0.0; vector vTargetPos; integer bOpen = FALSE; integer bMoving = FALSE; integer destTarget;
// ******************************************************************** // 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); destTarget = llTarget(vTargetPos, llVecDist(<0,0,0>,OFFSET)); llMoveToTarget(vTargetPos,omega);
}
default
{
state_entry() { // Initial conditions rRot = llGetRot(); vPosition = llGetPos(); } at_target(integer tnum, vector targetpos, vector ourpos) { if(llVecDist(targetpos, ourpos) < 0.1) { // Clean up Position bMoving = FALSE; llSetStatus(STATUS_PHYSICS, FALSE); llSetStatus(STATUS_PHANTOM, FALSE); llSetPrimitiveParams([ PRIM_POSITION, vTargetPos, PRIM_ROTATION, rRot ]); llTargetRemove(destTarget); if(bOpen) { llSetTimerEvent(AUTO_CLOSE_TIME); } } } touch_start(integer num_detected) { MoveDoor(); } timer() { llSetTimerEvent(0.0); MoveDoor(); }
} </lsl>