Пример #1
0
        /**
         * Updates the poses of all tracked devices in the Matrix4 format.
         * Also handles new tracked devices, setting them up in the scene
         * and loading their render models.
         */
        void updateMatrixPose()
        {
            if (mHMD == null)
            {
                return;
            }

            OpenVR.Compositor.WaitGetPoses(mScene.mTrackedDevices, gamePoseArray);

            for (uint i = 0; i < mScene.mTrackedDevices.Length; i++)
            {
                var device = gamePoseArray[i];
                if (device.bPoseIsValid)
                {
                    mScene.mDevicePose[i] = UtilOld.steamVRMatrixToMatrix4(mScene.mTrackedDevices[i].mDeviceToAbsoluteTracking);
                    mHMD.GetTrackedDeviceClass(i);
                    if (mScene.mDeviceClassChar[i] == 0)
                    {
                        switch (mHMD.GetTrackedDeviceClass(i))
                        {
                        case ETrackedDeviceClass.Controller:
                            mScene.mDeviceClassChar[i] = 'C';
                            string name = UtilOld.GetTrackedDeviceString(ref mHMD, i, ETrackedDeviceProperty.Prop_RenderModelName_String);
                            if (name.ToLower().Contains("left"))
                            {
                                mScene.leftControllerIdx = (int)i;
                                // Uncomment to show controller model.
                                //Geometry.Geometry g = new Geometry.Geometry(@"C:/workspace/SparrowHawk/src/resources/external_controller01_left.obj");
                                //Material.Material m = new Material.RGBNormalMaterial(.5f);
                                //SceneNode s = new SceneNode("LeftControllerModel", ref g, ref m);
                                //s.transform = Util.createTranslationMatrix(-mScene.mLeftControllerOffset.M14, -mScene.mLeftControllerOffset.M24, -mScene.mLeftControllerOffset.M34);
                                //mScene.leftControllerNode.add(ref s);
                            }
                            else if (name.ToLower().Contains("right"))
                            {
                                mScene.rightControllerIdx = (int)i;
                            }
                            else if (mScene.leftControllerIdx < 0)
                            {
                                mScene.leftControllerIdx = (int)i;
                            }
                            else if (mScene.rightControllerIdx < 0)
                            {
                                mScene.rightControllerIdx = (int)i;
                            }
                            break;

                        case ETrackedDeviceClass.HMD: mScene.mDeviceClassChar[i] = 'H'; break;

                        case ETrackedDeviceClass.Invalid: mScene.mDeviceClassChar[i] = 'I'; break;

                        case ETrackedDeviceClass.GenericTracker: mScene.mDeviceClassChar[i] = 'G'; break;

                        case ETrackedDeviceClass.TrackingReference: mScene.mDeviceClassChar[i] = 'T'; break;

                        default: mScene.mDeviceClassChar[i] = '?'; break;
                        }
                    }
                }
            }

            if (gamePoseArray[OpenVR.k_unTrackedDeviceIndex_Hmd].bPoseIsValid)
            {
                mScene.mHMDPose = UtilOld.steamVRMatrixToMatrix4(gamePoseArray[OpenVR.k_unTrackedDeviceIndex_Hmd].mDeviceToAbsoluteTracking).Inverted();
            }

            if (mScene.leftControllerIdx > 0)
            {
                mScene.leftControllerNode.transform = mScene.mDevicePose[mScene.leftControllerIdx] * mScene.mLeftControllerOffset;
            }
            if (mScene.rightControllerIdx > 0)
            {
                mScene.rightControllerNode.transform = mScene.mDevicePose[mScene.rightControllerIdx] * mScene.mRightControllerOffset;
            }
        }
