Example #1
0
        /// <summary>
        /// Gets the pose of the given eye, predicted for the time when the current frame will scan out.
        /// </summary>

        public Pose GetEyePose
            (dpncEYE eye
            , dpnQuarterion pose
            , dpnVector3 position // position 在当前应该已经被转成左手系(Unity)了
            , float interpupillary_distance
            )
        {
            Quaternion rot = pose.ToQuaternion(); // 右手螺旋, 左手系 -> 左手螺旋,左手系(Unity)

            float eye_offset_x = 0.5f * interpupillary_distance;

            eye_offset_x = (eye == dpncEYE.LEFT) ? -eye_offset_x : eye_offset_x;

            float neck_to_eye_height = 0.0f;
            float eye_depth          = 0.0f; // PC: head model do in native sdk, Android: for compatible old game, do here as old apps

#if UNITY_ANDROID && !UNITY_EDITOR
            float eye_height    = 1.6f;
            float player_height = eye_height * 1.067f;                            // eye should be at 15/16 of total height.
            neck_to_eye_height = player_height * 0.0625f * DpnManager.worldScale; //neck_to_eye_height should be 1/16 of total height.
            eye_depth          = 0.0805f * DpnManager.worldScale;
#endif

            Vector3 neck_model = new Vector3(0.0f, neck_to_eye_height, eye_depth);
            Vector3 pos        = rot * (new Vector3(eye_offset_x, 0.0f, 0.0f) + neck_model); // neck-pivot space
            pos -= neck_model;                                                               // what it does is converting pos to initially oriented center-eye space, making the initial position of center eye (0,0,0)

            Pose ret = new Pose();
            ret.position    = pos + new Vector3(position.x, position.y, position.z);
            ret.orientation = rot;
            return(ret);
        }
Example #2
0
 /// <summary>
 /// Gets the head pose.
 /// </summary>
 /// <param name="predictionTime">The prediction time.</param>
 /// <returns></returns>
 public Pose GetHeadPose(double predictionTime = 0d)
 {
     #if UNITY_ANDROID && !UNITY_EDITOR
     dpnQuarterion pose     = Composer.DpnuGetPredictedPose(predictionTime);
     dpnVector3    position = Composer.DpnuGetPredictedPosition(predictionTime);
     #else
     dpnQuarterion pose     = Composer.DpnuGetPose();
     dpnVector3    position = Composer.DpnuGetPosition();
     #endif
     return(new Pose
     {
         position = new Vector3(position.x, position.y, position.z),
         orientation = pose.ToQuaternion(),
     });
 }
Example #3
0
        /// <summary>
        /// Updates the state of the device.
        /// </summary>
        public override void DpnpUpdate()
        {
            base.DpnpUpdate();
            double displayTime = Composer.DpnuGetPredictedDisplayTime(DpnManager.minimumVsync);

            pose = Composer.DpnuGetPredictedPose(displayTime); // 右手螺旋, 左手系, room坐标系 或者 惯性系
            if (DpnManager.peripheral == DPVRPeripheral.Polaris)
            {
                float[] temp_position = DpnpGetDeviceCurrentStatus().position_state[0];
                position   = new dpnVector3(temp_position[0], temp_position[1], temp_position[2]);
                position.z = -position.z;
            }
#if UNITY_ANDROID && !UNITY_EDITOR
            else if (DpnManager.peripheral == DPVRPeripheral.Nolo && NoloController._instance[(int)NoloController.NoloDevice.Nolo_Hmd] != null)
            {
                Vector3 temp_position = NoloController._instance[(int)NoloController.NoloDevice.Nolo_Hmd].transform.localPosition;
                position = new dpnVector3(temp_position.x, temp_position.y, temp_position.z);
            }
#endif
            else
            {
                position   = Composer.DpnuGetPredictedPosition(displayTime);
                position.z = -position.z;
            }


            position.x = position.x * DpnManager.worldScale;
            position.y = position.y * DpnManager.worldScale;
            position.z = position.z * DpnManager.worldScale;

            Pose posel = _sensor.GetEyePose(dpncEYE.LEFT, pose, position
                                            , DpnManager.DeviceInfo.ipd);
            Pose poser = _sensor.GetEyePose(dpncEYE.RIGHT, pose, position
                                            , DpnManager.DeviceInfo.ipd);

            //After GetEyePose: dpnQuarterion.ToQuaternion, 变成左手螺旋, 左手系, room坐标系 或者 惯性系

            //update eye's render target and transform
            _Update(posel, poser
                    , _monoscopic, _freezed);

            //Unity 使用的是左手螺旋,左手系

            UpdatePeripheral();
        }
 public extern static bool DpnuUpdatePose(dpnQuarterion pose, dpnVector3 position);
 public static void UpdatePose(dpnQuarterion pose, dpnVector3 pos)
 {
     Composer.DpnuUpdatePose(pose, pos);
 }
