Exemplo n.º 1
0
        /// <summary>
        /// Generates a new HandGrabPointData that mirrors the provided one. Left hand becomes right hand and vice-versa.
        /// The mirror axis is defined by the surface of the snap point, if any, if none a best-guess is provided
        /// but note that it can then moved manually in the editor.
        /// </summary>
        /// <param name="originalPoint">The point to mirror</param>
        /// <param name="originalPoint">The target HandGrabPoint to set as mirrored of the originalPoint</param>
        public static void MirrorHandGrabPoint(HandGrabPoint originalPoint, HandGrabPoint mirrorPoint)
        {
            HandPose handPose = originalPoint.HandPose;

            Handedness oppositeHandedness = handPose.Handedness == Handedness.Left ? Handedness.Right : Handedness.Left;

            HandGrabPointData mirrorData = originalPoint.SaveData();

            mirrorData.handPose.Handedness = oppositeHandedness;

            if (originalPoint.SnapSurface != null)
            {
                mirrorData.gripPose = originalPoint.SnapSurface.MirrorPose(mirrorData.gripPose);
            }
            else
            {
                mirrorData.gripPose = mirrorData.gripPose.MirrorPoseRotation(Vector3.forward, Vector3.up);
                Vector3 translation = Vector3.Project(mirrorData.gripPose.position, Vector3.right);
                mirrorData.gripPose.position = mirrorData.gripPose.position - 2f * translation;
            }

            mirrorPoint.LoadData(mirrorData, originalPoint.RelativeTo);
            if (originalPoint.SnapSurface != null)
            {
                SnapSurfaces.ISnapSurface mirroredSurface = originalPoint.SnapSurface.CreateMirroredSurface(mirrorPoint.gameObject);
                mirrorPoint.InjectOptionalSurface(mirroredSurface);
            }
        }
Exemplo n.º 2
0
        public static void CloneHandGrabPoint(HandGrabPoint originalPoint, HandGrabPoint targetPoint)
        {
            HandGrabPointData mirrorData = originalPoint.SaveData();

            targetPoint.LoadData(mirrorData, originalPoint.RelativeTo);
            if (originalPoint.SnapSurface != null)
            {
                SnapSurfaces.ISnapSurface mirroredSurface = originalPoint.SnapSurface.CreateDuplicatedSurface(targetPoint.gameObject);
                targetPoint.InjectOptionalSurface(mirroredSurface);
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Creates a new HandGrabInteractable at the exact pose of a given hand.
        /// Mostly used with Hand-Tracking at Play-Mode
        /// </summary>
        /// <param name="rawPose">The user controlled hand pose.</param>
        /// <param name="snapPoint">The user controlled hand pose.</param>
        /// <returns>The generated HandGrabPoint.</returns>
        public HandGrabPoint AddHandGrabPoint(HandPose rawPose, Pose snapPoint)
        {
            HandGrabInteractable interactable = HandGrabInteractable.Create(_recordable.transform);
            HandGrabPointData    pointData    = new HandGrabPointData()
            {
                handPose = rawPose,
                scale    = 1f,
                gripPose = snapPoint,
            };

            return(interactable.LoadPoint(pointData));
        }
Exemplo n.º 4
0
        private void AddHandGrabPoint(HandGrabPoint copy = null, float?scale = null)
        {
            HandGrabPoint point = _interactable.CreatePoint();

            if (copy != null)
            {
                HandGrabPointEditor.CloneHandGrabPoint(copy, point);
                if (scale.HasValue)
                {
                    HandGrabPointData scaledData = point.SaveData();
                    scaledData.scale = scale.Value;
                    point.LoadData(scaledData, copy.RelativeTo);
                }
            }
            _interactable.GrabPoints.Add(point);
        }