Exemple #1
0
    private void Initialize()
    {
        var skeleton = new OVRPlugin.Skeleton();

        if (OVRPlugin.GetSkeleton((OVRPlugin.SkeletonType)_skeletonType, out skeleton))
        {
            InitializeBones(skeleton);
            InitializeBindPose(skeleton);
            InitializeCapsules(skeleton);

            IsInitialized = true;
        }
    }
        private IEnumerator InitializeSkeleton()
        {
            bool success = false;

            while (!success)
            {
                var skeleton = new OVRPlugin.Skeleton();
                if (OVRPlugin.GetSkeleton(HandSkeleton.GetSkeletonTypeFromHandType(_hand.HandType), out skeleton))
                {
                    success = InitializePhysics(ref skeleton);
                }
                yield return(null);
            }
            IsInitialized = true;
        }
    private void Initialize()
    {
        var skeleton = new OVRPlugin.Skeleton();

        FreezeIndex  = false;
        FreezeMiddle = false;
        FreezePinky  = false;
        FreezeRing   = false;
        FreezeThumb  = false;
        if (OVRPlugin.GetSkeleton((OVRPlugin.SkeletonType)_skeletonType, out skeleton))
        {
            InitializeBones(skeleton);
            InitializeBindPose(skeleton);
            InitializeCapsules(skeleton);

            IsInitialized = true;
        }
    }
Exemple #4
0
    void Start()
    {
        if (uiText != null)
        {
            uiText.supportRichText = false;
        }

        data = new StringBuilder(2048);

        monitors = new List <BoolMonitor>()
        {
            new BoolMonitor("One", () => OVRInput.Get(OVRInput.Button.One)),
        };

        result_skel_LH = OVRPlugin.GetSkeleton(OVRPlugin.SkeletonType.HandLeft, out skel_LH);
        result_skel_RH = OVRPlugin.GetSkeleton(OVRPlugin.SkeletonType.HandRight, out skel_RH);

        result_mesh_LH = OVRPlugin.GetMesh(OVRPlugin.MeshType.HandLeft, out mesh_LH);
        result_mesh_RH = OVRPlugin.GetMesh(OVRPlugin.MeshType.HandRight, out mesh_RH);
    }
Exemple #5
0
        private IEnumerator InitializeSkeletonAndSend(OVRPlugin.Hand hand)
        {
            var skeletonType = GetSkeletonTypeFromHandType(hand);

            if (OVRPlugin.GetSkeleton(skeletonType, out var skeleton))
            {
                try
                {
                    var skeletonDataJson = XmlSerialize.Serialize(HandRelatedDataContainer.AsSkeletonData(
                                                                      new SkeletonData(skeleton, skeletonType)
                                                                      ));
                    StartCoroutine(SendDataTCP(skeletonDataJson)); //skeleton data is too big for single UDP packet
                    yield break;
                }
                catch (Exception e)
                {
                    Debug.Log($"Unable to send skeleton ({hand.ToString()})data: {e.ToString()}");
                }
            }
            yield return(new WaitForSeconds(WaitNSecondsBetweenHandDataInitializationIfNotReady));
        }
        private IEnumerator InitializeSkeleton()
        {
            bool success = false;

            while (!success)
            {
                var skeleton = new OVRPlugin.Skeleton();
                if (OVRPlugin.GetSkeleton(GetSkeletonTypeFromHandType(_hand.HandType), out skeleton))
                {
                    success = InitializeSkeleton(ref skeleton);
                }
                yield return(null);
            }
            if (GetComponent <HandMesh>() != null)
            {
                while (!AttacheBonesToMesh())
                {
                    yield return(null);
                }
            }
            IsInitialized = true;
        }
Exemple #7
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);
        }
