示例#1
0
        public Matrix4x4 GetLocalToWorldMatrix()
        {
            if (_useOpenVR)
            {
                var centerEyeToCameraTransform = CoordinatesHelper.GetCenterEyeToCameraTransform();
                var headPose = _openVRManager.GetHeadPoseFor(secondsAgo: _estimatedEyeTrackerLatency_s);

                // OpenVR head pose does not include camera offset so it needs to be added
                _lastLocalToWorldTransform = centerEyeToCameraTransform * headPose;
            }
            else
            {
                var sample = _history[(_history.Length + _writeIndex - 1 - _headPoseDelayInFrames) % _history.Length];
                if (sample.timestamp_us == 0)
                {
                    return(GetCameraLocalToWorldMatrix());
                }
                _lastLocalToWorldTransform = sample.matrix;
            }

            return(_lastLocalToWorldTransform);
        }
        public void Tick()
        {
            _headToCenterEyeTranslation = CoordinatesHelper.GetHeadToCenterEyeTranslation();
            _hmdToWorldTransformer.Tick();
            _localToWorldMatrix = _hmdToWorldTransformer.GetLocalToWorldMatrix();

            // Copy consumer data
            lock (_lockEyeTrackingDataLocal)
            {
                EyeTrackingDataHelper.Copy(_eyeTrackingDataLocalInternal, _eyeTrackingDataLocal);
            }
            _eyeTrackingDataLocal.Timestamp = Time.unscaledTime;

            // Shuffle data from internal queue to public queue
            lock (_lockAdvancedData)
            {
                while (_advancedInternalQueue.Count > 1)
                {
                    _advancedPublicQueue.Enqueue(_advancedInternalQueue.Dequeue());
                }

                // Copy newest data to _advancedEyeTrackingData
                if (_advancedInternalQueue.Count == 1)
                {
                    var data = _advancedInternalQueue.Dequeue();
                    EyeTrackingDataHelper.Copy(data, _advancedEyeTrackingData);
                    _advancedPublicQueue.Enqueue(data);
                }

                // Limit size of public queue
                while (_advancedPublicQueue.Count > AdvancedDataQueueSize)
                {
                    _advancedPublicQueue.Dequeue();
                }
            }
        }
示例#3
0
        private void OnAdvancedWearableData(ref tobii_wearable_advanced_data_t data)
        {
            var advancedData = _advancedData.Count >= AdvancedDataQueueSize
                ? _advancedData.Dequeue()
                : new TobiiXR_AdvancedEyeTrackingData();

            StreamEngineDataMapper.MapAdvancedData(advancedData, ref data,
                                                   _streamEngineTracker.ConvergenceDistanceSupported, CoordinatesHelper.GetHeadToCenterEyeTranslation());
            _advancedData.Enqueue(advancedData);

            // Keep a copy of latest received value
            EyeTrackingDataHelper.Copy(advancedData, _advancedEyeTrackingData);

            // Also fill in consumer api
            StreamEngineDataMapper.FromAdvancedData(_eyeTrackingDataLocal, ref data,
                                                    _streamEngineTracker.ConvergenceDistanceSupported, CoordinatesHelper.GetHeadToCenterEyeTranslation());
            _eyeTrackingDataLocal.Timestamp = Time.unscaledTime;
        }
示例#4
0
 private void OnWearableData(ref tobii_wearable_consumer_data_t data)
 {
     StreamEngineDataMapper.FromConsumerData(_eyeTrackingDataLocal, ref data,
                                             _streamEngineTracker.ConvergenceDistanceSupported, CoordinatesHelper.GetHeadToCenterEyeTranslation());
     _eyeTrackingDataLocal.Timestamp = Time.unscaledTime;
 }