NatNet: Data Types
An overview of the general data structure used in the NatNet software development kit (SDK) and how the library is used to parse received tracking information.
General Structure
When receiving streamed data using the NatNet SDK library, its data descriptions should be received before receiving the tracking data.
NatNet data is packaged mainly into two different formats: data descriptions and frame-specific tracking data. Utilizing this format, the client application can discover which data are streamed out from the server application prior to accessing the actual tracking data.
For every asset (e.g., reconstructed markers, Rigid Bodies, Skeletons, force plates) included within streamed capture sessions, the description and tracking data are stored separately. This format allows frame-independent parameters (e.g., name, size, and number) to be stored within instances of the description structs, and frame-dependent values (e.g. position and orientation) to be stored within instances of the frame data structs. When needed, two different packets of an asset can be correlated by referencing its unique identifier values.
Dataset Descriptions contains descriptions of the motion capture data sets for which a frame of motion capture data will be generated. (e.g. sSkeletonDescription, sRigidBodyDescription)
Frame of Mocap Data contains a single frame of motion capture data for all the datasets described from the Dataset Descriptions. (e.g. sSkeletonData, sRigidBodyData)
Dataset Descriptions
To receive data descriptions from a connected server, use the NatNetClient::GetDataDescriptionList method. Calling this function saves a list of available descriptions in an instance of sDataSetDescriptions.
The sDataSetDescriptions structure stores an array of multiple descriptions for each asset (Marker Sets, RigidBodies, Skeletons, and Force Plates) involved in a capture and necessary information can be parsed from it.
Description: Struct
The following data description structs are available through the SDK:
Frame of Mocap Data
Frame-specific tracking data are stored separately from the DataDescription instances as this cannot be known ahead of time or out of band but only on a per frame basis. These data get saved into instances of sFrameOfMocapData for corresponding frames, and they will contain arrays of frame-specific data structs (e.g.sRigidBodyData, sSkeletonData) for each of the types of assets included in the capture. Respective frame number, timecode, and streaming latency values are also saved in these packets.
The sFrameOfMocapData can be obtained by setting up a frame handler function using the NatNetClient::SetFrameReceivedCallback method. In most cases, a frame handler function must be assigned in order to make sure every frame is promptly processed. Refer to the provided SampleClient project for an exemplary setup.
When streamed, the following data are available in the FrameOfMocapData:
Additional Notes
One reconstructed 3D marker can be stored in two different places (e.g. in LabeledMarkers and in RigidBody) within a frame of mocap data. In those cases, unique identifier values of the marker can be used to correlate them in the client application if necessary.
Declarations for these data types are listed in the NatNetTypes.h header files within the SDK. The SampleClient project included in the
\NatNet SDK\Samplefolder illustrates how to retrieve and interpret the data descriptions and frame data.
Unique ID
Most of the NatNet SDK data packets contain ID values. This value is assigned uniquely to individual markers as well as each of assets within a capture. These values can be used to figure out which asset a given data packet is associated with. One common use is for correlating data descriptions and frame data packets of an asset.
Decoding Member IDs
For each member object that is included within a parental model, its unique ID value points to both its parental model and the member itself. Thus, the ID value of a member object needs to be decoded in order to parse which objects and the parent models they are referencing to.
For example, a Skeleton asset is a hierarchical collection of bone Rigid Bodies, and each of its bone Rigid Bodies has unique ID that references to the involved Skeleton model and the Rigid Body itself. When analyzing Skeleton bones, its ID value needs to be decoded in order to extract the segment Rigid Body ID, and only then, it can be used to reference its descriptions.
NatNet SDK provides a C++ helper function, NatNet_DecodeID, for decoding member ID and model ID of an member object. You can also decode by manually parsing the ID as demonstrated in the WinFormSample or the SampleClientML sample.
Last updated
Was this helpful?

