NatNet: Sample Projects

Back to the Main pageBack to the NatNet SDK page


This page lists out the NatNet sample applications provided with the SDK and provides instructions for some of the samples. The code samples are the quickest path towards getting NatNet data into your application. We typically recommend you:

1. Identify your application’s development/interface requirements (managed, native, etc).
2. Adapt the NatNet sample code from the corresponding NatNet sample application in the samples folder into your application.
3. Use the API reference in the next page for additional information.

The Visual Studio solution file \Samples\NatNetSamples.sln will open and build all of the NatNet sample projects. If you are creating an application from scratch, please refer to the following sections for application specific requirements.

NatNet Sample Projects


The following projects are located in the NatNet SDK\Samples folder.


NatNet SDK Samples

The following sample projects utilizes NatNet SDK library for obtaining tracking data from a connected server application.
Sample Name NatNet Library Type Description
Matlab Managed: Matlab Sample MATLAB code file (.m) for using MATLAB with the NatNet managed assembly (NatNetML.dll).
MatlabWrapper Managed: Matlab Wrapper class for the NatNetML assembly members, allowing command line access to the client object.
RebroadcastMotiveData Native: C++ Sample application that receives tracking data from the NatNet Server and redistributing it in other forms. Currently there are two protocols supported for pipelining tracking data into Unity via compatible XML packets and into Previzion software via serial port interface.
MayaPlugIn Native: C++ GitHub open source project: mayaMotive
SampleClient Native: C++ Sample NatNet console app that connects to a NatNet server, receives a data stream, and writes that data stream to an ASCII file. This sample


