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); }
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); }