2013-06-27 13 views
5

Ho scaricato Kinect SDK 1.7, toolkit e ho giocato con i seguenti esempi.Kinect SDK 1.7 | Cambia immagine e dimensione KinectCursor

  • ControlBasics WPF
  • InteractionGallery WPF.

Ho scoperto che Kinect Toolkit utilizza internamente il riquadro di interazione per rilevare la posizione/gesto della mano e di conseguenza lo mappa con i controlli Kinect.

Ho un requisito in cui voglio catturare un evento di grip su un pulsante di tile Kinect. Poiché il KinectTileButton predefinito non fornisce un evento Grip. Ho aggiunto un gestore di eventi grip sul mio pulsante.

KinectRegion.AddHandPointerGripHandler(kinectButton, OnHandPointerCaptured); 

private void OnHandPointerCaptured(object sender, HandPointerEventArgs handPointerEventArgs) 
{ 
    // Add code here 
} 

ho messo un punto di interruzione di debug all'interno del metodo OnHandPointerCaptured ed è stato in grado di ricevere colpi corretti quando ho presa sul KinectTileButton. Ma per qualche motivo non vedo l'immagine di KinectCursor cambiare in un grip come accade sul controllo KinectScrollViewer. Ho provato a configurare la proprietà isGripTarget nella classe KinectButtonBase ma non aiuta.

private void InitializeKinectButtonBase() 
{ 
    KinectRegion.AddHandPointerPressHandler(this, this.OnHandPointerPress); 
    KinectRegion.AddHandPointerGotCaptureHandler(this, this.OnHandPointerCaptured); 
    KinectRegion.AddHandPointerPressReleaseHandler(this, this.OnHandPointerPressRelease); 
    KinectRegion.AddHandPointerLostCaptureHandler(this, this.OnHandPointerLostCapture); 
    KinectRegion.AddHandPointerEnterHandler(this, this.OnHandPointerEnter); 
    KinectRegion.AddHandPointerLeaveHandler(this, this.OnHandPointerLeave); 

    // Use the same OnHandPointerPress handler for the grip event 
    KinectRegion.AddHandPointerGripHandler(this, this.OnHandPointerPress); 

    //Set Kinect button as Grip target 
    // KinectRegion.SetIsPressTarget(this, true); 
    KinectRegion.SetIsGripTarget(this, true);     
} 

Come modificare l'immagine di KinectCursor dall'icona a mano aperta e anche il formato.

risposta

6

Ecco quello che ho trovato-

1) del cursore e dimensione - Entrambi questi campioni usano progetto Microsoft.Kinect.Toolkit.Controls che definisce i controlli personalizzati (KinectTileButton, KinectScrollViwer, KinectRegion etc.) utilizzati nella questi campioni L'immagine e la dimensione del cursore Kinect sono definite come una risorsa in Microsoft.Kinect.Toolkit.Controls -> Temi-> Generic.xaml. Cerca il seguente nel file -

<Style TargetType="{x:Type local:KinectCursor}"> 

È possibile modificare questo secondo le proprie necessità. Non è stato possibile trovare proprietà/hook esposti per controllarlo direttamente dall'interfaccia utente.

2) Evento di grip sul pulsante di affiancamento - Pulsante Kinect Supporta vari eventi che possono essere descritti e applicati sul vostro desiderio. visualizzare questa immagine Hand over button event in Kinect SDK 1.7

3) Cambia cursore a Grip sul pulsante Tile - progetto Microsoft.Kinect.Toolkit.Controls utilizza KinectCursorVisualizer.cs e KinectCursor.cs per rendere il cursore mano virtuale sull'interfaccia utente. Lo stato visivo Mano aperta/Grip è controllato tramite questa proprietà di dipendenza definita in KinectCursor.cs.

public static readonly DependencyProperty IsOpenProperty = DependencyProperty.Register(
     "IsOpen", 
     typeof(bool), 
     typeof(KinectCursor), 
     new UIPropertyMetadata(true, (o, args) => ((KinectCursor)o).EnsureVisualState())); 

Un rapido trovare tutti i riferimenti sulla proprietà IsOpen dice che l'unico luogo in cui si trova questa struttura si trova KinectCursorVisualizer.cs-> OnHandPointersUpdated metodo. Line-229

// Set open state 
cursor.IsOpen = !pointer.IsInGripInteraction; 

e questa proprietà pointer.IsInGripInteraction è fissato a KinectAdapter.cs Linea 678

