diff --git a/README.md b/README.md index e69de29..d9a5ce4 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,119 @@ +# Rokoko Studio Live for Maya + +This plugin lets you stream animation data from Rokoko Studio into Maya. + +![pluginManager](images/pluginView.png) + +## Requirements + +Maya 2020 or higher + +## Installation + +* Download the plugin: `link` +* In Maya go to Windows -> Settings/Preferences -> Plug-in Manager + ![pluginManager](images/openPluginManager.png) +* Browse downloaded mll + ![browsePlugin](images/browsePlugin.png) +* And enable it + ![loadPlugin](images/loadPlugin.png) +* Go to script editor (Windows -> General Editors -> Script Editor) +and type `showRSLM` command + ![scriptCmd](images/scriptCmd.png) +* Select command text and middle click drag it onto the shelf + ![dragScript](images/dragScript.png) + +## Plugin anatomy + +Plugin's UI consists of 3 collapsible categories. + +![anatomy](images/anatomy.png) + +1. **Rokoko Studio Live** - Is the main category where user will see studio contents, map/unmap entities. +2. **Studio Command API** - Functionalities for calibrating and recording in Rokoko Studio. See [detailed description](https://rokokoelectronics.github.io/studio-command-api-docs/) here. +3. **Info** - Links to documentation and tutorials. + +# Usage + +First of all, make sure Rokoko Studio is running and live streaming **Custom** option is enabled. +Select `JSON v2` as data format and `UDP` as protocol. Leave `Port` and `Forward IP` values by default. +![enableStreaming](images/customStreaming.png) + +Than go to Maya and hit `Start Receiver` button. +You will see received objects below in a tree structure that resembles scene overview in Studio. +![startReceiver](images/startReceiver.png) + +## General workflow idea +All interactions between studio objects and maya objects are made by context menus. User selects +something in maya and this selection will be considered by context menu actions. +![ctxMenus](images/ctxMenus.gif) + +## Streaming virtual production data + +### Start streaming (Map objects) + +After starting the receiver, select the object in maya viewport that +you want to associate with studio object. Right click on studio object in tree view +and select `Map to selected objects` entry. +![mapProp](images/mapProp.gif) + +### Stop streaming (Unmap objects) +Right click on studio object in tree view and +select `Unmap selected objects` or `Unmap all` option. +![mapProp](images/unmapProp.gif) + +> **NOTE**: Same valid for tracker objects ( ) + +> **HINT**: Transformations applied to all 6 channels including scale. You may want to scale or offset your maya object, just put it into a group and map this group +instead. + +## Streaming character data + +After starting the receiver, right click on character studio object in tree view +and select `Create HIK skeleton`. Once new skeleton created select, right click character again +and select `Map to active character`. Currently active character in HIK panel will be mapped. + +![mapCharacters](images/mapCharacters.gif) + +> **NOTE**: In order to map your custom character, you must define it in HIK panel, +and set studio mapped character as source. + +## Streaming face data + +After starting the receiver, select geometry in maya viewport that hosts face blend shapes, right click on face studio object in tree view +and select `Map to selected objects`. After face geometry is mapped you need to map weight names, to do +that right click face studio object again and select `Automap weights`. +![faceMapping](images/faceMapping.gif) + +# Recording +To record objects, hit `Start Recording` button. All mapped objects will be recorded into keyframes. +![rec](images/recording.gif) + +> **NOTE**: Maya's current frame will be considered. Recorded frame range displayed in the right side of record button. +> If you make new recording on top of previous, keyframes will be updated. + +# How mapping works + +General approach used to map objects are maya's custom attributes. Custom attributes +is native thing and they are saved with maya scenes. Which means that our mapping information +will be preserved across maya sessions. + +For each object we create slightly different attributes. + +## Props and trackers + +In case of props and trackers we just add a single field with identifier. +![propID](images/propID.png) + +## Characters +In case of characters we map skeleton root bone (Hip). The rest of the bones will +be automatically detected during animation. +![charID](images/charID.png) +> **WARN**: Do not try to map custom skeletons. Plugin able to work only with hik generated skeletons + +## Faces +In case of faces we map blendshape nodes that connected to geometry. Custom compound attribute +will be added to each node. Besides face ID, we add 53 extra fields for each studio face shape. +![faceIDA](images/faceIDA.png) +This fields used to map blendshape's existing weight names. +![faceIDA](images/faceIDB.png) diff --git a/images/anatomy.png b/images/anatomy.png new file mode 100644 index 0000000..c197c00 Binary files /dev/null and b/images/anatomy.png differ diff --git a/images/browsePlugin.png b/images/browsePlugin.png new file mode 100644 index 0000000..d1a11a4 Binary files /dev/null and b/images/browsePlugin.png differ diff --git a/images/charID.png b/images/charID.png new file mode 100644 index 0000000..d0bf9de Binary files /dev/null and b/images/charID.png differ diff --git a/images/ctxMenus.gif b/images/ctxMenus.gif new file mode 100644 index 0000000..897eebc Binary files /dev/null and b/images/ctxMenus.gif differ diff --git a/images/customStreaming.png b/images/customStreaming.png new file mode 100644 index 0000000..2e1ae93 Binary files /dev/null and b/images/customStreaming.png differ diff --git a/images/dragScript.png b/images/dragScript.png new file mode 100644 index 0000000..f1ccfdd Binary files /dev/null and b/images/dragScript.png differ diff --git a/images/faceIDA.png b/images/faceIDA.png new file mode 100644 index 0000000..690c199 Binary files /dev/null and b/images/faceIDA.png differ diff --git a/images/faceIDB.png b/images/faceIDB.png new file mode 100644 index 0000000..d384180 Binary files /dev/null and b/images/faceIDB.png differ diff --git a/images/faceMapping.gif b/images/faceMapping.gif new file mode 100644 index 0000000..ef8470f Binary files /dev/null and b/images/faceMapping.gif differ diff --git a/images/loadPlugin.png b/images/loadPlugin.png new file mode 100644 index 0000000..9c92b2c Binary files /dev/null and b/images/loadPlugin.png differ diff --git a/images/mapCharacters.gif b/images/mapCharacters.gif new file mode 100644 index 0000000..97e15df Binary files /dev/null and b/images/mapCharacters.gif differ diff --git a/images/mapProp.gif b/images/mapProp.gif new file mode 100644 index 0000000..9416365 Binary files /dev/null and b/images/mapProp.gif differ diff --git a/images/openPluginManager.png b/images/openPluginManager.png new file mode 100644 index 0000000..f25abd5 Binary files /dev/null and b/images/openPluginManager.png differ diff --git a/images/pluginView.png b/images/pluginView.png new file mode 100644 index 0000000..4019f4b Binary files /dev/null and b/images/pluginView.png differ diff --git a/images/propID.png b/images/propID.png new file mode 100644 index 0000000..93e6ef8 Binary files /dev/null and b/images/propID.png differ diff --git a/images/recording.gif b/images/recording.gif new file mode 100644 index 0000000..ea4fa02 Binary files /dev/null and b/images/recording.gif differ diff --git a/images/scriptCmd.png b/images/scriptCmd.png new file mode 100644 index 0000000..4e5aaa7 Binary files /dev/null and b/images/scriptCmd.png differ diff --git a/images/startReceiver.png b/images/startReceiver.png new file mode 100644 index 0000000..c7ad5e1 Binary files /dev/null and b/images/startReceiver.png differ diff --git a/images/unmapCharacters.gif b/images/unmapCharacters.gif new file mode 100644 index 0000000..552e8f1 Binary files /dev/null and b/images/unmapCharacters.gif differ diff --git a/images/unmapProp.gif b/images/unmapProp.gif new file mode 100644 index 0000000..f58941f Binary files /dev/null and b/images/unmapProp.gif differ diff --git a/src/ui/receivercontent.cpp b/src/ui/receivercontent.cpp index de2aba6..2e93a7a 100644 --- a/src/ui/receivercontent.cpp +++ b/src/ui/receivercontent.cpp @@ -290,6 +290,7 @@ void ReceiverContent::populateTree() { QTimer::singleShot(250, [&](){ // populate props + treeWidget->clear(); auto props = Animations::get()->getProps(); QHash propsItemMap; foreach(auto prop, props) {