/// <summary> /// Draws marker visualizations in the editor viewport for any selected OptitrackRigidBody component. /// </summary> void OnSceneGUI() { OptitrackRigidBody rb = target as OptitrackRigidBody; if (!rb || rb.StreamingClient == null) { return; } rb.StreamingClient._EnterFrameDataUpdateLock(); try { OptitrackRigidBodyDefinition rbDef = rb.StreamingClient.GetRigidBodyDefinitionById(rb.RigidBodyId); OptitrackRigidBodyState rbState = rb.StreamingClient.GetLatestRigidBodyState(rb.RigidBodyId); if (rbDef != null && rbState != null) { for (int iMarker = 0; iMarker < rbDef.Markers.Count; ++iMarker) { OptitrackRigidBodyDefinition.MarkerDefinition marker = rbDef.Markers[iMarker]; // Effectively treat the RB GameObject transform as a rigid transform by negating its local scale. Vector3 markerPos = marker.Position; markerPos.Scale(new Vector3(1.0f / rb.transform.localScale.x, 1.0f / rb.transform.localScale.y, 1.0f / rb.transform.localScale.z)); markerPos = rb.transform.TransformPoint(markerPos); float kMarkerSize = 0.02f; Matrix4x4 markerTransform = Matrix4x4.TRS(markerPos, Quaternion.identity, new Vector3(kMarkerSize, kMarkerSize, kMarkerSize)); for (int iPass = 0; iPass < m_markerMaterial.passCount; ++iPass) { if (m_markerMaterial.SetPass(iPass)) { Graphics.DrawMeshNow(m_markerMesh, markerTransform); } } } } } finally { rb.StreamingClient._ExitFrameDataUpdateLock(); } }
private void updateTrackedObjectState(bool active) { foreach (GameObject g in trackedObjects) { //Enable or disable physics on tracked object depending on active OptiTrack Rigidbody r = g.GetComponent <Rigidbody>(); if (r != null) { r.isKinematic = active; } //Enable or disable tracking script on tracked object depending on active OptiTrack OptitrackRigidBody o = g.GetComponent <OptitrackRigidBody>(); if (o != null) { o.enabled = active; } } }
/// <summary> /// Draws marker visualizations in the editor viewport for any selected OptitrackRigidBody component. /// </summary> void OnSceneGUI() { OptitrackRigidBody rb = target as OptitrackRigidBody; if (!rb || rb.StreamingClient == null) { return; } rb.StreamingClient._EnterFrameDataUpdateLock(); try { OptitrackRigidBodyState rbState = rb.StreamingClient.GetLatestRigidBodyState(rb.RigidBodyId); if (rbState != null && rbState.Markers != null) { for (int iMarker = 0; iMarker < rbState.Markers.Count; ++iMarker) { OptitrackMarkerState marker = rbState.Markers[iMarker]; Vector3 markerPos = marker.Position; if (rb.transform.parent) { markerPos = rb.transform.parent.TransformPoint(markerPos); } Matrix4x4 markerTransform = Matrix4x4.TRS(markerPos, Quaternion.identity, new Vector3(marker.Size, marker.Size, marker.Size)); Graphics.DrawMesh(m_markerMesh, markerTransform, m_markerMaterial, 0, camera: null, submeshIndex: 0, properties: null, castShadows: false, receiveShadows: false); } } } finally { rb.StreamingClient._ExitFrameDataUpdateLock(); } }
// Start is called before the first frame update void Start() { rigidBody = gameObject.GetComponent <OptitrackRigidBody>(); thread = new Thread(new ThreadStart(RecvData)); thread.Start(); }