Beispiel #1
0
        private void DrawBone(string fingerName, Vector3 from, ManagedKeypoint to, Color colorA, Color colorB)
        {
            fingerName = Name(fingerName);
            Lines.DrawLine(fingerName, colorA, colorB, .0005f, from, to.positionFiltered);

            if (_managedHand.Visible && to.Visible)
            {
                Lines.SetVisibility(fingerName, true);
            }
            else
            {
                Lines.SetVisibility(fingerName, false);
            }
        }
Beispiel #2
0
        private void DrawDigit(string fingerName, ManagedFinger finger, Color colorA, Color colorB)
        {
            fingerName = Name(fingerName);
            Lines.DrawLine(fingerName, colorA, colorB, .0005f, finger.PointLocationsFiltered);

            if (_managedHand.Visible && finger.IsVisible)
            {
                Lines.SetVisibility(fingerName, true);
            }
            else
            {
                Lines.SetVisibility(fingerName, false);
            }
        }
Beispiel #3
0
 private void HandleHandVisibility(ManagedHand managedHand, bool visible)
 {
     HandleFingerVisibilityChanged(managedHand.Skeleton.Thumb, visible);
     HandleFingerVisibilityChanged(managedHand.Skeleton.Index, visible);
     HandleFingerVisibilityChanged(managedHand.Skeleton.Middle, visible);
     HandleFingerVisibilityChanged(managedHand.Skeleton.Ring, visible);
     HandleFingerVisibilityChanged(managedHand.Skeleton.Pinky, visible);
     Lines.SetVisibility(Name("thumbConnection"), visible);
     Lines.SetVisibility(Name("indexConnection"), visible);
     Lines.SetVisibility(Name("middleConnection"), visible);
     Lines.SetVisibility(Name("ringConnection"), visible);
     Lines.SetVisibility(Name("pinkyConnection"), visible);
     gameObject.SetActive(visible);
     Lines.SetVisibility(Name("wrist"), visible);
 }
Beispiel #4
0
 //Event Handlers:
 private void HandleFingerVisibilityChanged(ManagedFinger finger, bool visible)
 {
     Lines.SetVisibility(Name(finger), visible);
 }
Beispiel #5
0
        public void GrabEnd(InteractionPoint interactionPoint)
        {
            //avoid issues with an actual physical release if StopGrab was used prior:
            if (activeInteractionPoints.Count == 0)
            {
                return;
            }

            //sound:
            if (releasedSound != null)
            {
                _audioSource.PlayOneShot(releasedSound, 1);
            }

            //colorize:
            foreach (var item in GetComponentsInChildren <Renderer>())
            {
                if (item.material.HasProperty("_Color"))
                {
                    item.material.SetColor("_Color", idleColor);
                }
            }

            Grabbed = false;

            //clear up bimanual manipulation:
            if (activeInteractionPoints.Count == 2)
            {
                activeInteractionPoints.Clear();
                _initialInteractionPoses.Clear();
            }

            //remove:
            _initialInteractionPoses.Remove(interactionPoint);
            activeInteractionPoints.Remove(interactionPoint);

            if (Dragging && activeInteractionPoints.Count == 0)
            {
                if (_rigidBody != null)
                {
                    if (throwable && activeInteractionPoints.Count == 0)
                    {
                        //gavity?
                        if (enableGravityOnRelease)
                        {
                            _rigidBody.useGravity = true;
                        }

                        //calculate an average velocity:
                        Vector3 velocity = Vector3.zero;
                        int     start    = _averageVelocity.Count - _averageVelocityCount;
                        start = Mathf.Clamp(start, _averageVelocityEndTrim, start);
                        int count = 0;
                        for (int i = start; i < _averageVelocity.Count; i++)
                        {
                            velocity += _averageVelocity[i];
                            count++;
                        }
                        velocity           /= count;
                        _rigidBody.velocity = velocity;

                        //calculate an average angular velocity:
                        velocity = Vector3.zero;
                        start    = _averageAngularVelocity.Count - _averageVelocityCount;
                        start    = Mathf.Clamp(start, _averageVelocityEndTrim, start);
                        count    = 0;
                        for (int i = start; i < _averageAngularVelocity.Count; i++)
                        {
                            velocity += _averageAngularVelocity[i];
                            count++;
                        }
                        velocity /= count;
                        _rigidBody.angularVelocity = velocity;

                        //clear:
                        _averageVelocity.Clear();
                        _averageAngularVelocity.Clear();
                    }
                    else
                    {
                        _rigidBody.velocity        = Vector3.zero;
                        _rigidBody.angularVelocity = Vector3.zero;
                    }

                    _rigidBody.isKinematic = false;
                }

                Dragging = false;
                OnDragEnd?.Invoke(interactionPoint);
                Lines.SetVisibility(_handConnectionLine, false);
            }

            OnGrabEnd?.Invoke(interactionPoint);
        }
