Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
avatars:avatars [2024/04/08 20:27] – [Big Cat Avatars] kaahupahauavatars:avatars [2026/08/28 20:21] (current) – [Facial Expressions System] kaahupahau
Line 15: Line 15:
 Our first models was made in the size of 28 mm scale (tabletop figurines). On average, we found that the "Scaling Factor" of 10 during import gave perfectly sized components for OpenSim / Second Life.\\ Our first models was made in the size of 28 mm scale (tabletop figurines). On average, we found that the "Scaling Factor" of 10 during import gave perfectly sized components for OpenSim / Second Life.\\
 By now, we try to prepare the packages more thoroughly. As a result, you should always check an avatars pages instructions. In case you're unsure, try importing the mesh parts in OpenSim, find out the perfect settings for your needs, and only then upload them in Second Life. \\ By now, we try to prepare the packages more thoroughly. As a result, you should always check an avatars pages instructions. In case you're unsure, try importing the mesh parts in OpenSim, find out the perfect settings for your needs, and only then upload them in Second Life. \\
 +Scaling issues affect only the Avatars from Ironwood115 (Shark & Lion; Scaling factor x10) and from Silverim ( Dark Dragon and Light Dragon, scaling factor should be fixed ).
  
 Other steps typically include:\\ Other steps typically include:\\
Line 32: Line 33:
 And yes, it is like this because we somehow made an error and gave up trying to fix it in March 2024. Rotating the image is easy enough and just works. And yes, it is like this because we somehow made an error and gave up trying to fix it in March 2024. Rotating the image is easy enough and just works.
  