Exemple #8
0
    private void Initialize()
    {
        var skeleton = new OVRPlugin.Skeleton();

        if (OVRPlugin.GetSkeleton((OVRPlugin.SkeletonType)_skeletonType, out skeleton))
        {
            if (!_bonesGO)
            {
                _bonesGO = new GameObject("Bones");
                _bonesGO.transform.SetParent(transform, false);
                _bonesGO.transform.localPosition = Vector3.zero;
                _bonesGO.transform.localRotation = Quaternion.identity;
            }

            if (!_bindPosesGO)
            {
                _bindPosesGO = new GameObject("BindPoses");
                _bindPosesGO.transform.SetParent(transform, false);
                _bindPosesGO.transform.localPosition = Vector3.zero;
                _bindPosesGO.transform.localRotation = Quaternion.identity;
            }

            if (_enablePhysicsCapsules)
            {
                if (!_capsulesGO)
                {
                    _capsulesGO = new GameObject("Capsules");
                    _capsulesGO.transform.SetParent(transform, false);
                    _capsulesGO.transform.localPosition = Vector3.zero;
                    _capsulesGO.transform.localRotation = Quaternion.identity;
                }
            }

            _bones = new List <OVRBone>(new OVRBone[skeleton.NumBones]);
            Bones  = _bones.AsReadOnly();

            _bindPoses = new List <OVRBone>(new OVRBone[skeleton.NumBones]);
            BindPoses  = _bindPoses.AsReadOnly();

            // pre-populate bones list before attempting to apply bone hierarchy
            for (int i = 0; i < skeleton.NumBones; ++i)
            {
                BoneId     id        = (OVRSkeleton.BoneId)skeleton.Bones[i].Id;
                short      parentIdx = skeleton.Bones[i].ParentBoneIndex;
                Vector3    pos       = skeleton.Bones[i].Pose.Position.FromFlippedZVector3f();
                Quaternion rot       = skeleton.Bones[i].Pose.Orientation.FromFlippedZQuatf();

                var boneGO = new GameObject(id.ToString());
                boneGO.transform.localPosition = pos;
                boneGO.transform.localRotation = rot;
                _bones[i] = new OVRBone(id, parentIdx, boneGO.transform);

                var bindPoseGO = new GameObject(id.ToString());
                bindPoseGO.transform.localPosition = pos;
                bindPoseGO.transform.localRotation = rot;
                _bindPoses[i] = new OVRBone(id, parentIdx, bindPoseGO.transform);
            }

            for (int i = 0; i < skeleton.NumBones; ++i)
            {
                if (((OVRPlugin.BoneId)skeleton.Bones[i].ParentBoneIndex) == OVRPlugin.BoneId.Invalid)
                {
                    _bones[i].Transform.SetParent(_bonesGO.transform, false);
                    _bindPoses[i].Transform.SetParent(_bindPosesGO.transform, false);
                }
                else
                {
                    _bones[i].Transform.SetParent(_bones[_bones[i].ParentBoneIndex].Transform, false);
                    _bindPoses[i].Transform.SetParent(_bindPoses[_bones[i].ParentBoneIndex].Transform, false);
                }
            }

            if (_enablePhysicsCapsules)
            {
                _capsules = new List <OVRBoneCapsule>(new OVRBoneCapsule[skeleton.NumBoneCapsules]);
                Capsules  = _capsules.AsReadOnly();

                for (int i = 0; i < skeleton.NumBoneCapsules; ++i)
                {
                    var       capsule = skeleton.BoneCapsules[i];
                    Transform bone    = Bones[capsule.BoneIndex].Transform;

                    var capsuleRigidBodyGO = new GameObject((_bones[capsule.BoneIndex].Id).ToString() + "_CapsuleRigidBody");
                    capsuleRigidBodyGO.transform.SetParent(_capsulesGO.transform, false);
                    capsuleRigidBodyGO.transform.localPosition = bone.position;
                    capsuleRigidBodyGO.transform.localRotation = bone.rotation;

                    var capsuleRigidBody = capsuleRigidBodyGO.AddComponent <Rigidbody>();
                    capsuleRigidBody.mass        = 1.0f;
                    capsuleRigidBody.isKinematic = true;
                    capsuleRigidBody.useGravity  = false;
#if UNITY_2018_3_OR_NEWER
                    capsuleRigidBody.collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative;
#else
                    capsuleRigidBody.collisionDetectionMode = CollisionDetectionMode.Continuous;
#endif

                    var capsuleColliderGO = new GameObject((_bones[capsule.BoneIndex].Id).ToString() + "_CapsuleCollider");
                    capsuleColliderGO.transform.SetParent(capsuleRigidBodyGO.transform, false);
                    var capsuleCollider = capsuleColliderGO.AddComponent <CapsuleCollider>();
                    var p0    = capsule.Points[0].FromFlippedZVector3f();
                    var p1    = capsule.Points[1].FromFlippedZVector3f();
                    var delta = p1 - p0;
                    var mag   = delta.magnitude;
                    var rot   = Quaternion.FromToRotation(capsuleRigidBodyGO.transform.localRotation * Vector3.right, delta);
                    capsuleCollider.radius    = capsule.Radius;
                    capsuleCollider.height    = mag + capsule.Radius * 2.0f;
                    capsuleCollider.isTrigger = false;
                    capsuleCollider.direction = 0;
                    capsuleColliderGO.transform.localPosition = p0;
                    capsuleColliderGO.transform.localRotation = rot;
                    capsuleCollider.center = Vector3.right * mag * 0.5f;

                    _capsules[i] = new OVRBoneCapsule(capsule.BoneIndex, capsuleRigidBody, capsuleCollider);
                }
            }

            _isInitialized = true;
        }
    }