// Use this for initialization
 void Start()
 {
     controller  = FindObjectOfType <TrackingController>();
     VRPNTracker = GetComponent <TrackerTransform>();
     VRPNButton  = GetComponent <Tracker_Button_Server>();
     sarTracker  = GetComponent <SARTracker>();
 }
예제 #2
0
        void handleMsg(string message)
        {
            TrackerTransform tt = JsonUtility.FromJson <TrackerTransform>(message);

            //RIGHT-Handed coordinate system coming from vive
            //Converting to Unity's LEFT-handed ccords system
            tt.position.x *= -1.0f;
            tt.rotation    = new Quaternion(-tt.rotation.x, tt.rotation.y, tt.rotation.z, -tt.rotation.w);

            if (tt.id.Equals("tracker0"))
            {
                bTT_0 = true;
                lastTrackerTransform_0 = tt;
                canReadCam_0           = true;
                //Debug.Log("HOLO " + ht.position.ToString() + " : " + ht.rotation.eulerAngles.ToString() + " from " + source);

                ++count_sps;
            }
            if (tt.id.Equals("tracker1"))
            {
                bTT_1 = true;
                lastTrackerTransform_1 = tt;
                canReadCam_1           = true;
                //Debug.Log("HOLO " + ht.position.ToString() + " : " + ht.rotation.eulerAngles.ToString() + " from " + source);

                ++count_sps;
            }
            //Debug.Log("HOLO " + tt.id + " " + tt.position.ToString() + " : " + tt.rotation.eulerAngles.ToString() + " from " + source);
            //++count_sps;
        }
예제 #3
0
        public override void StartTracker(HumanoidControl _humanoid)
        {
            humanoid = _humanoid;

            if (!enabled)
            {
                return;
            }

            if (useLeapPackage && isHeadMounted)
            {
                AddXRServiceProvider();

                if (leapProvider == null)
                {
                    leapProvider = Leap.Unity.Hands.Provider;
                }

                leapProvider.OnUpdateFrame -= OnUpdateFrame;
                leapProvider.OnUpdateFrame += OnUpdateFrame;
            }
            else
            {
                device = new LeapDevice();
                device.Init();

                leapTransform = device.GetTracker();

                AddTracker(humanoid, "LeapMotion");
                if (isHeadMounted)
                {
                    SetTrackerOnCamera();
                }
            }
        }
예제 #4
0
    void UpdateViveHoloTracker()
    {
        //LEFT-handed (converted from RIGHT-handed when receiving data)
        TrackerTransform TrackerHoloT = Instance.lastTrackerTransform_0;

        ViveHoloTracker.transform.position = ViveEmitter.transform.position + ViveEmitter.transform.TransformVector(TrackerHoloT.position);
        ViveHoloTracker.transform.rotation = ViveEmitter.transform.rotation * TrackerHoloT.rotation;
    }
예제 #5
0
    void UpdateViveEmitterCalibration()
    {
        //LEFT-handed (converted from RIGHT-handed when receiving data)
        TrackerTransform TrackerTableT = Instance.lastTrackerTransform_1;

        //Debug.Log (TrackerTableT.position);
        //Vive emitter transform according to tracker 1
        ViveEmitter.transform.rotation = ViveCASTTracker.transform.rotation * Quaternion.Inverse(TrackerTableT.rotation);
        ViveEmitter.transform.position = ViveCASTTracker.transform.position + ViveEmitter.transform.TransformVector(-TrackerTableT.position);
    }
예제 #6
0
    public void StoreViveEmitterCalibration()
    {
        //LEFT-handed (converted from RIGHT-handed when receiving data)
        TrackerTransform TrackerTableT = Instance.lastTrackerTransform_1;

        //Debug.Log (TrackerTableT.position);
        //Vive emitter transform according to tracker 1
        ViveEmitter.transform.rotation = ViveCASTTracker.transform.rotation * Quaternion.Inverse(TrackerTableT.rotation);
        ViveEmitter.transform.position = ViveCASTTracker.transform.position + ViveEmitter.transform.TransformVector(-TrackerTableT.position);
        string jsonData = JsonUtility.ToJson(TrackerTableT);

        File.WriteAllText(filePath, jsonData);
        ViveEmitter_calibrated = true;
    }
예제 #7
0
        public override void StartTracker(HumanoidControl _humanoid)
        {
            humanoid = _humanoid;

            if (!enabled)
            {
                return;
            }

            device = new NeuronDevice();
            device.Init(address, port);
            neuronTransform = device.GetTracker();

            AddTracker(humanoid, "PerceptionNeuron");
        }