Example #6
0
        void ReadState(DpnDaydreamControllerState outState, DpnDaydreamControllerState lastState)
        {
            outState.connectionState = (DpnConnectionState)DpnpGetDeviceCurrentStatus().device_status;
            outState.apiStatus       = DpnControllerApiStatus.Ok;

            float[]       pose   = DpnpGetDeviceCurrentStatus().pose_state[0];
            dpnQuarterion rawOri = new dpnQuarterion {
                s = pose[0], i = pose[1], j = pose[2], k = pose[3]
            };
            dpnVector3 rawAccel = new dpnVector3 {
                x = pose[7], y = pose[8], z = pose[9]
            };
            dpnVector3 rawGyro = new dpnVector3 {
                x = pose[4], y = pose[5], z = pose[6]
            };

            outState.orientation = rawOri.ToQuaternion();
            //outState.orientation = new Quaternion(pose[1], pose[2], pose[3], pose[0]);
            outState.accel = new Vector3(rawAccel.x, rawAccel.y, -rawAccel.z);
            outState.gyro  = new Vector3(-rawGyro.x, -rawGyro.y, rawGyro.z);

            switch (DpnManager.peripheral)
            {
            case DPVRPeripheral.Flip:
            {
                float touchPos_x = DpnpGetDeviceCurrentStatus().axis_state[(int)DPNP_DAYDREAM_AXES.DPNP_DAYDREAM_AXIS_X][0];
                float touchPos_y = DpnpGetDeviceCurrentStatus().axis_state[(int)DPNP_DAYDREAM_AXES.DPNP_DAYDREAM_AXIS_Y][0];
                outState.touchPos   = new Vector2(touchPos_x, touchPos_y);
                outState.isTouching = 0 != DpnpGetDeviceCurrentStatus().button_state[(int)DPNP_FLIP_BUTTONS.DPNP_FLIP_BUTTON_TOUCH][0];

                outState.touchDown = !lastState.isTouching && outState.isTouching;
                outState.touchUp   = lastState.isTouching && !outState.isTouching;

                outState.appButtonState = 0 != DpnpGetDeviceCurrentStatus().button_state[(int)DPNP_FLIP_BUTTONS.DPNP_FLIP_BUTTON_APP][0];
                outState.appButtonDown  = !lastState.appButtonState && outState.appButtonState;
                outState.appButtonUp    = lastState.appButtonState && !outState.appButtonState;

                outState.clickButtonState = 0 != DpnpGetDeviceCurrentStatus().button_state[(int)DPNP_FLIP_BUTTONS.DPNP_FLIP_BUTTON_CLICK][0];
                outState.clickButtonDown  = !lastState.clickButtonState && outState.clickButtonState;
                outState.clickButtonUp    = lastState.clickButtonState && !outState.clickButtonState;

                outState.triggerButtonState = 0 != DpnpGetDeviceCurrentStatus().button_state[(int)DPNP_FLIP_BUTTONS.DPNP_FLIP_BUTTON_TRIGGGER][0];
                outState.triggerButtonDown  = !lastState.triggerButtonState && outState.triggerButtonState;
                outState.triggerButtonUp    = lastState.triggerButtonState && !outState.triggerButtonState;

                outState.volumeUpButtonState = false;
                outState.volumeUpButtonDown  = false;
                outState.volumeUpButtonUp    = false;

                outState.volumeDownButtonState = false;
                outState.volumeDownButtonDown  = false;
                outState.volumeDownButtonUp    = false;

                outState.recentering = 0 != DpnpGetDeviceCurrentStatus().button_state[(int)DPNP_FLIP_BUTTONS.DPNP_FLIP_BUTTON_RECENTERING][0];
                outState.recentered  = 0 != DpnpGetDeviceCurrentStatus().button_state[(int)DPNP_FLIP_BUTTONS.DPNP_FLIP_BUTTON_RECENTERED][0];

                //Debug.Log(" DpnDaydreamControllerState GetData:" + "connectionState = " + outState.connectionState
                //+ "  outState.accX = " + outState.accel.x + "   outState.accY = " + outState.accel.y + "  outState.accZ = " + outState.accel.z
                //+ "  outState.gyroX = " + outState.gyro.x + "   outState.gyroY = " + outState.gyro.y + "  outState.gyroZ = " + outState.gyro.z
                //+ "  outState.oriX = " + outState.orientation.x + "   outState.oriY = " + outState.orientation.y + "  outState.oriZ = " + outState.orientation.z
                //+ "  outState.touchX = " + outState.touchPos.x + "   outState.touchY = " + outState.touchPos.y
                //+ "  outState.btnAPP = " + outState.appButtonState + "   outState.btnHome = " + outState.recentering + "   outState.btnClick = " + outState.clickButtonState
                //+ "  outState.btnvolumeUp = " + outState.volumeUpButtonState + "   outState.btnvolumeDown = " + outState.volumeDownButtonState);

                // If the controller was recentered, we may also need to request that the headset be
                // recentered. We should do that only if VrCore does NOT implement recentering.
                outState.headsetRecenterRequested = outState.recentered;
                if (outState.touchUp)
                {
                    _touchUpPos = lastcontrollerState.touchPos;
                }
                break;
            }

            default:
            {
                float touchPos_x = DpnpGetDeviceCurrentStatus().axis_state[(int)DPNP_DAYDREAM_AXES.DPNP_DAYDREAM_AXIS_X][0];
                float touchPos_y = DpnpGetDeviceCurrentStatus().axis_state[(int)DPNP_DAYDREAM_AXES.DPNP_DAYDREAM_AXIS_Y][0];
                outState.touchPos   = new Vector2(touchPos_x, touchPos_y);
                outState.isTouching = (0 != touchPos_x) && (0 != touchPos_y);

                outState.touchDown = !lastState.isTouching && outState.isTouching;
                outState.touchUp   = lastState.isTouching && !outState.isTouching;

                outState.appButtonState = 0 != DpnpGetDeviceCurrentStatus().button_state[(int)DPNP_DAYDREAM_BUTTONS.DPNP_DAYDREAM_BUTTON_APP][0];
                outState.appButtonDown  = !lastState.appButtonState && outState.appButtonState;
                outState.appButtonUp    = lastState.appButtonState && !outState.appButtonState;

                outState.clickButtonState = 0 != DpnpGetDeviceCurrentStatus().button_state[(int)DPNP_DAYDREAM_BUTTONS.DPNP_DAYDREAM_BUTTON_CLICK][0];
                outState.clickButtonDown  = !lastState.clickButtonState && outState.clickButtonState;
                outState.clickButtonUp    = lastState.clickButtonState && !outState.clickButtonState;

                outState.triggerButtonState = false;
                outState.triggerButtonDown  = false;
                outState.triggerButtonUp    = false;

                outState.volumeUpButtonState = 0 != DpnpGetDeviceCurrentStatus().button_state[(int)DPNP_DAYDREAM_BUTTONS.DPNP_DAYDREAM_BUTTON_VOLUMEUP][0];
                outState.volumeUpButtonDown  = !lastState.volumeUpButtonState && outState.volumeUpButtonState;
                outState.volumeUpButtonUp    = lastState.volumeUpButtonState && !outState.volumeUpButtonState;

                outState.volumeDownButtonState = 0 != DpnpGetDeviceCurrentStatus().button_state[(int)DPNP_DAYDREAM_BUTTONS.DPNP_DAYDREAM_BUTTON_VOLUMEDOWN][0];
                outState.volumeDownButtonDown  = !lastState.volumeDownButtonState && outState.volumeDownButtonState;
                outState.volumeDownButtonUp    = lastState.volumeDownButtonState && !outState.volumeDownButtonState;

                outState.recentering = 0 != DpnpGetDeviceCurrentStatus().button_state[(int)DPNP_DAYDREAM_BUTTONS.DPNP_DAYDREAM_BUTTON_HOME][0];
                outState.recentered  = lastState.recentering && !outState.recentering;

                //Debug.Log(" DpnDaydreamControllerState GetData:" + "connectionState = " + outState.connectionState
                //+ "  outState.accX = " + outState.accel.x + "   outState.accY = " + outState.accel.y + "  outState.accZ = " + outState.accel.z
                //+ "  outState.gyroX = " + outState.gyro.x + "   outState.gyroY = " + outState.gyro.y + "  outState.gyroZ = " + outState.gyro.z
                //+ "  outState.oriX = " + outState.orientation.x + "   outState.oriY = " + outState.orientation.y + "  outState.oriZ = " + outState.orientation.z
                //+ "  outState.touchX = " + outState.touchPos.x + "   outState.touchY = " + outState.touchPos.y
                //+ "  outState.btnAPP = " + outState.appButtonState + "   outState.btnHome = " + outState.recentering + "   outState.btnClick = " + outState.clickButtonState
                //+ "  outState.btnvolumeUp = " + outState.volumeUpButtonState + "   outState.btnvolumeDown = " + outState.volumeDownButtonState);

                // If the controller was recentered, we may also need to request that the headset be
                // recentered. We should do that only if VrCore does NOT implement recentering.
                outState.headsetRecenterRequested = outState.recentered;
                if (outState.touchUp)
                {
                    _touchUpPos = lastcontrollerState.touchPos;
                }
                break;
            }
            }
        }