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