예제 #8
0
        public override void StartTracker(HumanoidControl _humanoid)
        {
            humanoid = _humanoid;

            if (!enabled)
            {
                return;
            }

            device = new Kinect1Device();
            device.Init();

            kinect1Transform = device.GetTracker();

            AddTracker(humanoid, "Microsoft Kinect 1");
        }
예제 #9
0
        public override void StartTracker(HumanoidControl _humanoid)
        {
            humanoid = _humanoid;

            if (!enabled)
            {
                return;
            }

            device = new AstraDevice();
            device.Init();

            astraTransform = device.GetTracker();

            AddTracker(humanoid, "Orbbec Astra");
        }
예제 #10
0
 public void LoadViveEmitterVCalibration()
 {
     if (File.Exists(filePath))
     {
         StreamReader     reader   = new StreamReader(filePath);
         string           jsonData = reader.ReadToEnd();
         TrackerTransform tt       = JsonUtility.FromJson <TrackerTransform>(jsonData);
         ViveEmitter.transform.rotation = ViveCASTTracker.transform.rotation * Quaternion.Inverse(tt.rotation);
         ViveEmitter.transform.position = ViveCASTTracker.transform.position + ViveEmitter.transform.TransformVector(-tt.position);
         ViveEmitter_calibrated         = true;
     }
     else
     {
         Debug.Log("Calibration File does not exist.");
     }
 }
예제 #11
0
    private void AdjustPointcloud(TrackerTransform targetTransform, Pose refPose)
    {
        Pose controllerPose = VivePose.GetPose(calibrationController);
        // The delta rotation of the hand controller
        Quaternion rotationOffset = controllerPose.rotation * Quaternion.Inverse(calibrationControllerReferencePose.rotation);

        print("rotationOffset: w=" + rotationOffset.w + " x=" + rotationOffset.x + " y=" + rotationOffset.y + " z=" + rotationOffset.z);
        // Force Unity to use "small" angles (below 180 degrees)
        if (rotationOffset.w < 0f)
        {
            rotationOffset.w = -rotationOffset.w;
            rotationOffset.x = -rotationOffset.x;
            rotationOffset.y = -rotationOffset.y;
            rotationOffset.z = -rotationOffset.z;
        }
        rotationOffset.ToAngleAxis(out float deltaRotationAngle, out Vector3 deltaRotationAxis);
        // Force Unity to not switch the axis after 180 degrees rotation. We simply set current rotation as reference
        if (deltaRotationAngle > 150)
        {
            SetAdjustmentReferencePoses();
            return;
        }
        print("rotationOffset angle: " + deltaRotationAngle + "\t axis: " + deltaRotationAxis);
        Vector3 positionOffset = controllerPose.position - calibrationControllerReferencePose.position;


        // Always rotate and position from the reference
        targetTransform.transform.rotation = refPose.rotation;
        targetTransform.transform.position = refPose.position;

        Quaternion scaledRotationOffset = Quaternion.Slerp(Quaternion.identity, rotationOffset, adjustmentRatio);

        print("scaledRotationOffset: " + scaledRotationOffset);
        scaledRotationOffset.ToAngleAxis(out float scaledDeltaRotationAngle, out Vector3 scaledDeltaRotationAxis);
        print("scaledRotationOffset angle: " + scaledDeltaRotationAngle + "\t axis: " + scaledDeltaRotationAxis);


        targetTransform.transform.RotateAround(calibrationControllerReferencePose.position, scaledDeltaRotationAxis, scaledDeltaRotationAngle);
        targetTransform.transform.position += (positionOffset * adjustmentRatio);
    }
