Ejemplo n.º 1
0
    OVRSkeleton.SkeletonPoseData OVRSkeleton.IOVRSkeletonDataProvider.GetSkeletonPoseData()
    {
        var data = new OVRSkeleton.SkeletonPoseData();

        data.IsDataValid = IsDataValid;
        if (IsDataValid)
        {
            data.RootPose             = _handState.RootPose;
            data.RootScale            = _handState.HandScale;
            data.BoneRotations        = _handState.BoneRotations;
            data.IsDataHighConfidence = IsTracked && HandConfidence == TrackingConfidence.High;
        }

        return(data);
    }
Ejemplo n.º 2
0
        private async void Start()
        {
            _skinMeshRendererL = _leftHandVisual.GetComponent <SkinnedMeshRenderer>();
            _skinMeshRendererR = _rightHandVisual.GetComponent <SkinnedMeshRenderer>();

            //部屋に入るまで待つ
            await UniTask.WaitUntil(() => PhotonNetwork.InRoom);

            //タグで検索
            var ovrSkeletonL = GameObject.FindGameObjectWithTag("HandL").GetComponent <OVRSkeleton>();
            var ovrSkeletonR = GameObject.FindGameObjectWithTag("HandR").GetComponent <OVRSkeleton>();

            //ボーン情報のデータプロバイダー
            var dataProviderL = ovrSkeletonL.GetComponent <OVRSkeleton.IOVRSkeletonDataProvider>();
            var dataProviderR = ovrSkeletonR.GetComponent <OVRSkeleton.IOVRSkeletonDataProvider>();

            //手の認識を待つ
            await UniTask.WaitUntil(() => OVRInput.IsControllerConnected(OVRInput.Controller.Hands));

            //あらかじめ決まっているボーンの情報を所持できるクラス
            var skeleton = new OVRPlugin.Skeleton();

            //あらかじめ決まっているボーンの情報を取得し、実際にボーンを生成
            OVRPlugin.GetSkeleton((OVRPlugin.SkeletonType)dataProviderL.GetSkeletonType(), out skeleton);
            InitializeBones(skeleton, _leftHandVisual, out _isInitializedBoneL);

            OVRPlugin.GetSkeleton((OVRPlugin.SkeletonType)dataProviderR.GetSkeletonType(), out skeleton);
            InitializeBones(skeleton, _rightHandVisual, out _isInitializedBoneR);

            //正しい順序で生成したボーンのリストを作成
            ReadyHand(_leftHandVisual, _bonesL, out _isInitializedHandL);
            ReadyHand(_rightHandVisual, _bonesR, out _isInitializedHandR);

            Quaternion wristFixupRotation = new Quaternion(0.0f, 1.0f, 0.0f, 0.0f);

            _skinMeshRendererL.enabled = true;
            _skinMeshRendererR.enabled = true;

            this.UpdateAsObservable()
            .Subscribe(_ =>
            {
                if (_isInitializedBoneL == false)
                {
                    OVRPlugin.GetSkeleton((OVRPlugin.SkeletonType)dataProviderL.GetSkeletonType(), out skeleton);
                    InitializeBones(skeleton, _leftHandVisual, out _isInitializedBoneL);
                }

                if (_isInitializedBoneR == false)
                {
                    OVRPlugin.GetSkeleton((OVRPlugin.SkeletonType)dataProviderR.GetSkeletonType(), out skeleton);
                    InitializeBones(skeleton, _leftHandVisual, out _isInitializedBoneR);
                }

                if (_isInitializedHandL == false)
                {
                    ReadyHand(_leftHandVisual, _bonesL, out _isInitializedHandL);
                }

                if (_isInitializedHandR == false)
                {
                    ReadyHand(_rightHandVisual, _bonesR, out _isInitializedHandR);
                }

                if (photonView.IsMine)
                {
                    //頭
                    var cameraTransform = Camera.main.transform;

                    _headVisual.transform.localPosition = cameraTransform.localPosition;
                    _headVisual.transform.localRotation = cameraTransform.localRotation;

                    //ボーンの情報取得
                    _dataL = dataProviderL.GetSkeletonPoseData();
                    _dataR = dataProviderR.GetSkeletonPoseData();

                    //認識してないときは自分の手のみ非表示にする
                    var shouldRendererL        = _dataL.IsDataValid && _dataL.IsDataHighConfidence;
                    var shouldRendererR        = _dataR.IsDataValid && _dataR.IsDataHighConfidence;
                    _skinMeshRendererL.enabled = shouldRendererL;
                    _skinMeshRendererR.enabled = shouldRendererR;

                    //左手
                    if (_dataL.IsDataValid && _dataL.IsDataHighConfidence)
                    {
                        //ルートのローカルポジションを適用
                        _leftHandVisual.transform.localPosition = _dataL.RootPose.Position.FromFlippedZVector3f();
                        _leftHandVisual.transform.localRotation = _dataL.RootPose.Orientation.FromFlippedZQuatf();
                        _leftHandVisual.transform.localScale    = new Vector3(_dataL.RootScale, _dataL.RootScale, _dataL.RootScale);

                        //ボーンのリストに受け取った値を反映
                        for (var i = 0; i < _bonesL.Count; ++i)
                        {
                            _bonesL[i].transform.localRotation = _dataL.BoneRotations[i].FromFlippedXQuatf();

                            if (_bonesL[i].name == OVRSkeleton.BoneId.Hand_WristRoot.ToString())
                            {
                                _bonesL[i].transform.localRotation *= wristFixupRotation;
                            }
                        }
                    }

                    //右手
                    if (_dataR.IsDataValid && _dataR.IsDataHighConfidence)
                    {
                        //ルートのローカルポジションを適用
                        _rightHandVisual.transform.localPosition = _dataR.RootPose.Position.FromFlippedZVector3f();
                        _rightHandVisual.transform.localRotation = _dataR.RootPose.Orientation.FromFlippedZQuatf();
                        _rightHandVisual.transform.localScale    = new Vector3(_dataR.RootScale, _dataR.RootScale, _dataR.RootScale);


                        //ボーンのリストに受け取った値を反映
                        for (var i = 0; i < _bonesR.Count; ++i)
                        {
                            _bonesR[i].transform.localRotation = _dataR.BoneRotations[i].FromFlippedXQuatf();

                            if (_bonesR[i].name == OVRSkeleton.BoneId.Hand_WristRoot.ToString())
                            {
                                _bonesR[i].transform.localRotation *= wristFixupRotation;
                            }
                        }
                    }
                }
            })
            .AddTo(this);
        }