Пример #2
0
        public bool init()
        {
            // Set up HMD
            EVRInitError eError = EVRInitError.None;

            mHMD = OpenVR.Init(ref eError, EVRApplicationType.VRApplication_Scene);

            if (eError == EVRInitError.None)
            {
                Rhino.RhinoApp.WriteLine("Booted VR System");
                renderPoseArray = new TrackedDevicePose_t[Valve.VR.OpenVR.k_unMaxTrackedDeviceCount];
                gamePoseArray   = new TrackedDevicePose_t[Valve.VR.OpenVR.k_unMaxTrackedDeviceCount];
            }
            else
            {
                Rhino.RhinoApp.WriteLine("Failed to boot");
                mTitleBase = "SparrowHawk (No VR Detected)";
            }

            // // THIS IS FOR UNCLIPPED
            // Width = 864;
            // Height = 820;

            // THIS IS FOR CLIPPED RECTANGLE
            Width  = 691;
            Height = 692;

            // Window Setup Info
            mStrDriver  = UtilOld.GetTrackedDeviceString(ref mHMD, OpenVR.k_unTrackedDeviceIndex_Hmd, ETrackedDeviceProperty.Prop_TrackingSystemName_String);
            mStrDisplay = UtilOld.GetTrackedDeviceString(ref mHMD, OpenVR.k_unTrackedDeviceIndex_Hmd, ETrackedDeviceProperty.Prop_SerialNumber_String);
            mTitleBase  = "SparrowHawk - " + mStrDriver + " " + mStrDisplay;
            Title       = mTitleBase;
            MakeCurrent();
            setupScene();


            if (eError == EVRInitError.None)
            {
                mRenderer = new VrRenderer(ref mHMD, ref mScene, mRenderWidth, mRenderHeight);
            }
            else
            {
                mRenderer = new VrRenderer(ref mHMD, ref mScene, mRenderWidth, mRenderHeight);
            }

            //use other 8 points for calibrartion
            robotCallibrationPointsTest.Add(new Vector3(22, 15, -100) / 1000);
            robotCallibrationPointsTest.Add(new Vector3(-10, 40, -153) / 1000);
            robotCallibrationPointsTest.Add(new Vector3(25, -25, -181) / 1000);

            foreach (Vector3 v in robotCallibrationPointsTest)
            {
                Vector4 v4 = new Vector4(v.X, v.Y, v.Z, 1);
                v4 = mScene.vrToRobot.Inverted() * v4;
                UtilOld.MarkPoint(ref mScene.staticGeometry, new Vector3(v4.X, v4.Y, v4.Z), 1, 1, 1);
            }
            robotCallibrationPointsTest.Clear();

            //set default matrix
            if (mRenderer.ovrvision_controller != null)
            {
                mRenderer.ovrvision_controller.setDefaultMatrixHC();
            }

            //detecting whether users in control or left
            Rhino.DocObjects.ObjectAttributes attr = new Rhino.DocObjects.ObjectAttributes();
            attr.Name = "user:out";
            Point3d userP = new Point3d(0, 0, 0);

            uGuid = mScene.rhinoDoc.Objects.AddPoint(userP, attr);

            //testing - rotate rhino object as well

            /*
             * Transform transM = new Transform();
             * for (int row = 0; row < 4; row++)
             * {
             *  for (int col = 0; col < 4; col++)
             *  {
             *      transM[row, col] = mScene.platformRotation[row, col];
             *  }
             * }
             * Rhino.DocObjects.ObjectEnumeratorSettings settings = new Rhino.DocObjects.ObjectEnumeratorSettings();
             * settings.ObjectTypeFilter = Rhino.DocObjects.ObjectType.Brep;
             * foreach (Rhino.DocObjects.RhinoObject rhObj in mScene.rhinoDoc.Objects.GetObjectList(settings))
             * {
             *  mDoc.Objects.Transform(rhObj.Id, transM, true);
             * }
             * mScene.rhinoDoc.Views.Redraw();
             */

            //testing visualize printStroke
            printStroke   = new Geometry.RobotPrintStroke(ref mScene);
            printStroke_m = new Material.SingleColorMaterial(1, 1, 0, 1.0f);

            return(eError == EVRInitError.None);
        }