Beispiel #6
0
        public void GrabUpdate(InteractionPoint interactionPoint)
        {
            //dragging started?
            if (!Dragging)
            {
                foreach (var item in _initialInteractionPoses)
                {
                    if (Vector3.Distance(item.Key.position, item.Value.position) > _dragThreshold)
                    {
                        //halt physics:
                        if (_rigidBody != null)
                        {
                            _rigidBody.velocity        = Vector3.zero;
                            _rigidBody.angularVelocity = Vector3.zero;
                            _rigidBody.isKinematic     = true;
                        }

                        //find offset:
                        Matrix4x4  matrix         = Matrix4x4.TRS(item.Key.position, item.Key.rotation, Vector3.one);
                        Vector3    positionOffset = matrix.inverse.MultiplyPoint3x4(transform.position);
                        Quaternion rotationOffset = Quaternion.Inverse(item.Key.rotation) * transform.rotation;
                        _offset = new Pose(positionOffset, rotationOffset);

                        //resets:
                        _position = Vector3.zero;
                        _rotation = Quaternion.identity;

                        //status:
                        Dragging = true;
                        OnDragBegin?.Invoke(item.Key);
                        break;
                    }
                }
            }

            //dragging?
            if (Dragging)
            {
                //find center of interaction points involved with this drag:
                Bounds dragBounds = new Bounds(activeInteractionPoints[0].position, Vector3.zero);
                for (int i = 1; i < activeInteractionPoints.Count; i++)
                {
                    dragBounds.Encapsulate(activeInteractionPoints[i].position);
                }

                //discover drag distance and percentage;
                float biManualDistance = dragBounds.size.magnitude;

                //holders:
                Vector3    dragLocation    = Vector3.zero;
                Quaternion dragOrientation = Quaternion.identity;
                Vector3    forward         = Vector3.zero;
                float      scaleDelta      = 0;

                //rotation:
                if (activeInteractionPoints.Count == 2)
                {
                    //get rotated amount:
                    forward = activeInteractionPoints[0].position - activeInteractionPoints[1].position;
                    Vector3 forwardNormalized = forward.normalized;
                    Vector3 previousForward   = _bimanualBaseRotation * Vector3.forward;
                    Vector3 up    = Vector3.Cross(forwardNormalized, previousForward).normalized;
                    float   angle = Vector3.SignedAngle(previousForward, forwardNormalized, up);

                    //update rotation:
                    Quaternion rotationDelta = Quaternion.AngleAxis(angle, up);
                    _bimanualBaseRotation = rotationDelta * _bimanualBaseRotation;
                    dragOrientation       = _bimanualBaseRotation * _offset.rotation;
                }
                else
                {
                    dragOrientation = activeInteractionPoints[0].rotation * _offset.rotation;
                }

                //position:
                if (activeInteractionPoints.Count == 2)
                {
                    Matrix4x4 matrix = Matrix4x4.TRS(dragBounds.center, _bimanualBaseRotation, Vector3.one);
                    dragLocation = matrix.MultiplyPoint3x4(_offset.position);
                }
                else
                {
                    Matrix4x4 matrix = Matrix4x4.TRS(activeInteractionPoints[0].position, activeInteractionPoints[0].rotation, Vector3.one);
                    dragLocation = matrix.MultiplyPoint3x4(_offset.position);
                }

                //scale:
                if (activeInteractionPoints.Count == 2)
                {
                    scaleDelta = biManualDistance - _scaleInitialDistance;
                }

                //set smoothing origins:
                if (_position == Vector3.zero || _rotation == Quaternion.identity)
                {
                    _position = dragLocation;
                    _rotation = dragOrientation;
                }

                //application:
                if (draggable)
                {
                    _position = Vector3.SmoothDamp(_position, dragLocation, ref _positionVelocity, positionSmoothTime);
                    if (_rigidBody != null)
                    {
                        _rigidBody.MovePosition(_position);
                        _averageVelocity.Add(_rigidBody.velocity);
                        _averageAngularVelocity.Add(_rigidBody.angularVelocity);
                    }
                    else
                    {
                        transform.position = _position;
                    }
                }

                if (rotatable)
                {
                    _rotation = MotionUtilities.SmoothDamp(_rotation, dragOrientation, ref _rotationVelocity, rotationSmoothTime);
                    if (_rigidBody != null)
                    {
                        _rigidBody.MoveRotation(_rotation);
                    }
                    else
                    {
                        transform.rotation = _rotation;
                    }
                }

                if (scalable && activeInteractionPoints.Count == 2)
                {
                    Vector3 proposedScale = _scaleBase + (Vector3.one * scaleDelta);

                    //constrain scale and do not not assume uniform initial scale:
                    if (Mathf.Max(proposedScale.x, proposedScale.y, proposedScale.z) <= maxScale &&
                        Mathf.Min(proposedScale.x, proposedScale.y, proposedScale.z) >= minScale)
                    {
                        transform.localScale = _scaleBase + (Vector3.one * scaleDelta);
                    }
                }

                //visuals:
                if (activeInteractionPoints.Count == 2)
                {
                    Lines.SetVisibility(_handConnectionLine, true);
                    Lines.DrawLine(_handConnectionLine, Color.cyan, Color.cyan, .0005f, activeInteractionPoints[0].position, activeInteractionPoints[1].position);
                }

                //status:
                OnDragUpdate?.Invoke(activeInteractionPoints.ToArray(), _position, _rotation, scaleDelta);
            }
        }
 private void HandleDragBegin(InteractionPoint interactionPoint)
 {
     Lines.SetVisibility(_lineID, true);
 }
 private void HandleDragEnd(InteractionPoint interactionPoint)
 {
     Lines.SetVisibility(_lineID, false);
     OnReleased?.Invoke();
 }
 private void OnDisable()
 {
     Lines.SetVisibility($"Forward{GetInstanceID()}", false);
     Lines.SetVisibility($"Right_{GetInstanceID()}", false);
     Lines.SetVisibility($"Up_{GetInstanceID()}", false);
 }