-==== Facial Expressions System ====+ 
 +====== Shork Industries Scripts ====== 
 + 
 +These scripts are the most up-to-date versions of the scripts we actively use: 
 + 
 +===== EarFlick Script - Left ===== 
 +<code> 
 +// Earflick / Sliding Door Script (with Euler-degree default rotation) 
 +// Author: Nebadon Izumi (modified 2026 for Earflick function by Yavannah Halostar @ OSGrid & @ Kitely) 
 +// Purpose: Accept object-editor Euler rotation in degrees and restore it on startup. 
 +// Notes: 
 +// - Provide the default rotation as an Euler vector in degrees exactly as shown 
 +//   in the object editor (format: <pitch, yaw, roll>). 
 +// - The script converts that Euler-degree vector to an LSL quaternion rotation 
 +//   using llEuler2Rot and applies it at state_entry so the object always 
 +//   returns to the configured default rotation when the script initializes. 
 + 
 +// --------------------------- CONFIGURATION --------------------------- 
 + 
 +// Rotation to apply when "open" (degrees and axis). 
 +// For right Ear, use these values: 
 +float RotationAngle = 45.0; // degrees to rotate 
 +vector RotationAxis = <-1, 0, 1>; // rotation axis 
 + 
 +// For left Ear, comment the above and uncomment these two lines instead: 
 +// float RotationAngle = 45.0; // degrees to rotate 
 +// vector RotationAxis = <0, -1, 1>; // rotation axis for left ear 
 + 
 +float Timer = 1.0; // how long the ear stays "open" before closing (seconds) 
 + 
 +// Sound settings (leave empty string "" to disable) 
 +string OpenSound = ""; // opening sound 
 +float OpenVol = 1.0; // opening volume 
 +string CloseSound = ""; // closing sound 
 +float CloseVol = 1.0; // closing volume 
 + 
 +// --------------------- DEFAULT ROTATION OPTIONS ---------------------- 
 +// Provide the default rotation as Euler angles in degrees exactly as shown 
 +// in the object editor. Example: <0.0, 0.0, 90.0> 
 +// 
 +// Set UseHardcodedDefault = TRUE to use DefaultEulerDeg below. 
 +// Set UseHardcodedDefault = FALSE to auto-detect the current rotation at startup. 
 +integer UseHardcodedDefault = TRUE; // TRUE = use DefaultEulerDeg; FALSE = auto-detect 
 + 
 +// Paste the editor Euler vector here (pitch, yaw, roll in degrees). 
 +// Example for 90 degrees around Z axis as shown in the editor: <0.0, 0.0, 90.0> 
 +vector DefaultEulerDeg = <0.0, 0.0, 90.0>; 
 + 
 +// --------------------------- INTERNALS ------------------------------- 
 +rotation StartRot;         // the rotation considered "closed" / default 
 +rotation RotationOffset;   // rotation to apply when "open" 
 +integer Open = 0;          // 0 = closed, 1 = open 
 + 
 +// Helper: degrees to radians 
 +float DEG2RAD = 3.14159265359 / 180.0; 
 + 
 +default 
 +
 +    state_entry() 
 +    { 
 +        // Determine StartRot from either the hardcoded Euler degrees or the current rotation 
 +        if (UseHardcodedDefault) 
 +        { 
 +            // Convert the editor-style Euler degrees to radians and then to a quaternion 
 +            // llEuler2Rot expects a vector of radians in the order <pitch, yaw, roll>. 
 +            StartRot = llEuler2Rot(DefaultEulerDeg * DEG2RAD); 
 +        } 
 +        else 
 +        { 
 +            // Auto-detect the current local rotation and treat it as the default 
 +            StartRot = llGetLocalRot(); 
 +            // Keep DefaultEulerDeg consistent for debugging; convert StartRot back to Euler 
 +            // Note: llRot2Euler returns radians; convert to degrees for DefaultEulerDeg 
 +            DefaultEulerDeg = llRot2Euler(StartRot) / DEG2RAD; 
 +        } 
 + 
 +        // Immediately set the object's rotation to the default rotation. 
 +        // This ensures that if the script was interrupted mid-rotation, 
 +        // the object will be restored to its intended default on initialization. 
 +        llSetLocalRot(StartRot); 
 + 
 +        // Pre-calc the rotation offset to apply when opening. 
 +        RotationOffset = llAxisAngle2Rot(RotationAxis, RotationAngle * DEG2RAD); 
 + 
 +        // Ensure the "open" flag is consistent with the closed StartRot. 
 +        Open = 0; 
 +    } 
 + 
 +    // Touch toggles the ear open/closed 
 +    touch_start(integer num) 
 +    { 
 +        Open = !Open; // toggle state 
 + 
 +        if (Open) 
 +        { 
 +            if (OpenSound != "") llTriggerSound(OpenSound, OpenVol); 
 +            // Apply the offset relative to the stored StartRot (default). 
 +            llSetLocalRot(StartRot * RotationOffset); 
 +            llSetTimerEvent(Timer); 
 +        } 
 +        else 
 +        { 
 +            if (CloseSound != "") llTriggerSound(CloseSound, CloseVol); 
 +            // Return to the stored StartRot (default). 
 +            llSetLocalRot(StartRot); 
 +            llSetTimerEvent(0); 
 +        } 
 +    } 
 + 
 +    // Collision also toggles the ear open/closed 
 +    collision_start(integer num) 
 +    { 
 +        Open = !Open; 
 + 
 +        if (Open) 
 +        { 
 +            if (OpenSound != "") llTriggerSound(OpenSound, OpenVol); 
 +            llSetLocalRot(StartRot * RotationOffset); 
 +            llSetTimerEvent(Timer); 
 +        } 
 +        else 
 +        { 
 +            if (CloseSound != "") llTriggerSound(CloseSound, CloseVol); 
 +            llSetLocalRot(StartRot); 
 +            llSetTimerEvent(0); 
 +        } 
 +    } 
 + 
 +    // When rezzed, reset the script so state_entry runs and the object 
 +    // is restored to the default rotation. 
 +    on_rez(integer param) 
 +    { 
 +        llResetScript(); 
 +    } 
 + 
 +    // Timer closes the ear after Timer seconds 
 +    timer() 
 +    { 
 +        if (CloseSound != "") llTriggerSound(CloseSound, CloseVol); 
 +        llSetLocalRot(StartRot); 
 +        llSetTimerEvent(0); 
 +        Open = 0; 
 +    } 
 +
 + 
 +</code> 
 + 
 +===== EarFlick Script - Right ===== 
 +<code> 
 +// Earflick / Sliding Door Script (with Euler-degree default rotation) 
 +// Author: Nebadon Izumi (modified 2026 for Earflick function by Yavannah Halostar @ OSGrid & @ Kitely) 
 +// Purpose: Accept object-editor Euler rotation in degrees and restore it on startup. 
 +// Notes: 
 +// - Provide the default rotation as an Euler vector in degrees exactly as shown 
 +//   in the object editor (format: <pitch, yaw, roll>). 
 +// - The script converts that Euler-degree vector to an LSL quaternion rotation 
 +//   using llEuler2Rot and applies it at state_entry so the object always 
 +//   returns to the configured default rotation when the script initializes. 
 + 
 +// --------------------------- CONFIGURATION --------------------------- 
 + 
 +// Rotation to apply when "open" (degrees and axis). 
 +// For right Ear, use these values: 
 +float RotationAngle = 45.0; // degrees to rotate 
 +vector RotationAxis = <1, 0, -1>; // rotation axis 
 + 
 +// For left Ear, comment the above and uncomment these two lines instead: 
 +// float RotationAngle = 45.0; // degrees to rotate 
 +// vector RotationAxis = <0, -1, 1>; // rotation axis for left ear 
 + 
 +float Timer = 1.0; // how long the ear stays "open" before closing (seconds) 
 + 
 +// Sound settings (leave empty string "" to disable) 
 +string OpenSound = ""; // opening sound 
 +float OpenVol = 1.0; // opening volume 
 +string CloseSound = ""; // closing sound 
 +float CloseVol = 1.0; // closing volume 
 + 
 +// --------------------- DEFAULT ROTATION OPTIONS ---------------------- 
 +// Provide the default rotation as Euler angles in degrees exactly as shown 
 +// in the object editor. Example: <0.0, 0.0, 90.0> 
 +// 
 +// Set UseHardcodedDefault = TRUE to use DefaultEulerDeg below. 
 +// Set UseHardcodedDefault = FALSE to auto-detect the current rotation at startup. 
 +integer UseHardcodedDefault = TRUE; // TRUE = use DefaultEulerDeg; FALSE = auto-detect 
 + 
 +// Paste the editor Euler vector here (pitch, yaw, roll in degrees). 
 +// Example for 90 degrees around Z axis as shown in the editor: <0.0, 0.0, 90.0> 
 +vector DefaultEulerDeg = <0.0, 0.0, 90.0>; 
 + 
 +// --------------------------- INTERNALS ------------------------------- 
 +rotation StartRot;         // the rotation considered "closed" / default 
 +rotation RotationOffset;   // rotation to apply when "open" 
 +integer Open = 0;          // 0 = closed, 1 = open 
 + 
 +// Helper: degrees to radians 
 +float DEG2RAD = 3.14159265359 / 180.0; 
 + 
 +default 
 +
 +    state_entry() 
 +    { 
 +        // Determine StartRot from either the hardcoded Euler degrees or the current rotation 
 +        if (UseHardcodedDefault) 
 +        { 
 +            // Convert the editor-style Euler degrees to radians and then to a quaternion 
 +            // llEuler2Rot expects a vector of radians in the order <pitch, yaw, roll>. 
 +            StartRot = llEuler2Rot(DefaultEulerDeg * DEG2RAD); 
 +        } 
 +        else 
 +        { 
 +            // Auto-detect the current local rotation and treat it as the default 
 +            StartRot = llGetLocalRot(); 
 +            // Keep DefaultEulerDeg consistent for debugging; convert StartRot back to Euler 
 +            // Note: llRot2Euler returns radians; convert to degrees for DefaultEulerDeg 
 +            DefaultEulerDeg = llRot2Euler(StartRot) / DEG2RAD; 
 +        } 
 + 
 +        // Immediately set the object's rotation to the default rotation. 
 +        // This ensures that if the script was interrupted mid-rotation, 
 +        // the object will be restored to its intended default on initialization. 
 +        llSetLocalRot(StartRot); 
 + 
 +        // Pre-calc the rotation offset to apply when opening. 
 +        RotationOffset = llAxisAngle2Rot(RotationAxis, RotationAngle * DEG2RAD); 
 + 
 +        // Ensure the "open" flag is consistent with the closed StartRot. 
 +        Open = 0; 
 +    } 
 + 
 +    // Touch toggles the ear open/closed 
 +    touch_start(integer num) 
 +    { 
 +        Open = !Open; // toggle state 
 + 
 +        if (Open) 
 +        { 
 +            if (OpenSound != "") llTriggerSound(OpenSound, OpenVol); 
 +            // Apply the offset relative to the stored StartRot (default). 
 +            llSetLocalRot(StartRot * RotationOffset); 
 +            llSetTimerEvent(Timer); 
 +        } 
 +        else 
 +        { 
 +            if (CloseSound != "") llTriggerSound(CloseSound, CloseVol); 
 +            // Return to the stored StartRot (default). 
 +            llSetLocalRot(StartRot); 
 +            llSetTimerEvent(0); 
 +        } 
 +    } 
 + 
 +    // Collision also toggles the ear open/closed 
 +    collision_start(integer num) 
 +    { 
 +        Open = !Open; 
 + 
 +        if (Open) 
 +        { 
 +            if (OpenSound != "") llTriggerSound(OpenSound, OpenVol); 
 +            llSetLocalRot(StartRot * RotationOffset); 
 +            llSetTimerEvent(Timer); 
 +        } 
 +        else 
 +        { 
 +            if (CloseSound != "") llTriggerSound(CloseSound, CloseVol); 
 +            llSetLocalRot(StartRot); 
 +            llSetTimerEvent(0); 
 +        } 
 +    } 
 + 
 +    // When rezzed, reset the script so state_entry runs and the object 
 +    // is restored to the default rotation. 
 +    on_rez(integer param) 
 +    { 
 +        llResetScript(); 
 +    } 
 + 
 +    // Timer closes the ear after Timer seconds 
 +    timer() 
 +    { 
 +        if (CloseSound != "") llTriggerSound(CloseSound, CloseVol); 
 +        llSetLocalRot(StartRot); 
 +        llSetTimerEvent(0); 
 +        Open = 0; 
 +    } 
 +
 +</code> 
 + 
 + 
 +===== Tailwiggle Bunny ===== 
 + 
 +<code> 
 +// Tail Wiggle Script for OpenSimulator 
 +// Default rotation: <0,0,90> 
 +// Random wiggles every 30...120 seconds 
 +// Touch = interrupt and excited wagging 
 + 
 +rotation gBaseRot; 
 + 
 +integer gBusy = FALSE; 
 +integer gTouched = FALSE; 
 + 
 +float DEG2RAD = PI / 180.0; 
 + 
 +//--------------------------------------------------------- 
 + 
 +rotation RotOffset(float x, float y, float z) 
 +
 +    return llEuler2Rot(<x,y,z> * DEG2RAD); 
 +
 + 
 +//--------------------------------------------------------- 
 + 
 +ResetTimer() 
 +
 +    llSetTimerEvent(10.0 + llFrand(50.0)); 
 +
 + 
 +//--------------------------------------------------------- 
 + 
 +SetBaseRotation() 
 +
 +    llSetRot(gBaseRot); 
 +
 + 
 +//--------------------------------------------------------- 
 + 
 +RotateRelative(float x, float y, float z) 
 +
 +    llSetRot(gBaseRot * RotOffset(x,y,z)); 
 +
 + 
 +//--------------------------------------------------------- 
 + 
 +DoNormalSequence() 
 +
 +    integer horizontal = (llFrand(2.0) < 1.0); 
 + 
 +    integer angle; 
 + 
 +    if (llFrand(2.0) < 1.0) 
 +        angle = 15; 
 +    else 
 +        angle = 30; 
 + 
 +    if (horizontal) 
 +    { 
 +        integer i; 
 + 
 +        for(i=0;i<3;i++) 
 +        { 
 +            if(gTouched) return; 
 + 
 +            RotateRelative(0,0, angle); 
 +            llSleep(0.18); 
 + 
 +            if(gTouched) return; 
 + 
 +            RotateRelative(0,0,-angle); 
 +            llSleep(0.18); 
 +        } 
 +    } 
 +    else 
 +    { 
 +        integer i; 
 + 
 +        for(i=0;i<2;i++) 
 +        { 
 +            if(gTouched) return; 
 + 
 +            RotateRelative(angle,0,0); 
 +            llSleep(0.22); 
 + 
 +            if(gTouched) return; 
 + 
 +            RotateRelative(-angle,0,0); 
 +            llSleep(0.22); 
 +        } 
 +    } 
 + 
 +    SetBaseRotation(); 
 +
 + 
 +//--------------------------------------------------------- 
 + 
 +DoTouchSequence() 
 +
 +    integer i; 
 + 
 +    for(i=0;i<5;i++) 
 +    { 
 +        RotateRelative(0,0,30); 
 +        llSleep(0.12); 
 + 
 +        RotateRelative(0,0,-30); 
 +        llSleep(0.12); 
 +    } 
 + 
 +    SetBaseRotation(); 
 +
 + 
 +//--------------------------------------------------------- 
 + 
 +default 
 +
 +    state_entry() 
 +    { 
 +        gBaseRot = llEuler2Rot(<0.0,70.0,0.0> * DEG2RAD); 
 + 
 +        SetBaseRotation(); 
 + 
 +        ResetTimer(); 
 +    } 
 + 
 +    on_rez(integer n) 
 +    { 
 +        llResetScript(); 
 +    } 
 + 
 +    timer() 
 +    { 
 +        if(gBusy) 
 +            return; 
 + 
 +        gBusy = TRUE; 
 +        gTouched = FALSE; 
 + 
 +        DoNormalSequence(); 
 + 
 +        gTouched = FALSE; 
 +        gBusy = FALSE; 
 + 
 +        ResetTimer(); 
 +    } 
 + 
 +    touch_start(integer total_number) 
 +    { 
 +        gTouched = TRUE; 
 + 
 +        SetBaseRotation(); 
 + 
 +        gBusy = TRUE; 
 + 
 +        DoTouchSequence(); 
 + 
 +        gTouched = FALSE; 
 +        gBusy = FALSE; 
 + 
 +        ResetTimer(); 
 +    } 
 +
 +</code> 
 +====== Facial Expressions System ======
  
 Facial expressions are provided by a scripted component, named "Eyecontroll (linkset)", we got from one of our supporters in OpenSim:\\  Facial expressions are provided by a scripted component, named "Eyecontroll (linkset)", we got from one of our supporters in OpenSim:\\ 