SampleClient3D Native: C++ Sample NatNet application that connects to a NatNet server, receives a data stream, and displays that data in an OpenGL 3D window.
SampleClientML Managed: .NET (C#) Sample NatNet C# console appication that connects to a NatNet server on the local IP address, receives data stream, and outputs the received data.
TimingClient Native: C++ This program connects to a NatNet server and can be used as a quick check to determine packet timing information.
Unity3D Native: C++ This program demonstrates streaming rigid body and skeleton tracking data from Motive into Unity via UDP. This application encodes skeleton data into the XML format for streaming into Unity.
WinFormsSample Managed: C# .NET Simple C# .NET sample showing how to use the NatNet managed assembly (NatNETML.dll). This sample also demonstrates how to send and receive the NatNet commands.



Direct Depacketization Samples

The following sample projects do not use the NatNet SDK library. Client/Server connection is established at a low-level by creating sockets and threads within the program, and the streamed data are depacketized directly from the bit-stream syntax. The following sample approaches should be used only when the use of NatNet SDK library is not applicable (e.g. streaming into UNIX clients).
Sample Name Type Description
PacketClient C++ Simple example showing how to connect to a NatNet multicast stream and decode NatNet packets directly without using the NatNet SDK.
PythonClient Python Sample Python code file (.py) for using Python with NatNet streaming. This sample depacketizes data directly from the bit-stream without using the library.


XML trigger broadcast

The following samples demonstrate how to use remote triggering in Motive using the XML formatted UDP broadcase packets.
Sample Name Type Description
BroadcastSample C++ XML broadcast. Sample application illustrating how to use remote record trigger in Motive using XML formatted UDP broadcast packets.
NatCap C++ XML broadcast. Sample capture start/stop trigger broadcast app.


Running the Console Output Sample (Sample Client)

On Windows

1. [Motive] Start the Optitrack Server (e.g. Motive) and begin streaming data via the Streaming Panel.


2. [Command Prompt] Start the client from the windows command prompt: SampleClient.exe [ClientIPAddress] [ServerIPAddress] [OutputFilename.txt]

Running the SampleClient project from the windows command prompt.


3. [Command Prompt] You should begin to see data streaming in the client window or to text file.

Running the SampleClient project from the windows command prompt.


On Linux

For building and running the SampleClient application, the Linux machine must have gcc/g++ compiler installed. Also, this project links against a third party library named ncurses at both build and run-time. Make sure the required compiler and the third-party library is installed on the machine.

1. [Linux] Install necessary programs and libraries

  • Ubuntu Terminal Instructions
- sudo apt-get install build-essential
- sudo apt-get install libncurses-dev
  • Fedora Terminal Instructions
- sudo dnf install gcc-c++
- sudo dnf install ncurses-devel

2. [Linux] Open a shell prompt and set the directory to the samples/SampleClient folder in the uncompressed NatNet SDK directory.

3. [Linux] Build the sample. In the shell, enter make clean all and compile the sample.

4. [Linux] Change the directory to the build folder.

5. [Linux] To run the compiled sample, the directory of the NatNet library, libNatNetLibShared.so , must be specified. To do this, enter export LD_LIBRARY_PATH=$LD_LIBRARY_PATH: {lib folder directory} as shown in the image below. This sets up the environment variables for the location of the library file.

6. [Server] Start an Optitrack Server (e.g. Motive from another machine) and begin streaming data via the Streaming Panel. Take a note of the server IP address from the Data Streaming pane in Motive. Since we will be streaming onto a client application running on Linux, make sure to stream onto the connected network; not local loopback nor the camera network.

7. [Linux] Get the local network IP address. In terminal, run ifconfig and find your local IP address (e.g. inet addr: 10.0.13.191).

8. [Linux] Now Start the client from the shell with designated server and client IP address:SampleClient.exe [ClientLocalIPAddress] [ServerIPAddress] [OutputFilename.txt]. Default setting is set to the local loopback address.

SampleClient running on Linux

Running the Rigid Body Sample (SampleClient3D)

The Rigid Body sample (SampleClient3D) illustrates how to decode NatNet 6DOF Rigid Body and Skeleton Segment data from OptiTrack quaternion format to euler angles and display them in a simple OpenGL 3D viewer. This sample also illustrates how to associate RigidBody/Skeleton Segment names and IDs from the data descriptions with the IDs streamed in the FrameOfMocapData packet.


With Client/Server on same machine:

1. [Motive] Load a dataset with rigid body or skeleton definitions

2. [Motive] Enable network streaming ( Data Streaming Pane -> Check Broadcast Frame Data )

3. [Motive] Enable streaming rigid body data (check Stream Options -> Stream Rigid Bodies = True)

4. [Sample3D] File -> Connect


With Client/Server on separate machines:

1. [Motive] Load a dataset with rigid body or skeleton definitions

2. [Motive] Set IP address to stream from (Network Interface Selection -> Local Interface)

3. [Motive] Enable network streaming ( Data Streaming Pane -> Check Broadcast Frame Data )

4. [Motive] Enable streaming rigid body data (check Stream Options -> Stream Rigid Bodies = True)

5. [Sample3D] Set Client and Server IP addresses

6. [Sample3D] File -> Connect

  • IP Address IP Address of client NIC card you wish to use.
  • Server IP Address IP Address of server entered in step 2 above.


SampleClient3D - Decoding and draqing labeled rigid body position and orientation (6DoF) data.


Running the .NET Sample

1. [Motive] Start a NatNet server application (e.g. Motive).

2. [Motive] Enable NatNet streaming from the Server application.

3. [WinFormTestApp] Start the WinForms sample application from the NatNet Samples folder.

4. [WinFormTestApp] Update the “Local” and “Server” IP Addresses as necessary.

5. [WinFormTestApp] Press the “Connect” button to connect to the server.

6. [WinFormTestApp] Press the “GetDataDesc” button to request and display a detailed description of the Server’s currently streamed objects.

7. [WinFormTestApp] Select a Row in the DataGrid to display that value in the graph.


Receiving tracking data via NatNet in a .NET environment.
Issuing remote control commands to Motive.


Running the Matlab Sample

1. [Motive] Start a NatNet server application (e.g. Motive).

2. [Motive] Enable NatNet streaming from the Server application.

3. [Matlab] Start Matlab

4. [Matlab] Open the NatNetMatlabSample.m file.

5. [Matlab] From the editor window, press Run


Rael-time streaming mocap data from Motive into Matlab.