예제 #12
0
    private void SaveTransform(TrackerTransform slot, int slotNum)
    {
        if (slot == null)
        {
            slot = new TrackerTransform();
        }

        slot.ConfVersion     = ConfigVersion;
        slot.Chest_Position  = V_Chest.transform.position;
        slot.Chest_Rotation  = V_Chest.transform.rotation;
        slot.Foot_L_Position = V_Foot_L.transform.position;
        slot.Foot_L_Rotation = V_Foot_L.transform.rotation;
        slot.Foot_R_Position = V_Foot_R.transform.position;
        slot.Foot_R_Rotation = V_Foot_R.transform.rotation;

        var json = JsonUtility.ToJson(slot, true);

        if (!Directory.Exists(SavePath))
        {
            Directory.CreateDirectory(SavePath);
        }
        File.WriteAllText(SavePath + "\\Slot" + slotNum + ".json", json, new UTF8Encoding(false));
    }
        private static void Init()
        {
            if (_inGamePlayerStats != null)
            {
                return;
            }

            _doneInitializing = false;

            _inGamePlayerStats = new Dictionary <string, InGameWorldVariable>(StringComparer.OrdinalIgnoreCase);

            if (TrackerTransform == null)
            {
                return;
            }

            // set up variables for use
            for (var i = 0; i < TrackerTransform.childCount; i++)
            {
                var oTrans = TrackerTransform.GetChild(i);
                var oStat  = oTrans.GetComponent <WorldVariable>();

                if (oStat == null)
                {
                    LevelSettings.LogIfNew("Transform '" + oTrans.name +
                                           "' under WorldVariables does not contain a WorldVariable script. Please fix this.");
                    continue;
                }

                if (_inGamePlayerStats.ContainsKey(oStat.name))
                {
                    LevelSettings.LogIfNew("You have more than one World Variable named '" + oStat.name +
                                           "' in this Scene. Please make sure the names are unique.");
                    continue;
                }

                var newStatTracker = new InGameWorldVariable(oStat, oStat.name, oStat.varType);

                if (Application.isPlaying)
                {
                    // do not update values when we're in edit mode!
                    switch (oStat.persistanceMode)
                    {
                    case WorldVariable.StatPersistanceMode.ResetToStartingValue:
                        switch (oStat.varType)
                        {
                        case VariableType._integer:
                            newStatTracker.CurrentIntValue = oStat.startingValue;
                            break;

                        case VariableType._float:
                            newStatTracker.CurrentFloatValue = oStat.startingValueFloat;
                            break;
                        }
                        break;

                    case WorldVariable.StatPersistanceMode.KeepFromPrevious:
                        // set to value in player prefs
                        break;
                    }

                    if (oStat.listenerPrefab != null)
                    {
                        var variable = GetExistingWorldVariableIntValue(oStat.name, oStat.startingValue);
                        if (variable != null)
                        {
                            oStat.listenerPrefab.UpdateValue(variable.Value, variable.Value);
                        }
                    }
                }

                _inGamePlayerStats.Add(oStat.name, newStatTracker);
            }

            _doneInitializing = true;
        }