Line 53: Line 506:
 ---- ----
  
-Here is the list of the available and planned avatars from Shork Industries for OpenSim. +For the already deployed avatars, check the pages listed on he left beginning with "Avatar_" or "Avatars_".\\ 
-Some may be available in Second Lifetoo. +You may laugh, but we forgot to define exactly how our concurrent documentation processes should actually name the pages, so, as a result we had two people working on it - and two different naming conventions as a result.\\ 
- +Learn from it for your own projects.
- +
-==== Shark Avatar ==== +
-[[:avatars:avatars_shark|Detail page Shark avatars]] \\ +
-Also called "Shork Shark" or various other names, various species.\\ +
-Status: 100% (deployed to Wright Plaza on 2023-10 and on Shork Island). Also deployed to Second Life at Region Davros in "Japan Hiroba" and "Tabidachi Mall"; NCI Kuula in Kuula and at the Freebie Mall at the GNC Strandclub in "New Berlin GNC".\\ +
-Version 2.0 was deployed on 2024-01-28 and is considered feature complete. Additional / updated textures will be rolled out here or as separate update packages inside OpenSim.\\   +
-Primary Creator(s):  Ironwood115 @ Discord  / [[https://x.com/ironwood115?t=DlIoq_XKfac7kwAdFbJNkQ&s=09|X-formerly-known-as-Twitter]] \\ +
-Commissioning party: aries_quitex @ Discord \\ +
-Features: Full Perm, UV Maps, easy to mod;  moving eyes, blinking eyes (OpenSim Only!), different sets of fins and tail\\ +
-Desired, but missing features: Tail animation,  ear animation\\+
  
 +Below is the list of the still outstanding, but already planned avatars from Shork Industries for Open Simulator.
 +Some may be available in Second Life, too.
  
 +**Birds:**
 +  * Eagle
 +  * Owl
 +  * Blue-footed Boobie
  
-==== Enhanced Shark Avatar ==== +**Vulpines:** 
-StatusUnknown / Cancelled until further note\\ +  * Redfox 
-Creator(s): Juancho Renfold (SL)\\ +  * Arctic Fox 
-Commissioning party: kaahupahau Resident @ SL / Kaahupahau Sharpfang @ OS\\ +  * Fennec
-Features: Blinking eyes, swishing tail, talking jaw\\+
  
-==== Big Cat Avatars ==== +**Canines:** 
-[[:avatars:avatars_big_cat|Detail page Big Cat avatars]] \\ +  * Dalmatian 
-Status: 100% complete and deploying\\ +  * Golden Retriever 
-Primary Creator(s):  Ironwood115 @ Discord  / [[https://x.com/ironwood115?t=DlIoq_XKfac7kwAdFbJNkQ&s=09|X-formerly-known-as-Twitter]] \\  +  * Husky/Malamute 
-   Lion Avatar +  * German Sheperd 
-Secondary Creator(s): \\ +  * Border Collie
-Commissioning party: aries_quitex @ Discord, Yavannah Halostar @ OpenSim, Kaahupahau Sharpfang @ OpenSim\\ +
-Features: Full Perm, UV Maps, easy to mod; moving eyes, different sets of tails for different poses. TalkJaw script, Blinking eyes  \\ +
-Desired, but missing features: tail animation,  ear animation\\+
  
 +**Lupine:**
 +  * Jackal
 +  * Coyote
 +  * North American Wolf
 +  * Timber Wolf
  
-==== Dragon Avatar ==== +**Big Cats:** 
-[[:avatars:avatars_dragon|Detail page Dragon avatars]] \\ +  * Lynx 
-Status: Finalizing\\ +  * Cheetah
-Primary Creator(s): [[https://www.furaffinity.net/user/silverim/|Silverim @ FA]] \\ +
-Commissioning party: Aries @ FA ; Nichelle Valois @ OSGrid ; Ralgar Snowflake @ Kik \\  +
-Features: Full Perm, UV Maps, easy to mod; moving eyes, different sets of tails for different poses. TalkJaw script, Blinking eyes, white & black skin sets\\+
  
-==== Crocodile Avatar ==== +**Equine:** 
-[[:avatars:avatars_crocodile|Detail page Crocodile avatars]] \\ +  * Palomino Texture, Brown Texture, White Texture 
-Status: \\ +  * "Anthro MLP" style equine Pink, Yellow, Blue, Black, White, Violet, Green )
-Primary Creator(s):\\ +
-Commissioning party:\\ +
-Features:\\+
  
 +**Lapine:**
 +  * Alternative Bunny Textures: Grey, Black, White, Mixed
 +  * Angora Bunny ( Floofy Bunny )
  
-==== Canine Avatar ==== +**Reptiles:** 
-[[:avatars:avatar_canine|Detail page Canine avatars]] \\ +  * Gecko Various colors 
-Status: \\ +  * Giant girdled lizard 
-Primary Creator(s):\\ +  * Comodo Dragon 
-Commissioning party:\\ +  * Sand Goanna
-Features: Husky / Malamute, German Shepherd, Golden Retriever, Dalmatian, Border Collie, Wolves (Timberwolf, ...) \\+
  
-==== Fox Avatar ==== +**Amphibians:** 
-[[:avatars:avatar_fox|Detail page Fox avatars]] \\ +  * Frog Various Species
-Status: \\ +  * Salamander 
-Primary Creator(s):\\ +  * Axolotl
-Commissioning party:\\ +
-Features: Arctic Fox, Fennec Fox, Red Fox, Black Fox\\+
  
-==== Bunny Avatar ==== 
-[[:avatars:avatar_bunny|Detail page Bunny avatars]] \\ 
-Status: \\ 
-Primary Creator(s):\\ 
-Commissioning party:\\ 
-Features:\\ 
  
Last modified: le 2024/04/08 20:27