├── .gitattributes ├── .gitignore ├── Assets ├── Materials.meta ├── Materials │ ├── 1.mat │ ├── 1.mat.meta │ ├── 2.mat │ ├── 2.mat.meta │ ├── 3.mat │ └── 3.mat.meta ├── Scenes.meta ├── Scenes │ ├── test.unity │ └── test.unity.meta ├── Scripts.meta └── Scripts │ ├── DataStream.cs │ ├── DataStream.cs.meta │ ├── DirectMulticastSocketClient.cs │ ├── DirectMulticastSocketClient.cs.meta │ ├── OptiTrackManager.cs │ ├── OptiTrackManager.cs.meta │ ├── OptiTrackObject.cs │ ├── OptiTrackObject.cs.meta │ ├── SkeletonClass.cs │ └── SkeletonClass.cs.meta ├── ProjectSettings ├── AudioManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── NavMeshLayers.asset ├── NetworkManager.asset ├── Physics2DSettings.asset ├── ProjectSettings.asset ├── QualitySettings.asset ├── TagManager.asset └── TimeManager.asset └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | #Unity 2 | Library/ 3 | *.vcproj 4 | *.csproj 5 | 6 | ################# 7 | ## Eclipse 8 | ################# 9 | 10 | *.pydevproject 11 | .project 12 | .metadata 13 | bin/ 14 | tmp/ 15 | *.tmp 16 | *.bak 17 | *.swp 18 | *~.nib 19 | local.properties 20 | .classpath 21 | .settings/ 22 | .loadpath 23 | 24 | # External tool builders 25 | .externalToolBuilders/ 26 | 27 | # Locally stored "Eclipse launch configurations" 28 | *.launch 29 | 30 | # CDT-specific 31 | .cproject 32 | 33 | # PDT-specific 34 | .buildpath 35 | 36 | 37 | ################# 38 | ## Visual Studio 39 | ################# 40 | 41 | ## Ignore Visual Studio temporary files, build results, and 42 | ## files generated by popular Visual Studio add-ons. 43 | 44 | # User-specific files 45 | *.suo 46 | *.user 47 | *.sln.docstates 48 | 49 | # Build results 50 | 51 | [Dd]ebug/ 52 | [Rr]elease/ 53 | x64/ 54 | build/ 55 | [Bb]in/ 56 | [Oo]bj/ 57 | 58 | # MSTest test Results 59 | [Tt]est[Rr]esult*/ 60 | [Bb]uild[Ll]og.* 61 | 62 | *_i.c 63 | *_p.c 64 | *.ilk 65 | *.obj 66 | *.pch 67 | *.pdb 68 | *.pgc 69 | *.pgd 70 | *.rsp 71 | *.sbr 72 | *.tlb 73 | *.tli 74 | *.tlh 75 | *.tmp 76 | *.tmp_proj 77 | *.log 78 | *.vspscc 79 | *.vssscc 80 | .builds 81 | *.pidb 82 | *.log 83 | *.scc 84 | 85 | # Visual C++ cache files 86 | ipch/ 87 | *.aps 88 | *.ncb 89 | *.opensdf 90 | *.sdf 91 | *.cachefile 92 | 93 | # Visual Studio profiler 94 | *.psess 95 | *.vsp 96 | *.vspx 97 | 98 | # Guidance Automation Toolkit 99 | *.gpState 100 | 101 | # ReSharper is a .NET coding add-in 102 | _ReSharper*/ 103 | *.[Rr]e[Ss]harper 104 | 105 | # TeamCity is a build add-in 106 | _TeamCity* 107 | 108 | # DotCover is a Code Coverage Tool 109 | *.dotCover 110 | 111 | # NCrunch 112 | *.ncrunch* 113 | .*crunch*.local.xml 114 | 115 | # Installshield output folder 116 | [Ee]xpress/ 117 | 118 | # DocProject is a documentation generator add-in 119 | DocProject/buildhelp/ 120 | DocProject/Help/*.HxT 121 | DocProject/Help/*.HxC 122 | DocProject/Help/*.hhc 123 | DocProject/Help/*.hhk 124 | DocProject/Help/*.hhp 125 | DocProject/Help/Html2 126 | DocProject/Help/html 127 | 128 | # Click-Once directory 129 | publish/ 130 | 131 | # Publish Web Output 132 | *.Publish.xml 133 | *.pubxml 134 | 135 | # NuGet Packages Directory 136 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line 137 | #packages/ 138 | 139 | # Windows Azure Build Output 140 | csx 141 | *.build.csdef 142 | 143 | # Windows Store app package directory 144 | AppPackages/ 145 | 146 | # Others 147 | sql/ 148 | *.Cache 149 | ClientBin/ 150 | [Ss]tyle[Cc]op.* 151 | ~$* 152 | *~ 153 | *.dbmdl 154 | *.[Pp]ublish.xml 155 | *.pfx 156 | *.publishsettings 157 | 158 | # RIA/Silverlight projects 159 | Generated_Code/ 160 | 161 | # Backup & report files from converting an old project file to a newer 162 | # Visual Studio version. Backup files are not needed, because we have git ;-) 163 | _UpgradeReport_Files/ 164 | Backup*/ 165 | UpgradeLog*.XML 166 | UpgradeLog*.htm 167 | 168 | # SQL Server files 169 | App_Data/*.mdf 170 | App_Data/*.ldf 171 | 172 | ############# 173 | ## Windows detritus 174 | ############# 175 | 176 | # Windows image file caches 177 | Thumbs.db 178 | ehthumbs.db 179 | 180 | # Folder config file 181 | Desktop.ini 182 | 183 | # Recycle Bin used on file shares 184 | $RECYCLE.BIN/ 185 | 186 | # Mac crap 187 | .DS_Store 188 | 189 | 190 | ############# 191 | ## Python 192 | ############# 193 | 194 | *.py[co] 195 | 196 | # Packages 197 | *.egg 198 | *.egg-info 199 | dist/ 200 | build/ 201 | eggs/ 202 | parts/ 203 | var/ 204 | sdist/ 205 | develop-eggs/ 206 | .installed.cfg 207 | 208 | # Installer logs 209 | pip-log.txt 210 | 211 | # Unit test / coverage reports 212 | .coverage 213 | .tox 214 | 215 | #Translations 216 | *.mo 217 | 218 | #Mr Developer 219 | .mr.developer.cfg 220 | -------------------------------------------------------------------------------- /Assets/Materials.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dae859e5f94940a4f90bac0833c6155f 3 | folderAsset: yes 4 | DefaultImporter: 5 | userData: 6 | -------------------------------------------------------------------------------- /Assets/Materials/1.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/Assets/Materials/1.mat -------------------------------------------------------------------------------- /Assets/Materials/1.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8e1a6a0223d1e59418ce79f785e84f82 3 | NativeFormatImporter: 4 | userData: 5 | -------------------------------------------------------------------------------- /Assets/Materials/2.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/Assets/Materials/2.mat -------------------------------------------------------------------------------- /Assets/Materials/2.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 36e83a36d9df6e14b8422a15da2cd250 3 | NativeFormatImporter: 4 | userData: 5 | -------------------------------------------------------------------------------- /Assets/Materials/3.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/Assets/Materials/3.mat -------------------------------------------------------------------------------- /Assets/Materials/3.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9a79ab218844701438c45df187182bd7 3 | NativeFormatImporter: 4 | userData: 5 | -------------------------------------------------------------------------------- /Assets/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2bfa5543145380a4b884036b569d848e 3 | folderAsset: yes 4 | DefaultImporter: 5 | userData: 6 | -------------------------------------------------------------------------------- /Assets/Scenes/test.unity: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/Assets/Scenes/test.unity -------------------------------------------------------------------------------- /Assets/Scenes/test.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7cc368375ddc78742af11687cda3c2e7 3 | DefaultImporter: 4 | userData: 5 | -------------------------------------------------------------------------------- /Assets/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9511c8bbe7dc4b04fa2dc9bda525e72d 3 | folderAsset: yes 4 | DefaultImporter: 5 | userData: 6 | -------------------------------------------------------------------------------- /Assets/Scripts/DataStream.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * Adapted from johny3212 3 | * Written by Matt Oskamp 4 | */ 5 | 6 | using UnityEngine; 7 | using System; 8 | using System.Collections; 9 | using System.Collections.Generic; 10 | 11 | namespace OptitrackManagement 12 | { 13 | 14 | public class DataStream { 15 | 16 | public OptiTrackRigidBody[] _rigidBody = new OptiTrackRigidBody[200]; 17 | public int _nRigidBodies = 0; 18 | 19 | public DataStream () 20 | { 21 | InitializeRigidBody(); 22 | } 23 | 24 | public bool InitializeRigidBody() 25 | { 26 | _nRigidBodies = 0; 27 | for (int i = 0; i < 200; i++) 28 | { 29 | _rigidBody[i] = new OptiTrackRigidBody(); 30 | } 31 | return true; 32 | } 33 | 34 | public OptiTrackRigidBody getRigidbody(int index) 35 | { 36 | return _rigidBody[index]; 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /Assets/Scripts/DataStream.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5ae18a6011de00c4c99caf57dad24ce3 3 | MonoImporter: 4 | serializedVersion: 2 5 | defaultReferences: [] 6 | executionOrder: 0 7 | icon: {instanceID: 0} 8 | userData: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/DirectMulticastSocketClient.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * Adapted from johny3212 3 | * Written by Matt Oskamp 4 | */ 5 | 6 | using UnityEngine; 7 | using System.Collections; 8 | 9 | using System; 10 | using System.Net; 11 | using System.Net.Sockets; 12 | using System.Threading; 13 | using System.Text; 14 | 15 | namespace OptitrackManagement 16 | { 17 | 18 | public class DirectStateObject 19 | { 20 | public Socket workSocket = null; 21 | public const int BufferSize = 65507; 22 | public byte[] buffer = new byte[BufferSize]; 23 | public StringBuilder sb = new StringBuilder(); 24 | } 25 | 26 | public static class DirectMulticastSocketClient { 27 | 28 | private static Socket client; 29 | private static bool _isInitRecieveStatus = false; 30 | private static bool _isIsActiveThread = false; 31 | private static DataStream _dataStream = null; 32 | private static String _strFrameLog = String.Empty; 33 | 34 | private static int _dataPort = 1511; 35 | //private static int _commandPort = 1510; 36 | private static string _multicastIPAddress = "239.255.42.99"; 37 | 38 | private static void StartClient() 39 | { 40 | // Connect to a remote device. 41 | try 42 | { 43 | 44 | Debug.Log("[UDP] Starting client"); 45 | _dataStream = new DataStream(); 46 | client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 47 | client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 48 | //client.ExclusiveAddressUse = false; 49 | 50 | IPEndPoint ipep=new IPEndPoint(IPAddress.Any, _dataPort); 51 | client.Bind(ipep); 52 | 53 | IPAddress ip=IPAddress.Parse(_multicastIPAddress); 54 | client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip,IPAddress.Any)); 55 | 56 | _isInitRecieveStatus = Receive(client); 57 | _isIsActiveThread = _isInitRecieveStatus; 58 | 59 | } catch (Exception e) 60 | { 61 | Debug.LogError("[UDP] DirectMulticastSocketClient: " + e.ToString()); 62 | } 63 | } 64 | 65 | private static bool Receive(Socket client) 66 | { 67 | try 68 | { 69 | // Create the state object. 70 | DirectStateObject state = new DirectStateObject(); 71 | state.workSocket = client; 72 | 73 | Debug.Log("[UDP multicast] Receive"); 74 | 75 | // Begin receiving the data from the remote device. 76 | client.BeginReceive( state.buffer, 0, DirectStateObject.BufferSize, 0, 77 | new AsyncCallback(ReceiveCallback), state); 78 | 79 | } catch (Exception e) 80 | { 81 | Debug.Log(e.ToString()); 82 | return false; 83 | } 84 | 85 | return true; 86 | } 87 | 88 | private static void ReceiveCallback( IAsyncResult ar ) 89 | { 90 | try { 91 | //Debug.Log("[UDP multicast] Start ReceiveCallback"); 92 | // Retrieve the state object and the client socket 93 | // from the asynchronous state object. 94 | DirectStateObject state = (DirectStateObject) ar.AsyncState; 95 | Socket client = state.workSocket; 96 | 97 | // Read data from the remote device. 98 | int bytesRead = client.EndReceive(ar); 99 | 100 | if (bytesRead > 0 && _isIsActiveThread) 101 | { 102 | ReadPacket(state.buffer); 103 | 104 | //client.Shutdown(SocketShutdown.Both); 105 | //client.Close(); 106 | 107 | client.BeginReceive(state.buffer,0,DirectStateObject.BufferSize,0, 108 | new AsyncCallback(ReceiveCallback), state); 109 | } else 110 | { 111 | Debug.LogWarning("[UDP] - End ReceiveCallback"); 112 | 113 | if(_isIsActiveThread == false) 114 | { 115 | Debug.LogWarning("[UDP] - Closing port"); 116 | _isInitRecieveStatus = false; 117 | //client.Shutdown(SocketShutdown.Both); 118 | client.Close(); 119 | } 120 | 121 | // Signal that all bytes have been received. 122 | } 123 | } catch (Exception e) 124 | { 125 | Debug.LogError(e.ToString()); 126 | } 127 | 128 | } 129 | 130 | private static void ReadPacket(Byte[] b) 131 | { 132 | int offset = 0; 133 | int nBytes = 0; 134 | int[] iData = new int[100]; 135 | float[] fData = new float[500]; 136 | 137 | Buffer.BlockCopy(b, offset, iData, 0, 2); offset += 2; 138 | int messageID = iData[0]; 139 | 140 | Buffer.BlockCopy(b, offset, iData, 0, 2); offset += 2; 141 | nBytes = iData[0]; 142 | 143 | //Debug.Log("[UDPClient] Processing Received Packet (Message ID : " + messageID + ")"); 144 | if (messageID == 5) // Data descriptions 145 | { 146 | Debug.Log("DirectParseClient: Data descriptions"); 147 | 148 | }else if (messageID == 7) // Frame of Mocap Data 149 | { 150 | _strFrameLog = String.Format("DirectParseClient: [UDPClient] Read FrameOfMocapData: {0}\n", nBytes); 151 | Buffer.BlockCopy(b, offset, iData, 0, 4); offset += 4; 152 | _strFrameLog += String.Format("Frame # : {0}\n", iData[0]); 153 | 154 | //number of data sets (markersets, rigidbodies, etc) 155 | Buffer.BlockCopy(b, offset, iData, 0, 4); offset += 4; 156 | int nMarkerSets = iData[0]; 157 | _strFrameLog += String.Format("MarkerSets # : {0}\n", iData[0]); 158 | 159 | for (int i = 0; i < nMarkerSets; i++) 160 | { 161 | String strName = ""; 162 | int nChars = 0; 163 | while (b[offset + nChars] != '\0') 164 | { 165 | nChars++; 166 | } 167 | strName = System.Text.Encoding.ASCII.GetString(b, offset, nChars); 168 | offset += nChars + 1; 169 | 170 | Buffer.BlockCopy(b, offset, iData, 0, 4); offset += 4; 171 | _strFrameLog += String.Format("{0}:" + strName + ": marker count : {1}\n", i, iData[0]); 172 | 173 | nBytes = iData[0] * 3 * 4; 174 | Buffer.BlockCopy(b, offset, fData, 0, nBytes); offset += nBytes; 175 | //do not need 176 | } 177 | 178 | // Other Markers - All 3D points that were triangulated but not labeled for the given frame. 179 | Buffer.BlockCopy(b, offset, iData, 0, 4); offset += 4; 180 | _strFrameLog += String.Format("Other Markers : {0}\n", iData[0]); 181 | nBytes = iData[0] * 3 * 4; 182 | Buffer.BlockCopy(b, offset, fData, 0, nBytes); offset += nBytes; 183 | 184 | // Rigid Bodies 185 | //RigidBody rb = new RigidBody(); 186 | Buffer.BlockCopy(b, offset, iData, 0, 4); offset += 4; 187 | _dataStream._nRigidBodies = iData[0]; 188 | _strFrameLog += String.Format("Rigid Bodies : {0}\n", iData[0]); 189 | for (int i = 0; i < _dataStream._nRigidBodies; i++) 190 | { 191 | ReadRigidBody(b, ref offset, _dataStream._rigidBody[i]); 192 | } 193 | 194 | //Debug.Log(_strFrameLog); 195 | 196 | }else if (messageID == 100) 197 | { 198 | 199 | } 200 | 201 | } 202 | 203 | // Unpack RigidBody data 204 | private static void ReadRigidBody(Byte[] b, ref int offset, OptiTrackRigidBody rb) 205 | { 206 | try 207 | { 208 | int[] iData = new int[100]; 209 | float[] fData = new float[100]; 210 | 211 | // RB ID 212 | Buffer.BlockCopy(b, offset, iData, 0, 4); offset += 4; 213 | //int iSkelID = iData[0] >> 16; // hi 16 bits = ID of bone's parent skeleton 214 | //int iBoneID = iData[0] & 0xffff; // lo 16 bits = ID of bone 215 | rb.ID = iData[0]; // already have it from data descriptions 216 | 217 | // RB pos 218 | float[] pos = new float[3]; 219 | Buffer.BlockCopy(b, offset, pos, 0, 4 * 3); offset += 4 * 3; 220 | rb.position.x = pos[0]; rb.position.y = pos[1]; rb.position.z = pos[2]; 221 | 222 | // RB ori 223 | float[] ori = new float[4]; 224 | Buffer.BlockCopy(b, offset, ori, 0, 4 * 4); offset += 4 * 4; 225 | rb.orientation.x = ori[0]; rb.orientation.y = ori[1]; rb.orientation.z = ori[2]; rb.orientation.w = ori[3]; 226 | Buffer.BlockCopy(b, offset, iData, 0, 4); offset += 4; 227 | int nMarkers = iData[0]; 228 | Buffer.BlockCopy(b, offset, fData, 0, 4 * 3 * nMarkers); offset += 4 * 3 * nMarkers; 229 | 230 | Buffer.BlockCopy(b, offset, iData, 0, 4 * nMarkers); offset += 4 * nMarkers; 231 | 232 | Buffer.BlockCopy(b, offset, fData, 0, 4 * nMarkers); offset += 4 * nMarkers; 233 | 234 | Buffer.BlockCopy(b, offset, fData, 0, 4); offset += 4; 235 | } catch (Exception e) 236 | { 237 | Debug.LogError(e.ToString()); 238 | } 239 | } 240 | 241 | // Use this for initialization 242 | public static void Start () 243 | { 244 | StartClient(); 245 | } 246 | 247 | public static void Close () 248 | { 249 | _isIsActiveThread = false; 250 | } 251 | public static bool IsInit() 252 | { 253 | return _isInitRecieveStatus; 254 | } 255 | public static DataStream GetDataStream() 256 | { 257 | return _dataStream; 258 | } 259 | } 260 | } -------------------------------------------------------------------------------- /Assets/Scripts/DirectMulticastSocketClient.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e3bdb4106448e9243bc9bd178dfe5813 3 | MonoImporter: 4 | serializedVersion: 2 5 | defaultReferences: [] 6 | executionOrder: 0 7 | icon: {instanceID: 0} 8 | userData: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/OptiTrackManager.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * Adapted from johny3212 3 | * Written by Matt Oskamp 4 | */ 5 | using UnityEngine; 6 | using System; 7 | using System.Collections; 8 | using OptitrackManagement; 9 | 10 | public class OptiTrackManager : MonoBehaviour 11 | { 12 | public string myName; 13 | public float scale = 20.0f; 14 | private static OptiTrackManager instance; 15 | public Vector3 origin = Vector3.zero; // set this to wherever you want the center to be in your scene 16 | 17 | public static OptiTrackManager Instance 18 | { 19 | get { return instance; } 20 | } 21 | 22 | void Awake() 23 | { 24 | instance = this; 25 | } 26 | 27 | ~OptiTrackManager () 28 | { 29 | Debug.Log("OptitrackManager: Destruct"); 30 | OptitrackManagement.DirectMulticastSocketClient.Close(); 31 | } 32 | 33 | void Start () 34 | { 35 | Debug.Log(myName + ": Initializing"); 36 | 37 | OptitrackManagement.DirectMulticastSocketClient.Start(); 38 | Application.runInBackground = true; 39 | } 40 | 41 | public OptiTrackRigidBody getOptiTrackRigidBody(int index) 42 | { 43 | // only do this if you want the raw data 44 | if(OptitrackManagement.DirectMulticastSocketClient.IsInit()) 45 | { 46 | DataStream networkData = OptitrackManagement.DirectMulticastSocketClient.GetDataStream(); 47 | return networkData.getRigidbody(index); 48 | } 49 | else 50 | { 51 | OptitrackManagement.DirectMulticastSocketClient.Start(); 52 | return getOptiTrackRigidBody(index); 53 | } 54 | } 55 | 56 | public Vector3 getPosition(int rigidbodyIndex) 57 | { 58 | if(OptitrackManagement.DirectMulticastSocketClient.IsInit()) 59 | { 60 | DataStream networkData = OptitrackManagement.DirectMulticastSocketClient.GetDataStream(); 61 | Vector3 pos = origin + networkData.getRigidbody(rigidbodyIndex).position * scale; 62 | pos.x = -pos.x; // not really sure if this is the best way to do it 63 | //pos.y = pos.y; // these may change depending on your configuration and calibration 64 | //pos.z = -pos.z; 65 | return pos; 66 | } 67 | else 68 | { 69 | return Vector3.zero; 70 | } 71 | } 72 | 73 | public Quaternion getOrientation(int rigidbodyIndex) 74 | { 75 | // should add a way to filter it 76 | if(OptitrackManagement.DirectMulticastSocketClient.IsInit()) 77 | { 78 | DataStream networkData = OptitrackManagement.DirectMulticastSocketClient.GetDataStream(); 79 | Quaternion rot = networkData.getRigidbody(rigidbodyIndex).orientation; 80 | 81 | // change the handedness from motive 82 | //rot = new Quaternion(rot.z, rot.y, rot.x, rot.w); // depending on calibration 83 | 84 | // Invert pitch and yaw 85 | Vector3 euler = rot.eulerAngles; 86 | rot.eulerAngles = new Vector3(euler.x, -euler.y, euler.z); // these may change depending on your calibration 87 | 88 | return rot; 89 | } 90 | else 91 | { 92 | return Quaternion.identity; 93 | } 94 | } 95 | 96 | public void DeInitialize() 97 | { 98 | OptitrackManagement.DirectMulticastSocketClient.Close(); 99 | } 100 | 101 | // Update is called once per frame 102 | void Update () 103 | { 104 | 105 | } 106 | } -------------------------------------------------------------------------------- /Assets/Scripts/OptiTrackManager.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 543e5ebd2d12bbf4f99c9c67ad95b7d6 3 | MonoImporter: 4 | serializedVersion: 2 5 | defaultReferences: [] 6 | executionOrder: 0 7 | icon: {instanceID: 0} 8 | userData: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/OptiTrackObject.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * Adapted from johny3212 3 | * Written by Matt Oskamp 4 | */ 5 | using UnityEngine; 6 | using System.Collections; 7 | 8 | public class OptiTrackObject : MonoBehaviour { 9 | 10 | public int rigidbodyIndex; 11 | public Vector3 rotationOffset; 12 | 13 | // Use this for initialization 14 | void Start () { 15 | 16 | } 17 | 18 | // Update is called once per frame 19 | void Update () { 20 | Vector3 pos = OptiTrackManager.Instance.getPosition(rigidbodyIndex); 21 | Quaternion rot = OptiTrackManager.Instance.getOrientation(rigidbodyIndex); 22 | rot = rot * Quaternion.Euler(rotationOffset); 23 | this.transform.position = pos; 24 | this.transform.rotation = rot; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Assets/Scripts/OptiTrackObject.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 050c1b3fd9915a246a012c11fc964568 3 | MonoImporter: 4 | serializedVersion: 2 5 | defaultReferences: [] 6 | executionOrder: 0 7 | icon: {instanceID: 0} 8 | userData: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/SkeletonClass.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * Adapted from johny3212 3 | * Written by Matt Oskamp 4 | */ 5 | using UnityEngine; 6 | using System; 7 | using System.Collections; 8 | using System.Collections.Generic; 9 | using System.Net; 10 | 11 | namespace OptitrackManagement 12 | { 13 | 14 | // marker 15 | public class Marker 16 | { 17 | public int ID = -1; 18 | public Vector3 pos; 19 | } 20 | 21 | // Rigidbody 22 | public class OptiTrackRigidBody 23 | { 24 | public string name = ""; 25 | public int ID = -1; 26 | public int parentID = -1; 27 | public Vector3 position; 28 | public Quaternion orientation; 29 | } 30 | } -------------------------------------------------------------------------------- /Assets/Scripts/SkeletonClass.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b5711267177797a46b41df8c6929101f 3 | MonoImporter: 4 | serializedVersion: 2 5 | defaultReferences: [] 6 | executionOrder: 0 7 | icon: {instanceID: 0} 8 | userData: 9 | -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/ProjectSettings/AudioManager.asset -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/ProjectSettings/DynamicsManager.asset -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/ProjectSettings/EditorBuildSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/ProjectSettings/EditorSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/ProjectSettings/GraphicsSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/ProjectSettings/InputManager.asset -------------------------------------------------------------------------------- /ProjectSettings/NavMeshLayers.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/ProjectSettings/NavMeshLayers.asset -------------------------------------------------------------------------------- /ProjectSettings/NetworkManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/ProjectSettings/NetworkManager.asset -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/ProjectSettings/Physics2DSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/ProjectSettings/ProjectSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/ProjectSettings/QualitySettings.asset -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/ProjectSettings/TagManager.asset -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozzyonfire/UnityOptitrack/b9a5648ff7b07aaa9647cb51531b96484207f5a4/ProjectSettings/TimeManager.asset -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | UnityOptitrack 2 | ============== 3 | 4 | A test project to get Optitrack streaming into Unity 3D without using a .dll 5 | 6 | Open test.scene in Unity to load a scene already configured to work with Motive. 7 | --------------------------------------------------------------------------------