Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| avatars:avatars [2024/04/03 21:06] – [Big Cat Avatar] kaahupahau | avatars:avatars [2026/08/28 20:21] (current) – [Facial Expressions System] kaahupahau | ||
|---|---|---|---|
| Line 10: | Line 10: | ||
| Instead something useful for when you work with the Shork avatars or one day your own components: | Instead something useful for when you work with the Shork avatars or one day your own components: | ||
| - | To import the meshes correctly into OpenSim / Second Life, you need to select | + | To import the meshes correctly into OpenSim / Second Life, you sometimes might have change |
| {{ : | {{ : | ||
| - | Our models | + | Our first models |
| - | When you modify the scaling factor | + | By now, we try to prepare the packages more thoroughly. As a result, you should always check an avatars |
| - | For beginners we recommend to use the scaling factor 10, but when you know what you are doing and why, you can change | + | 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 ). |
| - | So, as a summary in List form:\\ | + | Other steps typically include:\\ |
| - | * Model Name: Give each component a meaningful name. Their internal names just aren't meaningful. | + | * Model Name: Give each component a meaningful name. Their internal names just aren't meaningful. When it is a complete avatar pack, i.e. several components in one package, you have to rename the parts when you " |
| - | * Tab " | + | * Tab " |
| - | * Tab " | + | * Tab " |
| Line 30: | Line 30: | ||
| {{ : | {{ : | ||
| In the Texture tab of the Edit window, | In the Texture tab of the Edit window, | ||
| - | Again, it just works best this way. When you want a different effect or create your own eye textures, play with these values to find your desired effect. | + | Again, it just works best this way. When you want a different effect or create your own eye textures, play with these values to find your desired effect.\\ |
| + | 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 ===== | ||
| + | < | ||
| + | // 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 | ||
| + | // | ||
| + | |||
| + | // --------------------------- CONFIGURATION --------------------------- | ||
| + | |||
| + | // Rotation to apply when " | ||
| + | // 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 " | ||
| + | |||
| + | // Sound settings (leave empty string "" | ||
| + | string OpenSound = ""; | ||
| + | float OpenVol = 1.0; // opening volume | ||
| + | string CloseSound = ""; | ||
| + | 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; | ||
| + | |||
| + | // 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; | ||
| + | rotation RotationOffset; | ||
| + | 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' | ||
| + | // 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, | ||
| + | |||
| + | // Ensure the " | ||
| + | Open = 0; | ||
| + | } | ||
| + | |||
| + | // Touch toggles the ear open/ | ||
| + | touch_start(integer num) | ||
| + | { | ||
| + | Open = !Open; // toggle state | ||
| + | |||
| + | if (Open) | ||
| + | { | ||
| + | if (OpenSound != "" | ||
| + | // Apply the offset relative to the stored StartRot (default). | ||
| + | llSetLocalRot(StartRot * RotationOffset); | ||
| + | llSetTimerEvent(Timer); | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | if (CloseSound != "" | ||
| + | // Return to the stored StartRot (default). | ||
| + | llSetLocalRot(StartRot); | ||
| + | llSetTimerEvent(0); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Collision also toggles the ear open/ | ||
| + | collision_start(integer num) | ||
| + | { | ||
| + | Open = !Open; | ||
| + | |||
| + | if (Open) | ||
| + | { | ||
| + | if (OpenSound != "" | ||
| + | llSetLocalRot(StartRot * RotationOffset); | ||
| + | llSetTimerEvent(Timer); | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | if (CloseSound != "" | ||
| + | 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 != "" | ||
| + | llSetLocalRot(StartRot); | ||
| + | llSetTimerEvent(0); | ||
| + | Open = 0; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== EarFlick Script - Right ===== | ||
| + | < | ||
| + | // 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 | ||
| + | // | ||
| + | |||
| + | // --------------------------- CONFIGURATION --------------------------- | ||
| + | |||
| + | // Rotation to apply when " | ||
| + | // 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 " | ||
| + | |||
| + | // Sound settings (leave empty string "" | ||
| + | string OpenSound = ""; | ||
| + | float OpenVol = 1.0; // opening volume | ||
| + | string CloseSound = ""; | ||
| + | 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; | ||
| + | |||
| + | // 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; | ||
| + | rotation RotationOffset; | ||
| + | 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' | ||
| + | // 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, | ||
| + | |||
| + | // Ensure the " | ||
| + | Open = 0; | ||
| + | } | ||
| + | |||
| + | // Touch toggles the ear open/ | ||
| + | touch_start(integer num) | ||
| + | { | ||
| + | Open = !Open; // toggle state | ||
| + | |||
| + | if (Open) | ||
| + | { | ||
| + | if (OpenSound != "" | ||
| + | // Apply the offset relative to the stored StartRot (default). | ||
| + | llSetLocalRot(StartRot * RotationOffset); | ||
| + | llSetTimerEvent(Timer); | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | if (CloseSound != "" | ||
| + | // Return to the stored StartRot (default). | ||
| + | llSetLocalRot(StartRot); | ||
| + | llSetTimerEvent(0); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Collision also toggles the ear open/ | ||
| + | collision_start(integer num) | ||
| + | { | ||
| + | Open = !Open; | ||
| + | |||
| + | if (Open) | ||
| + | { | ||
| + | if (OpenSound != "" | ||
| + | llSetLocalRot(StartRot * RotationOffset); | ||
| + | llSetTimerEvent(Timer); | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | if (CloseSound != "" | ||
| + | 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 != "" | ||
| + | llSetLocalRot(StartRot); | ||
| + | llSetTimerEvent(0); | ||
| + | Open = 0; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Tailwiggle Bunny ===== | ||
| + | |||
| + | < | ||
| + | // Tail Wiggle Script for OpenSimulator | ||
| + | // Default rotation: < | ||
| + | // 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(< | ||
| + | } | ||
| + | |||
| + | // | ||
| + | |||
| + | ResetTimer() | ||
| + | { | ||
| + | llSetTimerEvent(10.0 + llFrand(50.0)); | ||
| + | } | ||
| + | |||
| + | // | ||
| + | |||
| + | SetBaseRotation() | ||
| + | { | ||
| + | llSetRot(gBaseRot); | ||
| + | } | ||
| + | |||
| + | // | ||
| + | |||
| + | RotateRelative(float x, float y, float z) | ||
| + | { | ||
| + | llSetRot(gBaseRot * RotOffset(x, | ||
| + | } | ||
| + | |||
| + | // | ||
| + | |||
| + | 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; | ||
| + | { | ||
| + | if(gTouched) return; | ||
| + | |||
| + | RotateRelative(0, | ||
| + | llSleep(0.18); | ||
| + | |||
| + | if(gTouched) return; | ||
| + | |||
| + | RotateRelative(0, | ||
| + | llSleep(0.18); | ||
| + | } | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | integer i; | ||
| + | |||
| + | for(i=0; | ||
| + | { | ||
| + | if(gTouched) return; | ||
| + | |||
| + | RotateRelative(angle, | ||
| + | llSleep(0.22); | ||
| + | |||
| + | if(gTouched) return; | ||
| + | |||
| + | RotateRelative(-angle, | ||
| + | llSleep(0.22); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | SetBaseRotation(); | ||
| + | } | ||
| + | |||
| + | // | ||
| + | |||
| + | DoTouchSequence() | ||
| + | { | ||
| + | integer i; | ||
| + | |||
| + | for(i=0; | ||
| + | { | ||
| + | RotateRelative(0, | ||
| + | llSleep(0.12); | ||
| + | |||
| + | RotateRelative(0, | ||
| + | llSleep(0.12); | ||
| + | } | ||
| + | |||
| + | SetBaseRotation(); | ||
| + | } | ||
| + | |||
| + | // | ||
| + | |||
| + | default | ||
| + | { | ||
| + | state_entry() | ||
| + | { | ||
| + | gBaseRot = llEuler2Rot(< | ||
| + | |||
| + | 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(); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | ====== Facial Expressions System | ||
| Facial expressions are provided by a scripted component, named " | Facial expressions are provided by a scripted component, named " | ||
| Line 49: | Line 502: | ||
| * [[https:// | * [[https:// | ||
| + | Note: The Expression system is currently only available in OpenSim. | ||
| ---- | ---- | ||
| - | Here is the list of the available and planned | + | For the already deployed |
| - | Some may be available in Second Life, too. | + | You may laugh, but we forgot |
| - | + | Learn from it for your own projects. | |
| - | + | ||
| - | ==== Shark Avatar ==== | + | |
| - | [[: | + | |
| - | Also called | + | |
| - | Status: 100% (deployed | + | |
| - | Version 2.0 was deployed | + | |
| - | Primary Creator(s): | + | |
| - | 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, | + | |
| + | Below is the list of the still outstanding, | ||
| + | Some may be available in Second Life, too. | ||
| + | **Birds:** | ||
| + | * Eagle | ||
| + | * Owl | ||
| + | * Blue-footed Boobie | ||
| - | ==== Enhanced Shark Avatar ==== | + | **Vulpines:** |
| - | Status: Unknown / 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 Avatar ==== | + | **Canines:** |
| - | [[:avatars:avatars_big_cat|Detail page Big Cat avatars]] \\ | + | * Dalmatian |
| - | Status: 100% complete and deploying\\ | + | |
| - | Primary Creator(s): | + | * Husky/Malamute |
| - | Secondary Creator(s): \\ | + | |
| - | 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, | + | |
| + | **Lupine:** | ||
| + | * Jackal | ||
| + | * Coyote | ||
| + | * North American Wolf | ||
| + | * Timber Wolf | ||
| - | ==== Dragon Avatar ==== | + | **Big Cats:** |
| - | [[:avatars: | + | * Lynx |
| - | Status: Finalizing\\ | + | * Cheetah |
| - | Primary Creator(s): [[https:// | + | |
| - | 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: | + | * Palomino Texture, Brown Texture, White Texture |
| - | Status: \\ | + | * " |
| - | Primary Creator(s):\\ | + | |
| - | Commissioning party:\\ | + | |
| - | Features:\\ | + | |
| + | **Lapine:** | ||
| + | * Alternative Bunny Textures: Grey, Black, White, Mixed | ||
| + | * Angora Bunny ( Floofy Bunny ) | ||
| - | ==== Canine Avatar ==== | + | **Reptiles:** |
| - | [[: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: | + | * Frog ( Various Species) |
| - | Status: \\ | + | * Salamander |
| - | Primary Creator(s):\\ | + | * Axolotl |
| - | Commissioning party:\\ | + | |
| - | Features: Arctic Fox, Fennec Fox, Red Fox, Black Fox\\ | + | |
| - | ==== Bunny Avatar ==== | ||
| - | [[: | ||
| - | Status: \\ | ||
| - | Primary Creator(s): | ||
| - | Commissioning party:\\ | ||
| - | Features:\\ | ||
Last modified: le 2024/04/03 21:06