handPointer.IsInGripInteraction = newIsInGripInteraction; 

Se si guarda il codice appena al di sopra di questa linea troverete che questa proprietà è impostata su true solo se l'elemento di destinazione ha un QueryInteractionStatusHandler definita e nel set args.Handled, args. Proprietà IsInGripInteraction su true.

Poiché KinectScrollViewer ha definito questo gestore, si vede un'immagine dell'impugnatura.

private void InitializeKinectScrollViewer() 
     { 
      KinectRegion.AddHandPointerGotCaptureHandler(this, this.OnHandPointerCaptured); 
      KinectRegion.AddHandPointerLostCaptureHandler(this, this.OnHandPointerLostCapture); 
      KinectRegion.AddHandPointerEnterHandler(this, this.OnHandPointerEnter); 
      KinectRegion.AddHandPointerMoveHandler(this, this.OnHandPointerMove); 
      KinectRegion.AddHandPointerPressHandler(this, this.OnHandPointerPress); 
      KinectRegion.AddHandPointerGripHandler(this, this.OnHandPointerGrip); 
      KinectRegion.AddHandPointerGripReleaseHandler(this, this.OnHandPointerGripRelease); 
//This is the QueryInteractionStatusHandler 
      KinectRegion.AddQueryInteractionStatusHandler(this, this.OnQueryInteractionStatus); 
      KinectRegion.SetIsGripTarget(this, true); 
      this.scrollMoveTimer.Tick += this.OnScrollMoveTimerTick; 
      this.scrollViewerInertiaScroller.SlowEnoughForSelectionChanged += this.OnSlowEnoughForSelectionChanged; 

      // Create KinectRegion binding 
      this.kinectRegionBinder = new KinectRegionBinder(this); 
      this.kinectRegionBinder.OnKinectRegionChanged += this.OnKinectRegionChanged;  
     } 

ma KinectTileButton (estende KinectButtonBase) non ha questo gestore definito

private void InitializeKinectButtonBase() 
     { 
      KinectRegion.AddHandPointerPressHandler(this, this.OnHandPointerPress); 
      KinectRegion.AddHandPointerGotCaptureHandler(this, this.OnHandPointerCaptured); 
      KinectRegion.AddHandPointerPressReleaseHandler(this, this.OnHandPointerPressRelease); 
      KinectRegion.AddHandPointerLostCaptureHandler(this, this.OnHandPointerLostCapture); 
      KinectRegion.AddHandPointerEnterHandler(this, this.OnHandPointerEnter); 
      KinectRegion.AddHandPointerLeaveHandler(this, this.OnHandPointerLeave); 

      KinectRegion.SetIsPressTarget(this, true); 

     } 

Come definire questo gestore? - Semplice da aggiungere alla tua interfaccia utente. Può essere aggiunto al costruttore

//Add the handler 
KinectRegion.AddQueryInteractionStatusHandler(kinectButton, OnQuery); 

Definire il gestore

//Variable to track GripInterationStatus 
bool isGripinInteraction = false; 

     private void OnQuery(object sender, QueryInteractionStatusEventArgs handPointerEventArgs) 
     { 

      //If a grip detected change the cursor image to grip 
      if (handPointerEventArgs.HandPointer.HandEventType == HandEventType.Grip) 
      { 
       isGripinInteraction = true; 
       handPointerEventArgs.IsInGripInteraction = true; 
      } 

      //If Grip Release detected change the cursor image to open 
      else if (handPointerEventArgs.HandPointer.HandEventType == HandEventType.GripRelease) 
      { 
       isGripinInteraction = false; 
       handPointerEventArgs.IsInGripInteraction = false; 
      } 

      //If no change in state do not change the cursor 
      else if (handPointerEventArgs.HandPointer.HandEventType == HandEventType.None) 
      { 
       handPointerEventArgs.IsInGripInteraction = isGripinInteraction; 
      } 

      handPointerEventArgs.Handled = true; 
     } 

Potrebbe essere necessario modificare questo secondo il vostro requisito. Happy Kinecting :)

+0

Posso solo dire grazie davvero così tanto per questo. Mi hai salvato ore di tempo e forse la mia sanità mentale. Ho avuto bisogno di KinectRegion.SetIsGripTarget(), ma non ho potuto elaborare il passaggio successivo. Grazie ancora, funziona perfettamente; Vorrei poter sopravvivere 1000 volte ... –

+0

Contento che ha funzionato per te. Grazie per le belle parole :) – Gaurav