This document provides an overview of the Thingamajig application and brief descriptions of the application’s features and functions.
Note that this is an alpha version and it is expected that the application will undergo significant changes. We intend to update this documentation as the application changes, but may not update it for every change during the development cycle.
Scene Lobby
When the application first starts you are placed in the Scene Lobby. The Scene Lobby is a location outside of the current scene where Thingamajig scenes can be accessed. You can select the active scene as well as create, delete, clone, and share scenes.
You can move around the Scene Lobby freely in both vertical and horizontal directions by squeezing the grip button on your controller in either hand and moving it, similar to using a ski pole to pull yourself forward. Controllers with thumbsticks also provide continuous locomotion by pushing the thumbstick in the direction you want to move.
Scene bubbles
A Thingamajig scene is represented as a “bubble” in the Scene Lobby. The bubble displays a 360 degree rendering from the last location in the scene.
The scene bubble can be gripped with the trigger from either hand and positioned/sized within the Scene Lobby. Two hands can be used to change the size of the scene bubble.
The scene bubble for the active scene is indicated by a flow of golden particles emanating from the scene bubble. To make a scene the active scene (and transport to that scene) point at the scene bubble (or grip the scene bubble using the trigger button) and press the “enter scene” touchpad button. In the Scene Lobby, press the app menu button in either hand to return to the active scene.
Create scene/tutorial
Press the “new scene” button located under the Thingamajig title to create a new scene and a new scene bubble will appear. The tutorial button launches the tutorial, which is a series of panels to walk you through the basics of the Thingamajig application.
Clone and delete scenes
When a scene bubble is gripped with the trigger, two new buttons appear on the touchpad above the “enter scene” button. The “clone scene” button creates a copy of the gripped scene and the “delete scene” button deletes the gripped scene. To delete a scene, hold the delete button down long enough for the red circle that appears by the scene bubble to complete.
Shared scenes
There is a row of scene bubbles in the Scene Lobby underneath the Thingamajig title arranged along a scrolling table. These are sample scenes shared from the Thingamajig scene server. Grab one of these scenes and pluck it off the row to access the scene.
A suction cup like object appears at the end of the row. Attach a scene bubble to it and press the “Share Scene” button to share the scene with the Thingamajig server. Currently there is a single global shared feed for scenes.
A scene bubble with a green tint in the list indicates a scene that was shared by you.
NOTE: for this alpha release scene sharing is only intended to be used to send scenes to Thingamajig developers for bug reporting purposes. Shared scenes will not automatically appear in the shared scene feed.
Scene View
The scene view is where Thingamajig scenes are created. Each hand is equipped with a tool that provides various functionality.
Tool functionality is typically accessed using the trigger button on the controller, but the touchpad also provides virtual buttons (represented by icons) that control options for the tool.
Regardless of the type of the actual physical controller (e.g., Vive or Windows Mixed Reality), the virtual controller model appears the same and the touchpad is represented by a circular area toward the front of the controller.
The left hand tool is called the utility tool. It has the following touchpad buttons:
- Unod/Redo - press to undo/redo last action
- Snap - enable/disable grid snap
- Target snap - enable/disable target snap
- Teleport - press, hold, then release this button to move in the direction the tool is pointing
The utility tool’s app menu button brings up the Home Table (described in more detail later in this document).
The right hand tool is one of several feature tools that provide access to related sets of Thingamajig functionality. Note that we plan to make right/left hands swappable as a preference in the future.
The right hand controller’s app menu buttons brings up the tool selector to select from the different feature tools. More on the individual tools later in this document.
Navigation and Locomotion
There are several methods to move around in the scene other than physically moving within the play area:
- “Ski pole” - squeeze one controller grip button and move the controller’s position while the button is held down to move the play area within the scene. Squeezing the grip button is analogous to sticking a ski pole in the ground: the pole (controller) is stationary while the skier moves.
- Scale and rotate - squeeze both controller grips simultaneously to move, rotate, and scale the world. This is a bit like pinch-to-zoom on touch devices like phones and tablets. It is possible to move large distances by zooming out so the world is very small and then zooming in on the desired location.
- Teleport - Press and hold the utility tool’s teleport button (on the touchpad) and a ray will quickly extend in the direction the controller is pointed. Release the button to move the play area along the ray.
Snap
Thingamajig provides two snap modes: grid and target snap.
When grid snap is enabled, a grid lattice appears at the tool position to show the snap grid. The grid is often aligned to the world, but in some cases may be aligned to the coordinate system of a particular object. The grid also rotates in 45 degree increments based on the orientation of the controller.
When target snap is enabled, a blue target arrow appears at the controller location indicating the current target snap position.
The target snap icon will snap to features of objects such as vertices, edges, and faces.
The target snap icon will also show the snap orientation, which is aligned to the target object, but is also rotated in 90 degree increments based on the orientation of the controller.
Target snap often involves two snap points: the source point and the target point. For example, when using the Move/Rotate tool with target snap on, you first selects the snap source point using the controller’s trigger button. With the trigger button down, you can move the object around the scene and line up the source point with the desired target point. Then release the trigger to complete the move.
Target and grid snap can be used together. When target snap is on, the snap source point is the point that is aligned to the snap grid.
If target snap is off, but grid snap is on, the sides of the object’s bounding box are snapped to grid increments.
Home Table
The Home Table is a central place for accessing some key Thingamajig functionality: importing objects, accessing the Scene Lobby and Play Mode.
The Home Table is accessed by pressing the app menu button on the utility tool. While the app menu button is held down you can place the Home Table in a convenient location. Releasing the button places the table. Pressing the app menu button again dismisses it.
The home table has 4 primary “mallet buttons”, which can be activated by tapping them with the tool tip. You can also activate them by pointing the tool in either hand at them and pressing the trigger.
- Poly - browse objects from Google Poly
- Sketchfab - browse objects from Sketchfab
- Things - browse Things (described later in this document)
- Files - browse local GLTF files. This will show any GLTF files located in Documents/Thingamajig/Models
Search terms can be entered by typing on the provided mallet-button keyboard. Mallet-button tags appear above the keyboard (context sensitive based on search term) for quick access to tag-based searches.
Tap the Poly/Sketchfab/Things/Files buttons to start the search or bring back the keyboard to change the search term.
Search results are displayed as two rows (up to 5-per row) of result slots that initially show a thumbnail image. Trigger (with either hand) on an item to see a 3D preview and trigger-grip to place a copy of one of these objects into the scene.
While a result item is gripped you can also grip with the other hand to scale it. While gripped the tool touchpad changes to provide some additional options:
- Use original scale - don’t allow the size of the object to change. The object may be large or small relative to the current zoom level.
- Scale to fit - scale the size of the object to fit in the preview slot “box”. Actual size depends on the current zoom level.
- Align up - allow some rotation and scale, but keep the object aligned so it’s up axis points up (useful e.g., for placing trees)
Large arrow mallet-buttons appear on either side of the table to allow paging through search results.
Two additional buttons appear on the right side of the table to access the Scene Lobby and Play Mode, both described in more detail below.
Play Mode
Hit the play mode mallet-button from the Home Table to access play mode. Play mode allows you to experience the scene as it was created.
When play mode is active, tools disappear and a simple avatar appears to represent the player. Also scene gizmos, which are visible in create mode, are hidden so they don’t distract from the experience.
In play mode you can grab and interact with dynamic objects. You can navigate the scene by lightly touching the touchpad or using the joystick controller on Windows Mixed Reality or Index/Knuckles devices. Press the touchpad to jump.
Squeeze the grip to climb static objects. Squeeze the grip in open space to make a fist that will interact with dynamic objects, for example to punch a stack of boxes to knock them over. Press the trigger in open space to point and enable the tip of your index finger to interact with dynamic objects as well. On Index/Knuckles controller just point with your actual index finger for the same effect. Both the finger and fist in this mode will trigger switch and push button joints when touched.
Press the app menu button in either hand to exit play mode and return to create mode.
Note that Play Mode is in a very early state and we expect significant changes and enhancements in this area in the future.
Feature Tools
The app menu button on the right hand controller brings up the tool selector. With the app menu button held down, move the controller to highlight the desired tool disc. Each tool provides different functionality. The trigger button typically activates the primary function of the tool, but some tools have touchpad buttons that perform operations themselves, or set a mode that affects the operation of the tool.
The following are descriptions of individual tools:
Move/Rotate tool
Use to change the position and orientation of scene objects. This tool has the following touchpad options:
- Move - when enabled the tool will translate the object
- Rotate - when enabled the tool will rotate the object
- Axis limit - when enabled translation and rotation are limited to a single axis
- Plane limit - when enabled translation and rotation are limited to a single plane
When the tool is in constrain-to-axis or plane mode, a light blue gizmo appears showing the location of the axis or plane. The gizmo itself can be moved with either hand to define the constraint. While the axis or plane gizmo is gripped with the tool, the touchpad changes to provide the following options:
- Align to X
- Align to Y
- Align to Z - these align the axis or plane to one of the object’s local major axis Reset to origin - moves the gizmo back to the object’s origin (typically its center)
When the tool is not in axis/plane mode and an object is gripped, the utility tool in the other hand can also be used to grip the object at a second point. With two hands gripping the object, it can be scaled by moving the tools toward or away from each other (in a pinch-to-zoom like manner).
Scale/Stretch tool
Use to change the size of an object, including stretching along 1 or 2 local axis. This tool has the following touchpad options:
- Scale - scale the size of the object. When this mode is active a blue sphere/axis gizmo appears to mark the scale origin. Similar to the axis/plane constraint modes of the Move/Rotate tool, this gizmo can be positioned to define the scale origin to be any point.
- Stretch - scale the object along one or two axis. Note unlike scale, stretch is only applied to a single object and not a group (more on groups below).
- Lock axis - available in stretch mode, when activated the object will stretch along two axis instead of one. Use this to e.g., change the radius of a cylinder without changing its length.
Create Object tool
Use to create box, sphere, cylinder, cone, and torus shapes. This tool has the following touchpad options:
- Pick object - press and hold to select one of the object types
- Pick material - press and hold to select a material for the object
Press and hold the trigger to create a new object and define its shape. Both grid and target snap can be used in this process.
The creation plane is defined when the trigger is pressed, but the orientation of the controller selects which axis the plane is aligned to. E.g., point the controller vertically to define a vertically oriented cylinder and horizontally for a horizontal one.
Paint tool
Use to change the material of an object or add a color socket. This tool has the following touchpad options:
- Get material from scene - When this is enabled, use the trigger to select a material from an object in the scene.
- Show color socket - Add a color socket to the highlighted object, change the position of an existing color socket, or remove a color socket. A color socket allows wiring a color to the current material. To remove a color socket, drag it off of the object.
- Pick material - Select the current material
If the ‘get material from scene’ or 'show color socket' options are not enabled, pressing the trigger will assign the current material to the highlighted object in the scene.
Snap Point tool
Use to add snap points to objects as well as create jig objects. This tool has the following touchpad options:
-
Create/edit snap point - Create a snap point on an object, change the position of an existing snap point, or remove a snap point.
Snap points define additional snap targets beyond an object’s vertices, edges, and faces. They also have a slightly larger snap radius making them easier to snap to.
Another key feature of snap points is that all snap points of the gripped object are tested for snap with other scene snap points. Normally only the source snap point (indicated by the target snap icon) is considered.
Snap points are only active when target snap is on.
- Create/edit snap edge - Create an edge between two snap points. A snap edge can be set to have one or more subdivisions, each of which can hold an additional snap point.
-
Create/edit jig object - Create a standalone object that is made up of jig points, edges, and angles. Edges have snappable subdivisions based on the current zoom level.
Jig objects can be constructed with an arbitrary number of points and edges. Selecting three points define an angle, which is represented by an arc connecting the two edges. The radius of the arc can be adjusted and the arc has snap points at angle increments.
While a snap point is gripped, the touchpad changes to the following options:
- Align to object - rotate the snap point so it is aligned with the object’s major axis. Normally a snap point is aligned to the face or edge it is placed on.
- Align to origin - move the location of the snap point to the object’s origin (usual its center) and align it to the object’s local coordinates. Since the object’s origin can be placed (using the scale or move/rotate tool) this can be used to place snap points at completely arbitrary locations, including snapped to features of other objects.
While a snap edge is gripped, the touchpad changes to offer buttons to increment or decrement the number of edge subdivisions. Setting subdivisions to zero will remove the edge.
When two snap points snap together while gripping an object, if you hold the objects in position a circular timer appears. If you let the time complete, the two objects will be grouped together.
Snap points and angle-arcs can be selected and moved with either hand. When gripped, the touchpad offers options to clone and delete.
Group tool
Use to group objects together so they move/rotate/scale as a single entity. This tool has the following touchpad options:
- Group - A bubble appears (which can be increased or decreased in size by swiping on the touchpad). Pressing the trigger will group the objects in the bubble. Hold down the trigger and paint with the bubble to group multiple objects together.
- Ungroup - Break a group apart. Ungrouping happens in the reverse order from grouping. I.e., ungroup will undo the last grouping. When using this function the object or objects that will be ungrouped are highlighted yellow while the objects remaining in the group are highlighted orange.
- Ungroup all - Break apart all objects in the group. This will ungroup grouped objects, but will not separate components that are part of the same object even if they have no connecting edges or faces. Components that are part of the same object, but not otherwise connected can be separated using the ungroup or regroup functions.
- Regroup - A bubble appears like it does for the group function, but in this case individual objects are selected independently (when in the sphere volume) even if they are already in a group. Press the trigger (and/or hold it down and move the tool to select additional items) to group selected items, removing them from any group they might have previously been in. The regroup function is especially useful to break apart components from an existing model that might already have its own grouping. Models downloaded from Google Poly are often grouped by material rather than by object and this tool allows easy regrouping.
In ungroup and regroup modes it is possible to break single objects into multiple pieces. Objects can be split as long as there are parts of the geometry that are not connected (by edges or faces) to other parts of the object.
Clone/Delete tool
Use to delete objects and wires as well as make copies of objects. This tool has the following touchpad options:
- Clone - Clone an object or collection of interdependent objects
- Delete - Delete an object or collection of interdependent objects. Can also be used to delete an individual wire (more on wires later in this document).
Note clone and delete will affect an object and all the objects it is attached to via joints or wires.
Thing tool
Use to define new “Things”. A Thing is a collection of one or more interdependent objects. To save a creation for easy re-use in other scenes, define it as a Thing and it will be available in the Home Table’s Thing search. This tool has the following touchpad options:
-
Define thing - Point at an object to define a new thing. A glass box appears to show the group
of objects that make up the Thing. Click and hold the trigger to place the Thing definition
table in a similar manner as placing the Home Table.
The Thing definition table allows you to specify a name and description for the new Thing.
-
Set attribution - Press and hold the trigger to place the attribution definition table.
This lets you enter the author name and copyright information. This information will be embedded
in each subsequent Thing defined with the tool
-
Show attribution - Point at objects to see their attribution information. Press and hold the
trigger to see more details and access links to the original sources.
Physics tool
Use the physics tool to move objects using physics, which prevents them from interpenetrating. The physics tool is also used to specify which objects are active parts of the physics simulation (dynamic and moveable) and which are part of the environment (static and stationary). This tool has the following touchpad options:
-
Enable physics - This option is available when an object is highlighted or gripped. Select this
touchpad button to toggle whether this object is dynamic and affected by physics. When highlighted
white the object is enabled and dyanamic in the physics simulation.
-
Weight - This option is available when an object is highlighted or gripped. Select this
touchpad button to toggle between 3 possible options for the object's mass and density:
light weight, medium weight and heavy weight. The resulting mass is based on this selection
and the approximate volume of the object and is displayed in a panel next to the object.
- Pause physics - Pause/resume the physics simulation.
- Reset physics - Returns each object with physics enabled to their initial position and rotation. The initial position/rotation is the position the object was in when it was made dynamic (physics enabled).
Press the trigger when no other object is highlighted to extend a finger-like object from the physics tool. The finger will collide and interact with other dynamic physics objects and provides a convenient way to test dynamic objects in your scene. It will also activate switch and push button joints.
Wires and Sockets
Thingamajig provides a system of wires and sockets to connect objects together allowing the value of one object to define the value of another (or others).
For example, a hinge joint can be used to create a lever and the lever’s hinge angle can then drive another value. That other value could be the angle of a different hinge or another type of value altogether, such as the volume of an audio source for example.
Wires are directionless and have no ‘input’ or ‘output’ side. When a value in a wire network changes, all wire-connected values are updated with the new value.
Wires are connected to sockets, which are represented by small black spheres. Press the trigger when a socket is highlighted (with any tool) to drag out a wire. The wire can then be connected to another socket. Additionally the wire value can be edited by pausing briefly with the wire gripped; a panel will appear from the wire with a control to edit the wire value.
Wire Value Types:
- Single value (scalar)
- Color
- Rotation
- On/off (boolean)
- Trigger - similar to boolean, but rather than a continuous on/off value the trigger value represents a transition of some value between on and off. For example, a trigger object converts a scalar value to an on/off type based on a threshold value. The trigger object has an on/off value which provides the current state, but also a trigger value which fires when the trigger state changes.
Category IDs
Category IDs are a simple way to specify a category from a selection of 36 options. Category IDs are represented by one of six shapes (star, hexagon, diamond, triangle, circle, and square) and six colors (pink, purple, blue, green, yellow, and red), which when combined result in 36 variations.
When you see a category ID on a gizmo in the scene, clicking on it with the trigger will bring up the category ID selector to choose a specific category (color/shape combo).
Category IDs are used to associate two or more objects together by matching categories. What these associations mean precisely depends on the object. They are currently used by proximity sensors, thing emitter/sources, and transporters (described in more detail later in this document).
For example, proximity sensor objects use category IDs to filter what types of objects trigger the sensor. A proximity sensor is only triggered by a category tag object if the category IDs match.
Built-in Things
As described earlier in this document, you can define Things from objects in your scene to make them easily reusable in other scenes. Thingamajig also includes a set of built-in things, which are typically gizmo-type objects providing special functionality.
Built-in Things include:
- Environment - Sets the time-of-day cycle
- Light - A point or spotlight with an adjustable cone. Also has properties to set the intensity, range and color.
- Wave generator - Generates a cyclic animating scalar value typically used to drive animator objects
- Trigger - Converts scalar values to on/off based on a threshold
- Color animator - Color keyframe animator
- Rotation animator - Rotations (quaternion) keyframe animator
- Scalar animator - Scalar (singe value) keyframe animator
- Color value animator - animates colors via a trigger
- Rotation value animator - animates rotations via a trigger
- Scalar value animator - animates scalars via a trigger
- Audio source - Places a sampled sound clip into the scene, with support for spatialized audio.
- Force - Adds a force (part of the physics simulation) to a group of objects. Use the group tool to weld the force object to the group for which the force is to be applied
- Ball joint - Connects two object with a ball joint (3 rotational degrees of freedom)
- Hinge joint - Connect two objects with a hinge joint (1 rotation degree of freedom)
- Sliding joint - Connect two objects with a sliding joint (1 position degree of freedom)
- Spring joint - Connect two objects with a spring with adjustable tension and strength
- Lookat joint - Make an object (or group) rotate to point at another object (or group)
- Path joint - Move a group of objects along a path
- Switch joint - An on/off lever type switch joint
- Push button joint - A joint for making push buttons. Has a parameter to control the push depth and an on/off parameter to control whether the joint remains pushed.
- Mount object - The mount object is a gizmo that is visible in play mode and allows the player to “mount” and object (e.g., enter a vehicle). When the user is mounted the play area is locked to the mount object and will move/rotate with it. The player can also use controller buttons to activate mount object sockets while mounted.
- Camera object - Represents a scene camera. The output of the camera is displayed on the camera itself, but can also be routed to the desktop view or monitor object (see below). The category ID property of the camera gizmo controls which monitor might display its view.
- Proximity sensor - Detect the presence of a matching tag and provides the result to wireable sockets
- Category ID tag - Trigger proximity detectors whose category ID matches this tag’s ID. Category ID tags can be grouped with other objects that are visible to the user in play mode.
- Thing emitter - An object that creates instances of objects or collections of objects. The emitter has controls to define how the objects are emitted. The source objects are defined by a ‘Thing emitter source’. Emitters and source objects use category IDs to match sources to emitters. A preview of the next object to be emitted appears at the emitter in the same relative position as it is in the emitter source.
- Thing emitter source - Source for the emitter. Any objects inside the sphere volume defined by the emitter are candidates to be emitted. The emitter chooses a source whose category ID matches the emitter’s. If more than one source with the same category ID exists in the scene then one of the matching sources is chosen randomly for each emission.
- Transporter object - Allows the user to transport from one location to another. Transporter objects use category IDs to define source and destination locations. The category ID on the left side of the arrow icon is the ID for that transporter. The ID on the right side is the destination ID. If the user activates the transporter, they will be transported to the destination. If there are more than one matching destinations one will be chosen at random. Transporters have a trigger value to activate them. This allows connecting different methods to trigger them (e.g., a button or a proximity sensor). When the spawn point option is selected it indicates that the transporter represents the location that the user should be transported to when first entering the scene.
- Tracker object - Represents a tracker object, like the Vive Tracker. The tracker object has a value to select the tracker unit from up to one of three units. If a tracker is not present, the tracker object will instead track one of the controllers. A smoothing value is also available to tune the tracking.
- Trigger/toggle - Converts on/off values to triggers or vice-versa. The direction value controls the conversion direction. Either a trigger will change the on/off value or a change to the on/off value will generate a trigger. The box can also be disabled.
- Logic operator - Provides logical AND, OR, and XOR operations to combine two on/off values. Note that this operation is directionless; if the result changes the operand will be changed to match the operation. If the operands change, the result will be updated.
- Generic particles - generic particle effect with sockets to control various parameters
- Fire - fire effect
- Smoke - smoke effect
- Sparks - fire sparks effect (sparks that drift in the air/smoke)
- Monitor object - displays the view from a camera or cameras in the scene. The category ID property defines which camera is viewed on the monitor. If more than once camera has a matching category ID one is chosen randomly.
- Range mapper - maps a wire value to a different range. There is a “value” socket on each side of the gizmo, but one side has “top” and “bottom” values to reduce the range. Since wires and values are directionless, range mappers can be run in either direction (i.e., magnifying or reducing the range).
- Accumulator - adds or subtracts a specified amount from a value when triggered. This can be used for example to keep a score. Multiple accumulators can be wired together (by connecting their values) to provide different increment/decrement amounts for the same (shared) value.
- Collision detector - detects collisions between objects with the same category ID. Group this gizmo with other collidable objects. It has a trigger parameter which will fire when a collision with another object occurs and that object has a category ID tag set to the same category ID. Note that collisions only occur in play mode if one of the objects is dynamic or in edit mode when gripping one of the objects with the physics tool.
- Destroy gizmo - destroys itself and the objects it is grouped with when triggered.
- Anti-gravity - controls whether gravity is enabled for the objects this gizmo is grouped with. There is also a “drag” parameter, which is applied independently of gravity.
- Hand grip - this gizmo allows the user to hold an object in their hand without holding down the controller's grip button in play mode. The user can grab an object group with a hand grip in play mode even if the group isn't set to be dynamic in the physics simulation. Once picked up the object remains in the user's hand until they squeeze the grip again. A trigger-type trigger parameter is fired whenever the user squeezes the trigger on their controller while holding the hand grip object.
- Timer - fires a trigger value after a period of time has elapsed. The timer gizmo is sort of like a simplified wave generator, but instead of a continuous value it generates a pulse (trigger) each cycle.
- Birth detector - detects when the object group this gizmo is part of has just been spawned by a thing emitter.
- Snap socket - allows connecting dynamic objects in play mode (as well as edit mode). A snap socket will snap to another snap socket when gripped and moved close enough. A category ID defines compatibility between sockets. When two objects are snapped, either the “match” or “mismatch” trigger values are fired depending on the two category ID values.
Animator Objects
Animator objects provide a means to animate color, rotation, and scalar type values. For each type there are two types of animators: “keyframe animators” and “value animators”. Additionally there are keyframe animators for on/off and trigger types.
Keyframe animators allow the user to specify different values at various points in time (keys) and it blends between them when the animation is played back. Keyframe animators are good for expressing predefined animation sequences.
Value animators animate the values directly and don't specify a specific point in time in which a value should take effect. Instead values are activated by a trigger. Value animators are good for interactive animations where the sequence is not defined in advance.
Keyframe Animator Objects
Keyframe animator objects have two primary values: “animation progress” (represented by the socket on the left) and “animation value” (represented by a socket on the right). The progress value defines the position along the animation track representing the current value. The animation value is the result of blending the two keyframes on either side of the progress position.
The current progress position is shown by a vertical arrow below the keyframe track. You can grab it using the trigger button to change the progress position. It is common to wire a wave generator (described later in this document) to the progress value to drive the animation, but it can be driven with other values as well.
You can grip a keyframe with the trigger to move it along the track or drag it off the track to delete it. Press the trigger on a highlighted empty cell to create a new keyframe. Grab and release a key without moving it to display its popup keyframe editor. The keyframe editor allows changing the key value and several other parameters that control how the key is blended over time:
- Interpolation type - smooth, corner, or step. The corner option creates a sharp change at the keyframe location rather than a smooth transition. The step option cause the value to be constant until the next key is reached, at which point the animation value jumps to the next key value.
- In and out speed - Control how the value changes as it approaches the key (in speed) as well as leaves the key (out speed). For example, a slow in speed causes the value to change less as it approaches the key time.
While a keyframe is gripped the touchpad changes to provide the following options:
- Clone - copy the key to create a new key with the same value
- Delete - remove the key
The area below the keyframe track shows a graphical representation of the animation. For scalar type animators it is a graph of the result value over the progress interval. The graphical representation is different for color and rotation type animators.
Color keyframe animators display the color animation as a gradient to show how the color changes over the progress interval.
Rotation keyframe animators display a graph of the rotation value over the progress interval. The rotation value is represented as 3 curves:
- Red - the latitude value
- Green - the longitude value
- Blue - the twist value
On/off keyframe animators don't have a graph below their keyframe track, but instead show the result value graphically within the track itself. Areas of the progress interval where the result value is on (true) are highlighted in dark blue. Areas where the value is off (false) are not highlighted.
Each key toggles the state between on and off starting from a default value of off at the begining of the track.
Additionally a result indicator light appears on the right side of the animator object and shows the result value at the current progress position by turning white when on.
Trigger keyframe animators don't have a graph below their keyframe track. Their result value is a trigger type value, which can be wired to other triggerable objects (e.g., a Thing Emitter).
Trigger animator keys are colored orange to help distinguish them from on/off tracks. Whenever the progress value passes over a key (regardless of wether it is moving forward or backward) the result value is triggered. An indicator light on the right side of the animator object flashes orange when triggered.
Animator objects have several buttons with different functions:
- Lock keyframes - When the lock is off, changing the animation value will create a new key at the current progress location or modify an existing key. Note that the lock option only prevents creating or modifying keys from changes to the result value. It is still possible to create/delete keys directly on the key track or change their value with the popup keyframe editor.
- Loop track - when enabled, keys are interpolated so the animation value is the same at the start and end and the transition is continuous. It is a good idea to leave some space between the last key and the end of the track or the first key and the beginning of the track unless you want the value to change very rapidly in-between.
- Add or subtract subdivisions - Increase/decrease the number of subdivisions. These are the discrete positions (cells) along the track where keys can be placed. Subdivisions can be added/removed at either the right or left side of the track based on which set of '+'/'-' buttons are used. While the progress value itself is a continuous value, placing keys on a grid simplifies the animation process and makes it easier to align keys.
- Add or remove phase shifted tracks - more on phase shifted tracks below:
Phase shift tracks:
Phase shift tracks are copies of the original track that can be shifted across the progress interval. Press the '+' button to the right of the track graph view to create a new phase shift track. An 'x' button appears next to each phase shift track to remove it.
Each phase shift track has its own phase shift amount, which is added to the progress before blending keys to get the shifted result amount. If this shift causes the progress to be larger than 100% the value wraps around to the start, therefore phases shifted tracks are most useful when the track is set to loop mode.
Phase shifted tracks are live copies of the original so if you change the keys on the track the phase shifted tracks will update accordingly. For this reason, phase shift tracks don't have keyframe tracks of their own.
Animator object docking and master tracks:
Multiple animator objects can be docked together by placing them one above the other where they will snap to a docked position. When docked, a master track appears. Changing a key in the master track affects all the keys at the same location in child tracks. Moving the animation progress indicator also moves the progress position for all tracks together.
Like regular tracks, you can ckick on a key in a master track to edit it, but you will only be able to edit the interpolation type (smooth/corner/step) and in/out speed. Changing a master key's properties affects all keys of docked animator objects at the same cell location. If the child keys have different property values a '...' icon will be displayed to indicate there are multiple values.
Value Animator Objects
Value animator objects have a variable number of tracks. Each track represents a single value (of the same type) that the result will take on if that track is triggered. The add track button in the lower right corner adds a new track to the bottom. Each track has a delete button on its right hand side to remove it.
Each track has the following components (left to right):
- Value socket and trigger socket: two sockets appear on the left side of each track. The value socket controls the track value and the trigger socket is what activates the track and causes the result to transition to the track value.
- Track indicator light: This will be white for the active track. As a transition takes place this light will dim or highlight to indicate the amount the track is contributing to the result.
- In speed button: This button has three states that can be accessed by clicking on it to cycle through the states. This controls the speed at which the result transitions to this track's value.
- Track value: shows the value for this track. For scalar values this is a progress-bar-style indicator. For colors it is a color swatch and for rotations the value is displayed graphically with a latitude/longitude/twist parameterization. To change the track value edit it (or wire it) via its socket on the left side of the track.
- Out speed button: similar to the in speed button, this controls the speed at which the result transitions from this track's value.
- Delete track: removes the track from the value animator.
The right side of the animator object shows the result value and has the following controls and sockets:
- Transition time socket: controls the transition time (in seconds). A value of 0 will cause the value to transition instantly when triggered.
- Lock tracks: when activated (tracks locked) changes to the result value won't affect the active track. When unlocked you can edit the active track by editing the result value.
- Result value: shows the current result value. For scalar values the progress bar is rotated 90 degrees as compared to track values.
- Result socket: wire this to the value you wish to control with the value animator.
- New track button: press this to add a new track to the bottom of the track list.
Desktop view
The Thingamajig application has a desktop window in addition to the content displayed in the VR headset. The window shows a view into current scene or Scene Lobby depending on what is currently active.
Cameras
The desktop window view can show what the headset is currently seeing or display the result of a different camera. Use the numeric keys to select a camera (make sure the window has keyboard focus by clicking on it first).
In all views except the ‘raw headset’ view, you can manipulate the camera with the mouse. The left mouse button orbits the camera around the target. The middle mouse button rotates the camera around its center. The right mouse button moves the camera toward or away from its target.
Raw headset view (1 key)
This shows what the user wearing the headset is currently seeing. You cannot use the mouse to modify this view.
Smooth headset view (2 key)
This shows what the user wearing the headset is currently seeing, but with some smoothing applied. Only the middle mouse button can be used to rotate this view. When the mouse is released, the view will rotate back to match the headset view.
Follow camera (3 key)
Shows the result of a camera that follows the user. The camera is targeted at the user’s hands. All three mouse buttons can be used to manipulate this camera.
Scene cameras (4-9 key)
Select one of 6 scene cameras using the 4-9 keys. All three mouse buttons can be used to manipulate the camera.
Training mode (0 key)
This is a special camera that is similar to a scene camera, but there is no corresponding object in the scene. All three mouse buttons can be used to manipulate this camera.
When the 0 key is pressed (even if already in this mode) the camera position/rotation is set based on the current position/rotation of the controllers such that the camera is right behind the controllers pointing in the direction they are pointing.
This allows using the application without wearing a headset and is useful when one person is trying to show a new user how the controllers work.
Drag and drop
The desktop view allows certain types of media to be “dragged-and-dropped” into the scene. The following media types are supported:
- Audio - creates an audio source object in the scene. Currently only .WAV files are supported.
- Images - creates a plane in the scene with the image as a texture
- Video - currently all videos are assumed to be 360 degree and are applied to the background and played in a loop. If the video is square it is assumed to be stereoscopic in an over/under format.
- GLTFs - creates a 3D object in the scene. This can also be done using the “Files” section of the Home Table.