private void Track()
    {
        if (_dataProvider != null)
        {
            var data = _dataProvider.GetSkeletonPoseData();

            trackedRoot.position = handAnchor.position;
            trackedRoot.rotation = handAnchor.rotation;

            for (var i = 0; i < bones.Length; ++i)
            {
                var currentBone = bones[i];

                if (data.IsDataValid && data.IsDataHighConfidence)
                {
                    if (currentBone.tracked != null)
                    {
                        currentBone.tracked.localRotation = data.BoneRotations[i].FromFlippedXQuatf();
                        if (i == (int)OVRSkeleton.BoneId.Hand_WristRoot)
                        {
                            currentBone.tracked.localRotation *= wristFixupRotation;
                        }

                        if (currentBone.physics != null)
                        {
                            if (i != (int)OVRSkeleton.BoneId.Hand_WristRoot)
                            {
                                var joint = currentBone.joint;
                                joint.SetTargetRotation(currentBone.tracked.localRotation, currentBone.cachedRotation);
                                wristPosOffset = Vector3.Distance(currentBone.physics.AffectedBody.position, currentBone.tracked.position);
                                wristRotOffset = Quaternion.Angle(currentBone.physics.AffectedBody.rotation, currentBone.tracked.rotation);
                            }

                            currentBone.physics.position = currentBone.tracked.position;
                            currentBone.physics.rotation = currentBone.tracked.rotation; //Need to keep this for the wrists

                            Vector3 boneVelocity = (currentBone.tracked.position - currentBone.previousPosition) / Time.deltaTime;
                            currentBone.physics.velocity = boneVelocity;
                        }

                        currentBone.previousPosition = currentBone.tracked.position;

                        currentBone.previousTrackedRotation = currentBone.tracked.localRotation;
                        currentBone.hasBeenTracked          = true;
                    }
                }

                if (currentBone.mesh != null && currentBone.physics != null)
                {
                    currentBone.mesh.position = currentBone.physics.transform.position;
                    currentBone.mesh.rotation = currentBone.physics.transform.rotation;
                }
            }
        }
    }
Exemple #2
0
    void Update()
    {
        if (_dataProvider != null)
        {
            var data = _dataProvider.GetSkeletonPoseData();

            trackedRoot.position = handAnchor.position;
            trackedRoot.rotation = handAnchor.rotation;

            if (data.IsDataValid && data.IsDataHighConfidence)
            {
                for (var i = 0; i < trackedBones.Length; ++i)
                {
                    var trackedBone = trackedBones[i];
                    var physicsBone = physicsBones[i];
                    var meshBone    = meshBones[i];

                    if (trackedBone != null)
                    {
                        trackedBone.localRotation = data.BoneRotations[i].FromFlippedXQuatf();
                        if (i == (int)OVRSkeleton.BoneId.Hand_WristRoot)
                        {
                            trackedBone.localRotation *= wristFixupRotation;
                        }

                        if (physicsBone != null)
                        {
                            if (i != (int)OVRSkeleton.BoneId.Hand_WristRoot)
                            {
                                var joint = physicsBone.joint;
                                joint.SetTargetRotation(trackedBone.localRotation, cachedRotations[i]);
                            }

                            physicsBone.position = trackedBone.position;
                            physicsBone.rotation = trackedBone.rotation; //Need to keep this for the wrists

                            Vector3 boneVelocity = (trackedBone.position - previousPositions[i]) / Time.deltaTime;
                            physicsBone.velocity = boneVelocity;

                            if (meshBone != null)
                            {
                                meshBone.position = physicsBone.transform.position;
                                meshBone.rotation = physicsBone.transform.rotation;
                            }
                        }
                    }

                    previousPositions[i] = trackedBone.position;
                }
            }
        }
    }