Exporting CSV
Recorded data can be exported as CSV (Comma Separated Values) file.
The CSV file contains a header describing the content on its first line and uses a delimiter to separate values in each row beneath it.
Use Case
By exporting finger data as CSV you get a simple and light-weight text file containing finger data.
Motion Capture
Create your own finger data motion capture pipeline, with easy to transfer and manipulate finger data. Extract the fingertip locations and drive your own IK system, extract the joint angles and determine the range-of-motion of fingers, process data based on joint acceleration and many more applications are possible.
Research & Development
Create your own finger data pipeline for machine learning, robotics or life sciences research with software such as Matlab, Excel, Python, Scilab and Octave. Any application capable of processing CSV data could be used to interpret, transform and visualize the finger data.
Finger Data
The CSV exporter offers the following data:
- joint positions
- joint rotations
- positional joint velocity
- positional joint acceleration
- pinch distances
- joint angles
- joint angular velocity
- joint angular acceleration
The available data offers a lot of possibilities and even offers the ability to calculate new data. For example jerk (the velocity of acceleration) or jounce (the acceleration of acceleration) can be calculated, as well as the lengths of bones (based on the distances between joints).
The CSV data is intended as a stepping stone for further processing and allows for very powerful transformations for automation, research and so on.
CSV Header
The CSV file contains a description of the data it contains on its first line.
Frame,Elapsed_Time_In_Milliseconds,Time,Hand_X,Hand_Y,Hand_Z,Thumb_CMC_X,Thumb_CMC_Y,Thumb_CMC_Z,Thumb_MCP_X,Thumb_MCP_Y,Thumb_MCP_Z,Thumb_DIP_X,Thumb_DIP_Y,Thumb_DIP_Z,Thumb_TIP_X,Thumb_TIP_Y,Thumb_TIP_Z,Index_CMC_X,Index_CMC_Y,Index_CMC_Z,Index_MCP_X,Index_MCP_Y,Index_MCP_Z,Index_PIP_X,Index_PIP_Y,Index_PIP_Z,Index_DIP_X,Index_DIP_Y,Index_DIP_Z,Index_TIP_X,Index_TIP_Y,Index_TIP_Z,Middle_CMC_X,Middle_CMC_Y,Middle_CMC_Z,Middle_MCP_X,Middle_MCP_Y,Middle_MCP_Z,Middle_PIP_X,Middle_PIP_Y,Middle_PIP_Z,Middle_DIP_X,Middle_DIP_Y,Middle_DIP_Z,Middle_TIP_X,Middle_TIP_Y,Middle_TIP_Z,Ring_CMC_X,Ring_CMC_Y,Ring_CMC_Z,Ring_MCP_X,Ring_MCP_Y,Ring_MCP_Z,Ring_PIP_X,Ring_PIP_Y,Ring_PIP_Z,Ring_DIP_X,Ring_DIP_Y,Ring_DIP_Z,Ring_TIP_X,Ring_TIP_Y,Ring_TIP_Z,Pinky_CMC_X,Pinky_CMC_Y,Pinky_CMC_Z,Pinky_MCP_X,Pinky_MCP_Y,Pinky_MCP_Z,Pinky_PIP_X,Pinky_PIP_Y,Pinky_PIP_Z,Pinky_DIP_X,Pinky_DIP_Y,Pinky_DIP_Z,Pinky_TIP_X,Pinky_TIP_Y,Pinky_TIP_Z,Hand_X,Hand_Y,Hand_Z,Thumb_CMC_X,Thumb_CMC_Y,Thumb_CMC_Z,Thumb_MCP_X,Thumb_MCP_Y,Thumb_MCP_Z,Thumb_DIP_X,Thumb_DIP_Y,Thumb_DIP_Z,Thumb_TIP_X,Thumb_TIP_Y,Thumb_TIP_Z,Index_CMC_X,Index_CMC_Y,Index_CMC_Z,Index_MCP_X,Index_MCP_Y,Index_MCP_Z,Index_PIP_X,Index_PIP_Y,Index_PIP_Z,Index_DIP_X,Index_DIP_Y,Index_DIP_Z,Index_TIP_X,Index_TIP_Y,Index_TIP_Z,Middle_CMC_X,Middle_CMC_Y,Middle_CMC_Z,Middle_MCP_X,Middle_MCP_Y,Middle_MCP_Z,Middle_PIP_X,Middle_PIP_Y,Middle_PIP_Z,Middle_DIP_X,Middle_DIP_Y,Middle_DIP_Z,Middle_TIP_X,Middle_TIP_Y,Middle_TIP_Z,Ring_CMC_X,Ring_CMC_Y,Ring_CMC_Z,Ring_MCP_X,Ring_MCP_Y,Ring_MCP_Z,Ring_PIP_X,Ring_PIP_Y,Ring_PIP_Z,Ring_DIP_X,Ring_DIP_Y,Ring_DIP_Z,Ring_TIP_X,Ring_TIP_Y,Ring_TIP_Z,Pinky_CMC_X,Pinky_CMC_Y,Pinky_CMC_Z,Pinky_MCP_X,Pinky_MCP_Y,Pinky_MCP_Z,Pinky_PIP_X,Pinky_PIP_Y,Pinky_PIP_Z,Pinky_DIP_X,Pinky_DIP_Y,Pinky_DIP_Z,Pinky_TIP_X,Pinky_TIP_Y,Pinky_TIP_Z,Hand_Velocity_X,Hand_Velocity_Y,Hand_Velocity_Z,Thumb_CMC_Velocity_X,Thumb_CMC_Velocity_Y,Thumb_CMC_Velocity_Z,Thumb_MCP_Velocity_X,Thumb_MCP_Velocity_Y,Thumb_MCP_Velocity_Z,Thumb_DIP_Velocity_X,Thumb_DIP_Velocity_Y,Thumb_DIP_Velocity_Z,Thumb_TIP_Velocity_X,Thumb_TIP_Velocity_Y,Thumb_TIP_Velocity_Z,Index_CMC_Velocity_X,Index_CMC_Velocity_Y,Index_CMC_Velocity_Z,Index_MCP_Velocity_X,Index_MCP_Velocity_Y,Index_MCP_Velocity_Z,Index_PIP_Velocity_X,Index_PIP_Velocity_Y,Index_PIP_Velocity_Z,Index_DIP_Velocity_X,Index_DIP_Velocity_Y,Index_DIP_Velocity_Z,Index_TIP_Velocity_X,Index_TIP_Velocity_Y,Index_TIP_Velocity_Z,Middle_CMC_Velocity_X,Middle_CMC_Velocity_Y,Middle_CMC_Velocity_Z,Middle_MCP_Velocity_X,Middle_MCP_Velocity_Y,Middle_MCP_Velocity_Z,Middle_PIP_Velocity_X,Middle_PIP_Velocity_Y,Middle_PIP_Velocity_Z,Middle_DIP_Velocity_X,Middle_DIP_Velocity_Y,Middle_DIP_Velocity_Z,Middle_TIP_Velocity_X,Middle_TIP_Velocity_Y,Middle_TIP_Velocity_Z,Ring_CMC_Velocity_X,Ring_CMC_Velocity_Y,Ring_CMC_Velocity_Z,Ring_MCP_Velocity_X,Ring_MCP_Velocity_Y,Ring_MCP_Velocity_Z,Ring_PIP_Velocity_X,Ring_PIP_Velocity_Y,Ring_PIP_Velocity_Z,Ring_DIP_Velocity_X,Ring_DIP_Velocity_Y,Ring_DIP_Velocity_Z,Ring_TIP_Velocity_X,Ring_TIP_Velocity_Y,Ring_TIP_Velocity_Z,Pinky_CMC_Velocity_X,Pinky_CMC_Velocity_Y,Pinky_CMC_Velocity_Z,Pinky_MCP_Velocity_X,Pinky_MCP_Velocity_Y,Pinky_MCP_Velocity_Z,Pinky_PIP_Velocity_X,Pinky_PIP_Velocity_Y,Pinky_PIP_Velocity_Z,Pinky_DIP_Velocity_X,Pinky_DIP_Velocity_Y,Pinky_DIP_Velocity_Z,Pinky_TIP_Velocity_X,Pinky_TIP_Velocity_Y,Pinky_TIP_Velocity_Z,Hand_Acceleration_X,Hand_Acceleration_Y,Hand_Acceleration_Z,Thumb_CMC_Acceleration_X,Thumb_CMC_Acceleration_Y,Thumb_CMC_Acceleration_Z,Thumb_MCP_Acceleration_X,Thumb_MCP_Acceleration_Y,Thumb_MCP_Acceleration_Z,Thumb_DIP_Acceleration_X,Thumb_DIP_Acceleration_Y,Thumb_DIP_Acceleration_Z,Thumb_TIP_Acceleration_X,Thumb_TIP_Acceleration_Y,Thumb_TIP_Acceleration_Z,Index_CMC_Acceleration_X,Index_CMC_Acceleration_Y,Index_CMC_Acceleration_Z,Index_MCP_Acceleration_X,Index_MCP_Acceleration_Y,Index_MCP_Acceleration_Z,Index_PIP_Acceleration_X,Index_PIP_Acceleration_Y,Index_PIP_Acceleration_Z,Index_DIP_Acceleration_X,Index_DIP_Acceleration_Y,Index_DIP_Acceleration_Z,Index_TIP_Acceleration_X,Index_TIP_Acceleration_Y,Index_TIP_Acceleration_Z,Middle_CMC_Acceleration_X,Middle_CMC_Acceleration_Y,Middle_CMC_Acceleration_Z,Middle_MCP_Acceleration_X,Middle_MCP_Acceleration_Y,Middle_MCP_Acceleration_Z,Middle_PIP_Acceleration_X,Middle_PIP_Acceleration_Y,Middle_PIP_Acceleration_Z,Middle_DIP_Acceleration_X,Middle_DIP_Acceleration_Y,Middle_DIP_Acceleration_Z,Middle_TIP_Acceleration_X,Middle_TIP_Acceleration_Y,Middle_TIP_Acceleration_Z,Ring_CMC_Acceleration_X,Ring_CMC_Acceleration_Y,Ring_CMC_Acceleration_Z,Ring_MCP_Acceleration_X,Ring_MCP_Acceleration_Y,Ring_MCP_Acceleration_Z,Ring_PIP_Acceleration_X,Ring_PIP_Acceleration_Y,Ring_PIP_Acceleration_Z,Ring_DIP_Acceleration_X,Ring_DIP_Acceleration_Y,Ring_DIP_Acceleration_Z,Ring_TIP_Acceleration_X,Ring_TIP_Acceleration_Y,Ring_TIP_Acceleration_Z,Pinky_CMC_Acceleration_X,Pinky_CMC_Acceleration_Y,Pinky_CMC_Acceleration_Z,Pinky_MCP_Acceleration_X,Pinky_MCP_Acceleration_Y,Pinky_MCP_Acceleration_Z,Pinky_PIP_Acceleration_X,Pinky_PIP_Acceleration_Y,Pinky_PIP_Acceleration_Z,Pinky_DIP_Acceleration_X,Pinky_DIP_Acceleration_Y,Pinky_DIP_Acceleration_Z,Pinky_TIP_Acceleration_X,Pinky_TIP_Acceleration_Y,Pinky_TIP_Acceleration_Z,Pinch_ThumbToIndex,Pinch_ThumbToMiddle,Pinch_ThumbToRing,Pinch_ThumbToPinky,Thumb_CMC_Spread,Thumb_CMC_Flex,Thumb_PIP_Flex,Thumb_DIP_Flex,Index_MCP_Spread,Index_MCP_Flex,Index_PIP_Flex,Index_DIP_Flex,Middle_MCP_Spread,Middle_MCP_Flex,Middle_PIP_Flex,Middle_DIP_Flex,Ring_MCP_Spread,Ring_MCP_Flex,Ring_PIP_Flex,Ring_DIP_Flex,Pinky_MCP_Spread,Pinky_MCP_Flex,Pinky_PIP_Flex,Pinky_DIP_Flex,Thumb_CMC_Spread_AngularVelocity,Thumb_CMC_Flex_AngularVelocity,Thumb_PIP_Flex_AngularVelocity,Thumb_DIP_Flex_AngularVelocity,Index_MCP_Spread_AngularVelocity,Index_MCP_Flex_AngularVelocity,Index_PIP_Flex_AngularVelocity,Index_DIP_Flex_AngularVelocity,Middle_MCP_Spread_AngularVelocity,Middle_MCP_Flex_AngularVelocity,Middle_PIP_Flex_AngularVelocity,Middle_DIP_Flex_AngularVelocity,Ring_MCP_Spread_AngularVelocity,Ring_MCP_Flex_AngularVelocity,Ring_PIP_Flex_AngularVelocity,Ring_DIP_Flex_AngularVelocity,Pinky_MCP_Spread_AngularVelocity,Pinky_MCP_Flex_AngularVelocity,Pinky_PIP_Flex_AngularVelocity,Pinky_DIP_Flex_AngularVelocity,Thumb_CMC_Spread_AngularAcceleration,Thumb_CMC_Flex_AngularAcceleration,Thumb_PIP_Flex_AngularAcceleration,Thumb_DIP_Flex_AngularAcceleration,Index_MCP_Spread_AngularAcceleration,Index_MCP_Flex_AngularAcceleration,Index_PIP_Flex_AngularAcceleration,Index_DIP_Flex_AngularAcceleration,Middle_MCP_Spread_AngularAcceleration,Middle_MCP_Flex_AngularAcceleration,Middle_PIP_Flex_AngularAcceleration,Middle_DIP_Flex_AngularAcceleration,Ring_MCP_Spread_AngularAcceleration,Ring_MCP_Flex_AngularAcceleration,Ring_PIP_Flex_AngularAcceleration,Ring_DIP_Flex_AngularAcceleration,Pinky_MCP_Spread_AngularAcceleration,Pinky_MCP_Flex_AngularAcceleration,Pinky_PIP_Flex_AngularAcceleration,Pinky_DIP_Flex_AngularAcceleration
Keep in mind the header in an exported CSV file is not static, but is based on the data that is selected when exporting.
You can read the CSV Header Reference for more information about the available data.
Certain information, such as the unit system, can not directly be derived from the header.
Exporting
The CSV Export Dialog offers a lot of customization regarding which data is exported and in what format. Since not all selected options can be derived from the header, it is important to keep track of which settings you use.
Overview of Data Settings:
Finger Selection
You can select for which fingers you want to export data.
- Hands
- Thumb
- Index
- Middle
- Ring
- Pinky
Data Selection
You can select which data you want to export for the selected fingers.
Hand joints
- Positions (Joint Positions)
World space (absolute) positions of the joints on the X, Y and Z axis. - Rotations (Joint Rotations)
World space (absolute) rotations of the joints on the X, Y, Z (and W) axis.
The rotation order and rotation type can be configured in the export settings. - Velocity (Positional Joint Velocity)
Positional velocity in unit / second of the wrist joint on the X, Y and Z axis.
The unit system can be configured in the export settings. - Acceleration (Positional Joint Acceleration)
Positional acceleration in unit / second^2 of the wrist joint on the X, Y and Z axis.
The unit system can be configured in the export settings. - Pinch distances
Distance in units between the thumb fingertip and other fingertips.
The unit system can be configured in the export settings.
Ergonomics data
- Joint Angles
Joint angle (flexion or (hyper)extension, i.e. bending; abduction or adduction, i.e. splaying) of the joint in degrees. - Angular Velocity (Angular Joint Velocity)
Angular velocity (abduction or adduction, i.e. splaying; flexion or (hyper)extension, i.e. bending) in degrees / second of the joint. - Angular Acceleration (Angular Joint Acceleration)
Angular acceleration (abduction or adduction, i.e. splaying; flexion or (hyper)extension, i.e. bending) in degrees / second^2 of the joint.
Hand motion
- None
No hand position and rotation is exported. - IMU
Hand rotation based on glove orientation sensor. - Tracker
Hand position and rotation based on a connected external tracker (i.e. SteamVR tracker). - Tracker Rotation
Hand rotation based on a connected external tracker (i.e. SteamVR tracker).
The exported hand position and rotation (i.e. wrist) is affected by which option is chosen.
Coordinate System
Presets
The CSV exporter comes with presets for the coordinate system for many 3D animation applications, game engines and other commonly used real-time applications:
- Blender
- Cinema4D
- CryEngine
- GLM
- Godot
- Houdini
- Marmoset Toolbag
- Maya
- Modo
- MotionBuilder
- OpenCV
- OpenGL
- Source Engine
- Unity
- Unreal
Custom Configuration
The CSV exporter also offers the ability for custom settings for the coordinate system. Using this setting you can determine which axis is used for what data.
Overview of the Coordinate System settings:
- Up Axis sets the up axis of the coordinate system.
- View Axis sets the forward axis of the coordinate system.
- Handedness sets the handedness of the coordinate system.
Please use the presets if you're not sure about specifying your own coordinate system.
Settings
Using the export setting you can define how data is exported.
Overview of the Export Settings:
- Framerate sets the amount of frames per second.
- Value separator sets which symbol is used for separating values.
- Decimal point sets the decimal separator to support different language locales.
- Units sets the unit system.
- Items to export selects which user data will be exported.
- Include SMPTE timecode signal uses timecoded time when recorded with timecode.
- Rotation type sets the rotation system (Euler Angles or Quaternion).
- Rotation order sets in which order rotations are saved. When reconstructing rotations, the order has to be inversed.
Hand Motion
None / IMU / Tracker Rotation
When exporting with no hand position data, the hands (i.e. wrists) will be placed at the center of the digital scene (i.e. 0,0,0
). This means all positional data will be based on this hand position.
Example of no Hand Position data:
Tracker
When exporting with hand position data, the tracker data will be used to position the hands. This means all positional data will be based on the tracker location.
Example of Tracker Data driving the Hand Position:
Example of Visualizing CSV Data
The CSV data can easily be visualized to better understand it.
This example shows the index fingertip to thumb fingertip pinch distance.
Digital hand animation in FBX Review with CSV data in Excel with pinch distance graph:
- Hand pose on frame 684 displayed in FBX Review and CSV data is selected in Excel.
- Line graph displaying the pinch distance in millimeters at frame 684.
- Distance to Thumb of 0.486646cm, i.e. ~5mm.
- Distance between the thumb fingertip and index fingertip visualized in red.
- Contact point of the thumb fingertip and index fingertip visualized in red.