예제 #14
0
    // Update is called once per frame
    void LateUpdate()
    {
        //TrackerTransform tt = new TrackerTransform();
        //string st = JsonUtility.ToJson(tt);
        ////Debug.Log("UPDATE");
        //Debug.Log(st);

        if (Input.GetKeyDown(KeyCode.C) && !calibrating)
        {
            //this.StartCalibrateOrigin();
            //this.CalibrateViveWithHololens();
            if (Instance.bTT_0 && !calibrating)
            {
                if (ViveEmitter_calibrated)
                {
                    CalibrateViveWithHololens();
                }
            }
            Debug.Log("C pressed");
        }
        if (Input.GetKeyDown(KeyCode.H) && !calibrating)
        {
            this.CalibrateRotation();
            Debug.Log("H pressed");
        }
        if (Input.GetKeyDown(KeyCode.S) && !calibrating)
        {
            Debug.Log("Confirm calibration of table, store the position and orientation of table");
            //this.StoreTableCalibration();
            this.StoreViveEmitterCalibration();
        }
        if (Input.GetKeyDown(KeyCode.L) && !calibrating)
        {
            Debug.Log("Load calibration data from previous one");
            //this.LoadTableCalibration();
            this.LoadViveEmitterVCalibration();
        }
        if (Input.GetKeyDown(KeyCode.E) && !calibrating)
        {
            Debug.Log("E pressed");
            this.CalibrateViveEmitter();
        }
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            //Debug.Log("Up Arrow Key pressed");
            HoloToTrackerDisplacement += new Vector3(0, 0.002f, 0);
            Debug.Log(HoloToTrackerDisplacement.ToString("F4"));
        }
        if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            //Debug.Log("Down Arrow Key pressed");
            HoloToTrackerDisplacement += new Vector3(0, -0.002f, 0);
            Debug.Log(HoloToTrackerDisplacement.ToString("F4"));
        }
        if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            //Debug.Log("Right Arrow Key pressed");
            //backward
            HoloToTrackerDisplacement += new Vector3(0, 0, 0.002f);
            Debug.Log(HoloToTrackerDisplacement.ToString("F4"));
        }
        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            //Debug.Log("Left Arrow Key pressed");
            //forward
            HoloToTrackerDisplacement += new Vector3(0, 0, -0.002f);
            Debug.Log(HoloToTrackerDisplacement.ToString("F4"));
        }
        //if (Instance.bTT_1 && !calibrating)
        //{
        //    Vector3 pos = Instance.lastTrackerTransform_1.position;
        //    Vector3 mid_pos = this.rotateAroundAxis(pos, new Vector3(0, 0, 0), re_from0toTable);
        //    //position relative to vive meter
        //    Vector3 mid2_pos = new Vector3(-mid_pos.x, -mid_pos.z, mid_pos.y);
        //    //Vector3 final_pos = meter_position + mid2_pos;



        //    //Transform localToCamera = Camera.main.transform.Find("TrackerLocalToCamera");
        //    //localToCamera.position = meter_position;
        //    //localToCamera.localPosition = localToCamera.localPosition + mid2_pos;
        //    //this.transform.position = localToCamera.position;

        //    Transform calibratedChildTrans = calibratedCamChild.transform;
        //    calibratedChildTrans.position = meter_position;
        //    calibratedChildTrans.localPosition = calibratedChildTrans.localPosition + mid2_pos;
        //    this.transform.position = calibratedChildTrans.position;


        //    //Quaternion rot = Quaternion.Euler(90, 0, 0) * Quaternion.Inverse(Instance.lastTrackerTransform.rotation);
        //    Quaternion rot = (Instance.lastTrackerTransform_1.rotation);

        //    //version1 by far best (y axis works)
        //    //rot = new Quaternion(rot.x, -rot.y, -rot.z, rot.w);
        //    //Quaternion re_from0toTable_left = new Quaternion(re_from0toTable.x, -re_from0toTable.y, -re_from0toTable.z, re_from0toTable.w);

        //    //version2 not working
        //    //rot = new Quaternion(rot.x, -rot.z, -rot.y, rot.w);
        //    //Quaternion re_from0toTable_left = new Quaternion(re_from0toTable.x, -re_from0toTable.z, -re_from0toTable.y, re_from0toTable.w);

        //    //version3 not working
        //    //rot = new Quaternion(-rot.x, rot.y, -rot.z, rot.w);
        //    //Quaternion re_from0toTable_left = new Quaternion(-re_from0toTable.x, re_from0toTable.y, -re_from0toTable.z, re_from0toTable.w);

        //    //version4
        //    rot = new Quaternion(rot.x, rot.z, -rot.y, rot.w);
        //    Quaternion change = rot_calib * meter_rot * rot;
        //    this.transform.localRotation = camera_rot * change;
        //}
        if (Instance.bTT_0 && Instance.bTT_1 && !calibrating)
        {
            TrackerTransform TT0 = Instance.lastTrackerTransform_0;
            TrackerTransform TT1 = Instance.lastTrackerTransform_1;
            if (TT0.position.x == 0 && TT0.position.y == 0 && TT0.position.z == 0 && TT0.rotation.x == 0 && TT0.rotation.y == 0 && TT0.rotation.z == 0 && TT0.rotation.w == 1.0f)
            {
                //Tracker0 Hololens one lose tracking
                Debug.Log("Tracker 0 lost tracking");
                //this.GetComponent<Renderer>().material.color = Color.blue;
                first_tracking = true;
                return;
            }
            else
            {
                //this.GetComponent<Renderer>().material.color = Color.white;
            }
            if (TT1.position.x == 0 && TT1.position.y == 0 && TT1.position.z == 0 && TT1.rotation.x == 0 && TT1.rotation.y == 0 && TT1.rotation.z == 0 && TT1.rotation.w == 1.0f)
            {
                //Tracker1 lose tracking
                Debug.Log("Tracker 1 lost tracking");
                //this.GetComponent<Renderer>().material.color = Color.red;
                first_tracking = true;
                return;
            }
            else
            {
                //this.GetComponent<Renderer>().material.color = Color.white;
            }
        }

        if (Instance.bTT_1 && !calibrating)
        {
            if (!ViveEmitter_calibrated)
            {
                UpdateViveEmitterCalibration();
            }

            UpdateViveHoloTracker();
        }
        if (Instance.bTT_0 && !calibrating)
        {
            if (ViveEmitter_calibrated)
            {
                CalibrateViveWithHololens();
            }
        }
    }