private async void WindowLoaded(object sender, RoutedEventArgs windowLoadedArgs) { // In XAML, we have specified a 3D scene containing a cube. We would like to use our hand to control the camera in this scene. // The following gesture subscribes to the hand skeleton stream whenever our hand forms the pinch pose. The information in // the skeleton stream will be used to move the camera. // Data flow outline: // [GestureServiceEndpoint]-----Skeleton----->[PalmSmoother]-----SmoothedPositionDelta----->[SphericalCamera] // We would like to translate hand motion to camera motion. Because the palm position // values in the skeleton stream contain some jitter, we smooth them (using a moving-average window). _palmSmoother = new PalmSmoother(); // Define the gesture so that when the hand forms a pinch pose register to the skeleton stream and pass it to the palm smoother. var pinchClose = new PinchPose("PinchClosePose", pinchSpread: false); pinchClose.Triggered += (s, args) => _gesturesService.RegisterToSkeleton((s1, args1) => _palmSmoother.Smooth(args1.DefaultHandSkeleton)); _cameraPinch = new Gesture("CameraPinch", new PinchPose("PinchOpenPose", pinchSpread: true), pinchClose, new PinchPose("PinchReleasePose", pinchSpread: true)); _cameraPinch.IdleTriggered += (s, args) => _gesturesService.UnregisterFromSkeleton(); // The smoothed palm position is used to rotate the camera. _sphericalCamera = new SphericalCamera(Camera, Dispatcher); _palmSmoother.SmoothedPositionChanged += (s, args) => _sphericalCamera.UpdateCamera(args.SmoothedPositionDelta); // Connect to the Gestures Service and register the gesture we've defined _gesturesService = GesturesServiceEndpointFactory.Create(); _gesturesService.StatusChanged += (s, arg) => Dispatcher.Invoke(() => GesturesServiceStatus.Text = $"[{arg.Status}]"); await _gesturesService.ConnectAsync(); await _gesturesService.RegisterGesture(_cameraPinch); }