Expression Randomizer by Extraltodeus

Plugins Expression Randomizer by Extraltodeus

HUGE THANKS TO EVERLASTER FOR THIS VERSION!

He took it and ran with it.. lots of improvements and new features:

Usage tips

The built in presets should be useful as starting points for custom presets. You can save your own presets and load them with triggers during a scene's playback.

Use Glance by acidbubbles for realistic eye movement and better blinking

You can randomize the plugin's parameters with FloatParamRandomizerEE by everlaster, making the expressions even more dynamic.

You can also combine multiple ExpressionRandomizers on the same atom, as long as they're adjusting different morphs.

The better morphs you have available, the better results you will get. You can use morphs from morph packs or create custom morphs with Morph Merge and Split by ceq3. See Using custom morphs below.

Creating a good expression preset
Since the plugin randomizes morph values, it's important to set the Minimum value and Maximum value such that you don't randomly get an overly distorted expression when all morphs happen to hit a very high or very low value. The plugin applies expressions in loops, and at the start of each loop, each morph gets a different random target value within the min-max range.

Here's a workflow that might be useful:

1. set min and max to the same value, e.g. both to 1.00
2. turn off random chances for transitions

Now all morphs that are selected get a new target value at every loop, and always adjust to the same value since min and max are equal. The expression you get now is the most extreme possible expression. If this looks ugly, adjust the max value and toggle morphs on/off until you're happy.

You can also do the same with the min value if you intend to apply negative values on the selected morphs. For most morphs, extreme negative values don't work well since the morphs are designed to be used at positive values. But in theory you can set both min and max to the same negative value and see what the most extreme negative-valued expression is, and again if that looks bad then increase the min value, and/or select different morphs.

With this above method you can pretty easily calibrate the min and max values, so that any expressions that you get with randomization between those min and max is not going to be too extreme.

Using custom morphs

The plugin searches for morphs from regions that contain "Pose" or "Expressions" (partial match, case sensitive). To get custom morphs to show up in the plugin, just make sure the region contains one of these two, and not any of the below excluded regions.

Morphs don't technically have to be flagged as pose morphs, but it's recommended that they are. Just set "isPoseControl" to "true" in the morph .vmi file.

Morphs whose region contains one of these (partial match, case sensitive) are not recognized by the plugin:
"Arms"
"Body"
"Chest"
"Finger"
"Hip"
"Legs"
"Neck"
"Feet"
"Waist"
"Torso"
"Hands"
"Eyes Closed Left"
"Eyes Closed Right"
"Mouth Smile Simple Left"
"Mouth Smile Simple Right"
"Pose Controls/JCM"


Change log TL;DR

  • improved built-in presets
  • 2 slots for storing user presets in plugin memory & scene
  • save presets to file, load via UI or triggers
  • vastly improved UI design and user experience
  • vastly improved UI performance, no more massive fps drops when loading a lot of morphs into the UI
  • improved randomness, better transitions
  • lots of small fixes and general improvements
Check the updated description for usage tips and screenshots.

Full update notes


Improved built-in presets
  • Idle: a subtle, slowly changing smile expression
  • Flirt: very expressive - some lip biting, smiling, narrowing the eyes, raising eyebrows, flirty looks
  • Enjoy: eyelid movement, mouth opening and closing, simple smiles - to express satisfaction/pleasure with a bit of surprise mixed in
It will transition the expression smoothly when switching between presets, or when turning morphs on/off.

The built-in presets can be loaded via triggers as well (in the scene, programmatically via other plugins etc.)

User presets and preset file saving/loading
  • 2 slots to save presets in plugin's memory, these are also stored to the scene and the overall person plugins preset
  • save and load presets to/from file (location: Saves/PluginData/ExpressionRandomizer/Presets)
  • if preset files exist the correct path within a .var, the .var shows up in the list of shortcuts like with other resource types in VAM
  • save to new folder: add / to the save name, e.g. "NewFolder/newpreset.json"
  • load both the memory and file presets with triggers in the scene
Improved UI design and usability
  • redesigned UI, but still more or less recognizable when comparing to the original
  • no need for scrolling
  • paging for the morphs list - much easier to navigate!
  • region selection popup: filtering is much more powerful now with region, text filter or both (and active only filter as well)
  • morphs are sorted alphabetically
  • collision trigger popup is now scrollable and opens upwards
  • Minimum value can't be more than Maximum value, Maximum value can't be less than Miniumum value
  • etc., lots of small usability considerations to make sure actions feel intuitive
Morph initial states

Generally the initial states of morphs should be 0 and disabling the plugin's control over morphs should restore that. The earlier version didn't take some situations into account:
  • morphs are restored to their initial values when the plugin is disabled
  • initial state is updated when the morph is toggled back on again - in case the morph was adjusted elsewhere/manually while it was not adjusted by the plugin
  • morphs are saved to scene JSON in their initial states so that loading the scene doesn't put the initial state to whatever generated expression was active when the scene was saved
Excluded morphs:
  • Joint Correct JCM morphs
  • Torso region morphs
  • Hands region morphs
  • Any morphs with bone morphs (animation not recommended)
  • Jaw Side-Side morph (doesn't seem to do anything)
  • Duplicate morphs (based on morph region and displayName; only the first found morph is loaded)
Other:
  • selecting None on collision trigger popup now correctly clears the trigger action from the previously selected collision trigger
  • ensure the custom collision trigger action is removed when plugin is removed
  • respect Freeze Motion/Sound
Improved UI performance
  • a lot fewer UI elements are created, and there is no longer a big framerate drop when having the UI open if lot of morphs are installed
  • UI elements are created on demand when entering the UI for the first time
  • UI loads much more quickly when a lot of morphs are installed
Improved randomness, better transitions
  • "Random chances for transitions" is now enabled by default
  • the random chance now applies per-morph, rather than on the entire set of selected morphs - on some frames you might get morphs A, B and D to update, on other frames you might get B, C and D to update, etc., making expressions more dynamic
  • transition smoothly from one preset to another, or when toggling individual morph on/off - possible to trigger presets or morphs as part of a scene's playback without it looking jerky
Other
  • removed the weird "animatable morphs" implementation, no idea what that even was and it didn't seem to do anything
  • master speed slider min value 0.1 instead of 0
  • reset used expressions at loop to work also for negative morph values
  • changing gender is detected and a message is printed to recommend reloading the plugin (because opposite gender morphs are loaded)
  • "Reset used expressions at loop" works also for negative morph values
Technical stuff:
  • identified morphs are not stored in memory, no need to constantly find the morphs to adjust from among all loaded morphs on the installation (should be a bit fewer hiccups)
  • round morph values to 3 decimals (reduces number of morph value syncs on geometry with no visual impact)
  • morph updates now happen per frame instead of per physics update (since that's how VAM updates morphs generally)
  • always save only non-default plugin parameters values to the person plugin preset save file, preventing a potentially hundreds of morphs long list from being stored unnecessarily
Back
Top Bottom