OsGetSitTargetPos
From OpenSimulator
(Difference between revisions)
JeffKelley (Talk | contribs) m |
JeffKelley (Talk | contribs) m (Example added) |
||
Line 25: | Line 25: | ||
[12:45] Object: <1.000000, 2.000000, 3.000000> | [12:45] Object: <1.000000, 2.000000, 3.000000> | ||
[12:45] Object: <4.000000, 5.000000, 6.000000> | [12:45] Object: <4.000000, 5.000000, 6.000000> | ||
+ | </source> | ||
+ | <source lang="lsl"> | ||
+ | // Sit Adjuster, Jeff Kelley, 2024 | ||
+ | // | ||
+ | // This script allows interactive adjustment of the seat position. | ||
+ | // Put the script in a seat, then sit. Mode (POSITION or ROTATION), | ||
+ | // avatar position and avatar rotation are displayed in green. | ||
+ | // Adjust the position using the arrow keys + PageUp/PageDown. | ||
+ | // Once satisfied, click on the seat to enter ROTATION mode | ||
+ | // and adjust the rotation. Toggle between POSITION and ROTATION | ||
+ | // as many times as necessary. Finally, standup. The new sittarget | ||
+ | // is now written, and the script deletes itself. | ||
+ | // | ||
+ | // PLEASE NOTE - It is strongly advised to disable the setting : | ||
+ | // Preferences > Move&View > Reset camera position on avatar movement | ||
+ | // so the camera won't jump when you hit the arrow keys. | ||
+ | |||
+ | |||
+ | //////////////////// | ||
+ | // Avatar ajustement | ||
+ | //////////////////// | ||
+ | |||
+ | integer MODE; | ||
+ | integer MODE_POS = 0; | ||
+ | integer MODE_ROT = 1; | ||
+ | |||
+ | float increment = 0.005; // The smaller, the slower | ||
+ | vector DELTA_X = < 1, 0, 0 > * increment; | ||
+ | vector DELTA_Y = < 0, 1, 0 > * increment; | ||
+ | vector DELTA_Z = < 0, 0, 1 > * increment; | ||
+ | |||
+ | vector AvatarPos; // Memorize last position | ||
+ | rotation AvatarRot; // Memorize last rotation | ||
+ | |||
+ | vector GetAvatarPos() | ||
+ | { | ||
+ | integer nprims = llGetNumberOfPrims(); // Last link = avatar | ||
+ | list l = llGetLinkPrimitiveParams (nprims, [PRIM_POS_LOCAL]); | ||
+ | AvatarPos = llList2Vector (l,0); | ||
+ | return AvatarPos; | ||
+ | } | ||
+ | |||
+ | rotation GetAvatarRot() | ||
+ | { | ||
+ | integer nprims = llGetNumberOfPrims(); // Last link = avatar | ||
+ | list l = llGetLinkPrimitiveParams (nprims, [PRIM_ROT_LOCAL]); | ||
+ | AvatarRot = llList2Rot (l,0); | ||
+ | return AvatarRot; | ||
+ | } | ||
+ | |||
+ | SetAvatarPos(vector pos) | ||
+ | { | ||
+ | integer nprims = llGetNumberOfPrims(); // Last link = avatar | ||
+ | llSetLinkPrimitiveParamsFast (nprims, [PRIM_POS_LOCAL, pos]); | ||
+ | } | ||
+ | |||
+ | SetAvatarRot(rotation rot) | ||
+ | { | ||
+ | integer nprims = llGetNumberOfPrims(); // Last link = avatar | ||
+ | llSetLinkPrimitiveParamsFast (nprims, [PRIM_ROT_LOCAL, rot]); | ||
+ | } | ||
+ | |||
+ | |||
+ | Move(vector deltapos, vector deltarot) | ||
+ | { | ||
+ | if (MODE == MODE_POS) | ||
+ | SetAvatarPos (GetAvatarPos() + deltapos); | ||
+ | |||
+ | if (MODE == MODE_ROT) | ||
+ | SetAvatarRot (GetAvatarRot() * llEuler2Rot(deltarot)); | ||
+ | |||
+ | DisplayInfos(); | ||
+ | } | ||
+ | |||
+ | /////////////////////////////// | ||
+ | // Sit/Unsit, keyboard bindings | ||
+ | /////////////////////////////// | ||
+ | |||
+ | integer KeysToBind = CONTROL_FWD | CONTROL_BACK | CONTROL_ROT_LEFT | ||
+ | | CONTROL_ROT_RIGHT | CONTROL_UP | CONTROL_DOWN; | ||
+ | vector drift; | ||
+ | |||
+ | Sit () | ||
+ | { | ||
+ | key avatar = llGetPermissionsKey(); | ||
+ | llTakeControls (KeysToBind, TRUE, FALSE); | ||
+ | MODE = MODE_POS; | ||
+ | DisplayUsage(); | ||
+ | DisplayInfos(); | ||
+ | drift = osGetSitTargetPos() - GetAvatarPos(); | ||
+ | } | ||
+ | |||
+ | Unsit () | ||
+ | { | ||
+ | key avatar = llGetPermissionsKey(); | ||
+ | llSitTarget (AvatarPos+drift, AvatarRot); | ||
+ | llReleaseControls (); | ||
+ | DisplayClear(); | ||
+ | |||
+ | llRemoveInventory (llGetScriptName()); | ||
+ | } | ||
+ | |||
+ | ////////// | ||
+ | // Display | ||
+ | ////////// | ||
+ | |||
+ | DisplayClear() | ||
+ | { | ||
+ | llSetText ("", <0,1,0>, 1.0); | ||
+ | } | ||
+ | |||
+ | DisplayInfos() | ||
+ | { | ||
+ | string text; | ||
+ | vector color; | ||
+ | GetAvatarPos(); | ||
+ | GetAvatarRot(); | ||
+ | |||
+ | if (MODE == MODE_POS) | ||
+ | { | ||
+ | text = "MODE POSITION"; | ||
+ | color = <0,1,0>; | ||
+ | } | ||
+ | |||
+ | if (MODE == MODE_ROT) | ||
+ | { | ||
+ | text = "MODE ROTATION"; | ||
+ | color = <1,1,0>; | ||
+ | } | ||
+ | |||
+ | text += "\n" + (string) AvatarPos; | ||
+ | text += "\n" + (string) (llRot2Euler(AvatarRot)*RAD_TO_DEG); | ||
+ | llSetText (text, color, 1.0); | ||
+ | } | ||
+ | |||
+ | DisplayUsage() | ||
+ | { | ||
+ | llWhisper (0, "Use arrow keys + PageUP/PageDown"); | ||
+ | llWhisper (0, "to adjust avatar position in X, Y et Z"); | ||
+ | llWhisper (0, "Click the seat to toggle between position ane rotation"); | ||
+ | llWhisper (0, "Standup to record the parameters in your seat"); | ||
+ | } | ||
+ | |||
+ | ///////////////// | ||
+ | // Event handlers | ||
+ | ///////////////// | ||
+ | |||
+ | default | ||
+ | { | ||
+ | state_entry() | ||
+ | { | ||
+ | // If the seat has a previous sittarget, use it as a starting point. | ||
+ | // Else, define a random sittarget for llAvatarOnSitTarget to work. | ||
+ | vector sitPos = osGetSitTargetPos(); | ||
+ | rotation sitRot = osGetSitTargetRot(); | ||
+ | |||
+ | if (sitPos == ZERO_VECTOR) | ||
+ | { | ||
+ | sitPos = <0,0,1.0>; | ||
+ | sitRot = ZERO_ROTATION; | ||
+ | } | ||
+ | |||
+ | llSitTarget (sitPos, sitRot); | ||
+ | DisplayClear(); | ||
+ | } | ||
+ | |||
+ | changed(integer change) | ||
+ | { | ||
+ | if (change & CHANGED_LINK) | ||
+ | { | ||
+ | key whosit = llAvatarOnSitTarget(); | ||
+ | if (whosit == NULL_KEY) Unsit (); | ||
+ | else llRequestPermissions (whosit, PERMISSION_TAKE_CONTROLS); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | run_time_permissions(integer perms) | ||
+ | { | ||
+ | if (perms == PERMISSION_TAKE_CONTROLS) Sit(); | ||
+ | } | ||
+ | |||
+ | touch_start (integer n) | ||
+ | { | ||
+ | MODE = ! MODE; | ||
+ | DisplayInfos(); | ||
+ | } | ||
+ | |||
+ | control (key id, integer level, integer edge) | ||
+ | { | ||
+ | integer start = level & edge; | ||
+ | integer end = ~level & edge; | ||
+ | |||
+ | if (level & CONTROL_FWD) { Move( DELTA_X, DELTA_Y); } // Up arrow | ||
+ | if (level & CONTROL_BACK) { Move(-DELTA_X, -DELTA_Y); } // Down arrow | ||
+ | if (level & CONTROL_ROT_LEFT) { Move( DELTA_Y, DELTA_Z); } // Left arrow | ||
+ | if (level & CONTROL_ROT_RIGHT) { Move(-DELTA_Y, -DELTA_Z); } // Right arrow | ||
+ | if (level & CONTROL_UP) { Move( DELTA_Z, DELTA_X); } // Page up | ||
+ | if (level & CONTROL_DOWN) { Move(-DELTA_Z, -DELTA_X); } // Page down | ||
+ | } | ||
+ | } | ||
</source> | </source> | ||
|description= | |description= |
Revision as of 02:25, 1 March 2024
vector osGetSitTargetPos()
| |
Return the sit target location as set by llSitTarget. | |
Threat Level | This function does not do a threat level check |
Permissions | Use of this function is always allowed by default |
Extra Delay | 0 seconds |
Example(s) | |
// Unit test : Writing then reading SitTarget default { state_entry() { vector write_pos = <1,2,3>; vector write_rot = <4,5,6>; llSitTarget (write_pos, llEuler2Rot(write_rot * DEG_TO_RAD)); vector read_pos = osGetSitTargetPos(); vector read_rot = llRot2Euler (osGetSitTargetRot()) * RAD_TO_DEG; llOwnerSay (read_pos); llOwnerSay (read_rot); } } [12:45] Object: <1.000000, 2.000000, 3.000000> [12:45] Object: <4.000000, 5.000000, 6.000000> // Sit Adjuster, Jeff Kelley, 2024 // // This script allows interactive adjustment of the seat position. // Put the script in a seat, then sit. Mode (POSITION or ROTATION), // avatar position and avatar rotation are displayed in green. // Adjust the position using the arrow keys + PageUp/PageDown. // Once satisfied, click on the seat to enter ROTATION mode // and adjust the rotation. Toggle between POSITION and ROTATION // as many times as necessary. Finally, standup. The new sittarget // is now written, and the script deletes itself. // // PLEASE NOTE - It is strongly advised to disable the setting : // Preferences > Move&View > Reset camera position on avatar movement // so the camera won't jump when you hit the arrow keys. //////////////////// // Avatar ajustement //////////////////// integer MODE; integer MODE_POS = 0; integer MODE_ROT = 1; float increment = 0.005; // The smaller, the slower vector DELTA_X = < 1, 0, 0 > * increment; vector DELTA_Y = < 0, 1, 0 > * increment; vector DELTA_Z = < 0, 0, 1 > * increment; vector AvatarPos; // Memorize last position rotation AvatarRot; // Memorize last rotation vector GetAvatarPos() { integer nprims = llGetNumberOfPrims(); // Last link = avatar list l = llGetLinkPrimitiveParams (nprims, [PRIM_POS_LOCAL]); AvatarPos = llList2Vector (l,0); return AvatarPos; } rotation GetAvatarRot() { integer nprims = llGetNumberOfPrims(); // Last link = avatar list l = llGetLinkPrimitiveParams (nprims, [PRIM_ROT_LOCAL]); AvatarRot = llList2Rot (l,0); return AvatarRot; } SetAvatarPos(vector pos) { integer nprims = llGetNumberOfPrims(); // Last link = avatar llSetLinkPrimitiveParamsFast (nprims, [PRIM_POS_LOCAL, pos]); } SetAvatarRot(rotation rot) { integer nprims = llGetNumberOfPrims(); // Last link = avatar llSetLinkPrimitiveParamsFast (nprims, [PRIM_ROT_LOCAL, rot]); } Move(vector deltapos, vector deltarot) { if (MODE == MODE_POS) SetAvatarPos (GetAvatarPos() + deltapos); if (MODE == MODE_ROT) SetAvatarRot (GetAvatarRot() * llEuler2Rot(deltarot)); DisplayInfos(); } /////////////////////////////// // Sit/Unsit, keyboard bindings /////////////////////////////// integer KeysToBind = CONTROL_FWD | CONTROL_BACK | CONTROL_ROT_LEFT | CONTROL_ROT_RIGHT | CONTROL_UP | CONTROL_DOWN; vector drift; Sit () { key avatar = llGetPermissionsKey(); llTakeControls (KeysToBind, TRUE, FALSE); MODE = MODE_POS; DisplayUsage(); DisplayInfos(); drift = osGetSitTargetPos() - GetAvatarPos(); } Unsit () { key avatar = llGetPermissionsKey(); llSitTarget (AvatarPos+drift, AvatarRot); llReleaseControls (); DisplayClear(); llRemoveInventory (llGetScriptName()); } ////////// // Display ////////// DisplayClear() { llSetText ("", <0,1,0>, 1.0); } DisplayInfos() { string text; vector color; GetAvatarPos(); GetAvatarRot(); if (MODE == MODE_POS) { text = "MODE POSITION"; color = <0,1,0>; } if (MODE == MODE_ROT) { text = "MODE ROTATION"; color = <1,1,0>; } text += "\n" + (string) AvatarPos; text += "\n" + (string) (llRot2Euler(AvatarRot)*RAD_TO_DEG); llSetText (text, color, 1.0); } DisplayUsage() { llWhisper (0, "Use arrow keys + PageUP/PageDown"); llWhisper (0, "to adjust avatar position in X, Y et Z"); llWhisper (0, "Click the seat to toggle between position ane rotation"); llWhisper (0, "Standup to record the parameters in your seat"); } ///////////////// // Event handlers ///////////////// default { state_entry() { // If the seat has a previous sittarget, use it as a starting point. // Else, define a random sittarget for llAvatarOnSitTarget to work. vector sitPos = osGetSitTargetPos(); rotation sitRot = osGetSitTargetRot(); if (sitPos == ZERO_VECTOR) { sitPos = <0,0,1.0>; sitRot = ZERO_ROTATION; } llSitTarget (sitPos, sitRot); DisplayClear(); } changed(integer change) { if (change & CHANGED_LINK) { key whosit = llAvatarOnSitTarget(); if (whosit == NULL_KEY) Unsit (); else llRequestPermissions (whosit, PERMISSION_TAKE_CONTROLS); } } run_time_permissions(integer perms) { if (perms == PERMISSION_TAKE_CONTROLS) Sit(); } touch_start (integer n) { MODE = ! MODE; DisplayInfos(); } control (key id, integer level, integer edge) { integer start = level & edge; integer end = ~level & edge; if (level & CONTROL_FWD) { Move( DELTA_X, DELTA_Y); } // Up arrow if (level & CONTROL_BACK) { Move(-DELTA_X, -DELTA_Y); } // Down arrow if (level & CONTROL_ROT_LEFT) { Move( DELTA_Y, DELTA_Z); } // Left arrow if (level & CONTROL_ROT_RIGHT) { Move(-DELTA_Y, -DELTA_Z); } // Right arrow if (level & CONTROL_UP) { Move( DELTA_Z, DELTA_X); } // Page up if (level & CONTROL_DOWN) { Move(-DELTA_Z, -DELTA_X); } // Page down } } | |
Notes | |
This function was added in 0.9.3.0 |