28 using System.Linq; |
28 using System.Linq; |
29 using System.Windows.Documents; |
29 using System.Windows.Documents; |
30 using Microsoft.Kinect; |
30 using Microsoft.Kinect; |
31 using Trakers.Communication; |
31 using Trakers.Communication; |
32 using Trakers.MainModule.Events; |
32 using Trakers.MainModule.Events; |
33 using Trakers.MainModule.Gestures; |
33 using Trakers.Tracking.Search; |
34 using Trakers.MainModule.Search; |
|
35 using Trakers.Debug; |
34 using Trakers.Debug; |
36 using System.Windows; |
35 using System.Windows; |
|
36 using Trakers.Tracking.Gestures; |
|
37 using Trakers.Tracking.Postures; |
37 |
38 |
38 namespace Trakers.MainModule |
39 namespace Trakers.MainModule |
39 { |
40 { |
40 //Il s'agit des fonctions permettant d'appeler les fonctions des événements Main droite/gauche entre/quitte le champ. |
41 //Il s'agit des fonctions permettant d'appeler les fonctions des événements Main droite/gauche entre/quitte le champ. |
41 public delegate void LeftHandTrackedHandler(object o, LeftHandTrackedEventArgs e); |
42 public delegate void LeftHandTrackedHandler(object o, LeftHandTrackedEventArgs e); |
42 public delegate void RightHandTrackedHandler(object o, RightHandTrackedEventArgs e); |
43 public delegate void RightHandTrackedHandler(object o, RightHandTrackedEventArgs e); |
43 public delegate void LeftHandQuitHandler(object o, LeftHandQuitEventArgs e); |
44 public delegate void LeftHandQuitHandler(object o, LeftHandQuitEventArgs e); |
44 public delegate void RightHandQuitHandler(object o, RightHandQuitEventArgs e); |
45 public delegate void RightHandQuitHandler(object o, RightHandQuitEventArgs e); |
|
46 |
|
47 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Bend. |
|
48 public delegate void BendHandler(object o, BendEventArgs e); |
|
49 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Cross. |
|
50 public delegate void CrossHandler(object o, CrossEventArgs e); |
|
51 //Il s'agit de la fonction permettant d'appeler les fonctions des événements KneeUp. |
|
52 public delegate void KneeUpHandler(object o, KneeUpEventArgs e); |
|
53 |
45 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Swipe left/right/up/down. |
54 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Swipe left/right/up/down. |
46 public delegate void SwipeHandler(object o, SwipeEventArgs e); |
55 public delegate void SwipeHandler(object o, SwipeEventArgs e); |
47 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Push/Pull. |
56 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Push/Pull. |
48 public delegate void PushHandler(object o, PushEventArgs e); |
57 public delegate void PushHandler(object o, PushEventArgs e); |
49 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Jump. |
58 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Jump. |
50 public delegate void JumpHandler(object o, JumpEventArgs e); |
59 public delegate void JumpHandler(object o, JumpEventArgs e); |
|
60 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Wave. |
|
61 public delegate void WaveHandler(object o, WaveEventArgs e); |
|
62 //Il s'agit de la fonction permettant d'appeler les fonctions des événements Circle. |
|
63 public delegate void CircleHandler(object o, CircleEventArgs e); |
51 //Il s'agit de la fonction permettant d'appeler les fonctions des événements de proximité. |
64 //Il s'agit de la fonction permettant d'appeler les fonctions des événements de proximité. |
52 public delegate void UserPositionHandler(object o, UserPositionEventArgs e); |
65 public delegate void UserPositionHandler(object o, UserPositionEventArgs e); |
53 |
66 |
54 public class KinectMain |
67 public class KinectMain |
55 { |
68 { |
56 //Fenêtre de debug. |
69 //Fenêtre de debug. |
57 private DebugWindow debug; |
70 private DebugWindow debug; |
58 //Fenêtre de paramètres. |
|
59 private DebugParameters parameters; |
|
60 //Squelettes (Il y en a 6 par défaut). |
71 //Squelettes (Il y en a 6 par défaut). |
61 private Skeleton[] skeletons; |
72 private Skeleton[] skeletons; |
62 //Caméra infrarouge (sensor) de la Kinect. |
73 //Caméra infrarouge (sensor) de la Kinect. |
63 private KinectSensor kinectSensor; |
74 private KinectSensor kinectSensor; |
|
75 |
|
76 //Détecteur de penchés. |
|
77 private BendDetector bendDetector; |
|
78 //Détecteur de croisement de bras en X. |
|
79 private CrossDetector crossDetector; |
|
80 //Détecteur de levé de genou. |
|
81 private KneeUpDetector kneeUpDetector; |
64 |
82 |
65 //Détecteur de swipes. |
83 //Détecteur de swipes. |
66 private SwipeDetector swipeDetector; |
84 private SwipeDetector swipeDetector; |
67 //Détecteur de pushes. |
85 //Détecteur de pushes. |
68 private PushDetector pushDetector; |
86 private PushDetector pushDetector; |
69 //Détecteur de jumps. |
87 //Détecteur de jumps. |
70 private JumpDetector jumpDetector; |
88 private JumpDetector jumpDetector; |
|
89 //Détecteur de waves. |
|
90 private WaveDetector waveDetector; |
|
91 //Détecteur de cercles. |
|
92 private CircleDetector circleDetector; |
71 //Détecteur de proximité. |
93 //Détecteur de proximité. |
72 private UserPositionDetector userPositionDetector; |
94 private UserPositionDetector userPositionDetector; |
73 |
95 |
74 //Serveur TUIO pour la connexion du Middleware vers le Front Atelier. |
96 //Serveur TUIO pour la connexion du Middleware vers le Front Atelier. |
75 private Server server; |
97 private Server server; |
80 //Les événements des mains pour la recherche. |
102 //Les événements des mains pour la recherche. |
81 public static event LeftHandTrackedHandler LeftHandTrackedEvent; |
103 public static event LeftHandTrackedHandler LeftHandTrackedEvent; |
82 public static event RightHandTrackedHandler RightHandTrackedEvent; |
104 public static event RightHandTrackedHandler RightHandTrackedEvent; |
83 public static event LeftHandQuitHandler LeftHandQuitEvent; |
105 public static event LeftHandQuitHandler LeftHandQuitEvent; |
84 public static event RightHandQuitHandler RightHandQuitEvent; |
106 public static event RightHandQuitHandler RightHandQuitEvent; |
|
107 |
|
108 //L'événement bend. |
|
109 public static event BendHandler BendEvent; |
|
110 //L'événement cross. |
|
111 public static event CrossHandler CrossEvent; |
|
112 //L'événement kneeUp. |
|
113 public static event KneeUpHandler KneeUpEvent; |
|
114 |
85 //L'événement swipe. |
115 //L'événement swipe. |
86 public static event SwipeHandler SwipeEvent; |
116 public static event SwipeHandler SwipeEvent; |
87 //L'événement push. |
117 //L'événement push. |
88 public static event PushHandler PushEvent; |
118 public static event PushHandler PushEvent; |
89 //L'événement jump. |
119 //L'événement jump. |
90 public static event JumpHandler JumpEvent; |
120 public static event JumpHandler JumpEvent; |
|
121 //L'événement wave. |
|
122 public static event WaveHandler WaveEvent; |
|
123 //L'événement circle. |
|
124 public static event CircleHandler CircleEvent; |
91 //L'événement l'utilisateur se déplace dans la zone de détection. |
125 //L'événement l'utilisateur se déplace dans la zone de détection. |
92 public static event UserPositionHandler UserPositionEvent; |
126 public static event UserPositionHandler UserPositionEvent; |
93 |
127 |
94 /* |
128 /* |
95 * Initialisation de la classe principale. |
129 * Initialisation de la classe principale. |
99 public KinectMain() |
133 public KinectMain() |
100 { |
134 { |
101 //On crée la fenêtre de debug. |
135 //On crée la fenêtre de debug. |
102 debug = new DebugWindow(); |
136 debug = new DebugWindow(); |
103 |
137 |
|
138 //On crée les détecteurs de postures. |
|
139 bendDetector = new BendDetector(debug); |
|
140 crossDetector = new CrossDetector(debug); |
|
141 kneeUpDetector = new KneeUpDetector(debug); |
|
142 |
104 //On crée les détecteurs de gestes. |
143 //On crée les détecteurs de gestes. |
105 swipeDetector = new SwipeDetector(); |
144 swipeDetector = new SwipeDetector(debug); |
106 pushDetector = new PushDetector(); |
145 pushDetector = new PushDetector(debug); |
107 jumpDetector = new JumpDetector(); |
146 jumpDetector = new JumpDetector(debug); |
|
147 waveDetector = new WaveDetector(debug); |
|
148 circleDetector = new CircleDetector(debug); |
108 //On crée le détecteur de proximité. |
149 //On crée le détecteur de proximité. |
109 userPositionDetector = new UserPositionDetector(debug.getMinDist(), debug.getMaxDist(), debug.getZeroPoint(), debug.getMinDistHands(), debug.getMaxDistHands()); |
150 userPositionDetector = new UserPositionDetector(debug.getMinDist(), debug.getMaxDist(), debug.getZeroPoint(), debug.getMinDistHands(), debug.getMaxDistHands()); |
110 |
151 |
111 //On connecte le serveur à l'adresse locale sur le port 80. |
152 //On connecte le serveur à l'adresse locale sur le port 80. |
112 try |
153 try |
197 |
238 |
198 //Fonction appelée lorsque la main droite quitte le champ de recherche. |
239 //Fonction appelée lorsque la main droite quitte le champ de recherche. |
199 RightHandQuitListener rightHandQuitListener = new RightHandQuitListener(); |
240 RightHandQuitListener rightHandQuitListener = new RightHandQuitListener(); |
200 RightHandQuitEvent += new RightHandQuitHandler(rightHandQuitListener.showAndSend); |
241 RightHandQuitEvent += new RightHandQuitHandler(rightHandQuitListener.showAndSend); |
201 |
242 |
|
243 //Fonction appelée lorsque l'utilisateur se penche. |
|
244 BendListener bendListener = new BendListener(); |
|
245 BendEvent += new BendHandler(bendListener.showAndSend); |
|
246 |
|
247 //Fonction appelée lorsque l'utilisateur croise les bras en X. |
|
248 CrossListener crossListener = new CrossListener(); |
|
249 CrossEvent += new CrossHandler(crossListener.showAndSend); |
|
250 |
|
251 //Fonction appelée lorsque l'utilisateur lève le genou. |
|
252 KneeUpListener kneeUpListener = new KneeUpListener(); |
|
253 KneeUpEvent += new KneeUpHandler(kneeUpListener.showAndSend); |
|
254 |
202 //Fonction appelée lorsque l'utilisateur effectue un Swipe right/left/up/down. |
255 //Fonction appelée lorsque l'utilisateur effectue un Swipe right/left/up/down. |
203 SwipeListener swipeListener = new SwipeListener(); |
256 SwipeListener swipeListener = new SwipeListener(); |
204 SwipeEvent += new SwipeHandler(swipeListener.showAndSend); |
257 SwipeEvent += new SwipeHandler(swipeListener.showAndSend); |
205 |
258 |
206 //Fonction appelée lorsque l'utilisateur effectue un Push/Pull. |
259 //Fonction appelée lorsque l'utilisateur effectue un Push/Pull. |
208 PushEvent += new PushHandler(pushListener.showAndSend); |
261 PushEvent += new PushHandler(pushListener.showAndSend); |
209 |
262 |
210 //Fonction appelée lorsque l'utilisateur effectue un Jump. |
263 //Fonction appelée lorsque l'utilisateur effectue un Jump. |
211 JumpListener jumpListener = new JumpListener(); |
264 JumpListener jumpListener = new JumpListener(); |
212 JumpEvent += new JumpHandler(jumpListener.showAndSend); |
265 JumpEvent += new JumpHandler(jumpListener.showAndSend); |
|
266 |
|
267 //Fonction appelée lorsque l'utilisateur effectue un Wave. |
|
268 WaveListener waveListener = new WaveListener(); |
|
269 WaveEvent += new WaveHandler(waveListener.showAndSend); |
|
270 |
|
271 //Fonction appelée lorsque l'utilisateur effectue un Circle. |
|
272 CircleListener circleListener = new CircleListener(); |
|
273 CircleEvent += new CircleHandler(circleListener.showAndSend); |
213 |
274 |
214 //Fonction appelée lorsque l'utilisateur se déplace dans la zone de détection. |
275 //Fonction appelée lorsque l'utilisateur se déplace dans la zone de détection. |
215 UserPositionListener userPositionListener = new UserPositionListener(); |
276 UserPositionListener userPositionListener = new UserPositionListener(); |
216 UserPositionEvent += new UserPositionHandler(userPositionListener.showAndSend); |
277 UserPositionEvent += new UserPositionHandler(userPositionListener.showAndSend); |
217 |
278 |
400 joints.Insert((int)JointType.HipRight, hipRight); |
461 joints.Insert((int)JointType.HipRight, hipRight); |
401 joints.Insert((int)JointType.KneeRight, kneeRight); |
462 joints.Insert((int)JointType.KneeRight, kneeRight); |
402 joints.Insert((int)JointType.AnkleRight, ankleRight); |
463 joints.Insert((int)JointType.AnkleRight, ankleRight); |
403 joints.Insert((int)JointType.FootRight, footRight); |
464 joints.Insert((int)JointType.FootRight, footRight); |
404 GestureDetector.UpdateSkeletonHistory(joints); |
465 GestureDetector.UpdateSkeletonHistory(joints); |
|
466 PostureDetector.UpdateSkeletonState(joints); |
405 |
467 |
406 //Si la main gauche est dans le champ, on lance l'événement approprié. |
468 //Si la main gauche est dans le champ, on lance l'événement approprié. |
407 if (handLeft.Position.Z < debug.getMaxDistHands() && handLeft.Position.Z > debug.getMinDistHands()) |
469 if (handLeft.Position.Z < debug.getMaxDistHands() && handLeft.Position.Z > debug.getMinDistHands()) |
408 { |
470 { |
409 LeftHandTrackedEventArgs leftHandTrackedEvent = new LeftHandTrackedEventArgs(server, debug, handLeft, handLeft.Position.Z); |
471 LeftHandTrackedEventArgs leftHandTrackedEvent = new LeftHandTrackedEventArgs(server, debug, handLeft, handLeft.Position.Z); |
410 OnLeftHandTrackedEvent(leftHandTrackedEvent); |
472 OnLeftHandTrackedEvent(leftHandTrackedEvent); |
|
473 /*if (circleDetector.CheckForLeftCircle()) |
|
474 { |
|
475 CircleEventArgs circleEvent = new CircleEventArgs(server, debug); |
|
476 OnCircleEvent(circleEvent); |
|
477 }*/ |
411 } |
478 } |
412 //Si la main gauche quitte le champ, on lance l'événement approprié. |
479 //Si la main gauche quitte le champ, on lance l'événement approprié. |
413 else |
480 else |
414 { |
481 { |
415 LeftHandQuitEventArgs leftHandQuitEvent = new LeftHandQuitEventArgs(server, debug); |
482 LeftHandQuitEventArgs leftHandQuitEvent = new LeftHandQuitEventArgs(server, debug); |
418 //Si la main droite est dans le champ, on lance l'événement approprié. |
485 //Si la main droite est dans le champ, on lance l'événement approprié. |
419 if (handRight.Position.Z < debug.getMaxDistHands() && handRight.Position.Z > debug.getMinDistHands()) |
486 if (handRight.Position.Z < debug.getMaxDistHands() && handRight.Position.Z > debug.getMinDistHands()) |
420 { |
487 { |
421 RightHandTrackedEventArgs rightHandTrackedEvent = new RightHandTrackedEventArgs(server, debug, handRight, handRight.Position.Z); |
488 RightHandTrackedEventArgs rightHandTrackedEvent = new RightHandTrackedEventArgs(server, debug, handRight, handRight.Position.Z); |
422 OnRightHandTrackedEvent(rightHandTrackedEvent); |
489 OnRightHandTrackedEvent(rightHandTrackedEvent); |
|
490 /*if (circleDetector.CheckForRightCircle()) |
|
491 { |
|
492 CircleEventArgs circleEvent = new CircleEventArgs(server, debug); |
|
493 OnCircleEvent(circleEvent); |
|
494 //Console.Out.WriteLine("CIRCLE"); |
|
495 }*/ |
423 } |
496 } |
424 //Si la main droite quitte le champ, on lance l'événement approprié. |
497 //Si la main droite quitte le champ, on lance l'événement approprié. |
425 else |
498 else |
426 { |
499 { |
427 RightHandQuitEventArgs rightHandQuitEvent = new RightHandQuitEventArgs(server, debug); |
500 RightHandQuitEventArgs rightHandQuitEvent = new RightHandQuitEventArgs(server, debug); |
428 OnRightHandQuitEvent(rightHandQuitEvent); |
501 OnRightHandQuitEvent(rightHandQuitEvent); |
|
502 } |
|
503 |
|
504 //Si l'utilisateur s'est penché. |
|
505 if (bendDetector.CheckForBend()) |
|
506 { |
|
507 BendEventArgs bendEvent = new BendEventArgs(server, debug); |
|
508 OnBendEvent(bendEvent); |
|
509 } |
|
510 |
|
511 //Si l'utilisateur a croisé les bras en X. |
|
512 if (crossDetector.CheckForCross()) |
|
513 { |
|
514 CrossEventArgs crossEvent = new CrossEventArgs(server, debug); |
|
515 OnCrossEvent(crossEvent); |
|
516 } |
|
517 |
|
518 //Si l'utilisateur a levé le genou. |
|
519 if (kneeUpDetector.CheckForKneeUp()) |
|
520 { |
|
521 KneeUpEventArgs kneeUpEvent = new KneeUpEventArgs(server, debug); |
|
522 OnKneeUpEvent(kneeUpEvent); |
429 } |
523 } |
430 |
524 |
431 //Si l'utilisateur effectue un swipe left. |
525 //Si l'utilisateur effectue un swipe left. |
432 if (swipeDetector.CheckForSwipeLeft()) |
526 if (swipeDetector.CheckForSwipeLeft()) |
433 { |
527 { |
453 //Si l'utilisateur effectue un pull. |
547 //Si l'utilisateur effectue un pull. |
454 if ((handPush = pushDetector.CheckForPull()) != PushDetector.Hand.NONE) |
548 if ((handPush = pushDetector.CheckForPull()) != PushDetector.Hand.NONE) |
455 { |
549 { |
456 PushEventArgs pushEvent = new PushEventArgs(server, debug, PushDetector.Direction.PULL, handPush); |
550 PushEventArgs pushEvent = new PushEventArgs(server, debug, PushDetector.Direction.PULL, handPush); |
457 OnPushEvent(pushEvent); |
551 OnPushEvent(pushEvent); |
|
552 } |
|
553 |
|
554 //Si l'utilisateur effectue un wave. |
|
555 if (waveDetector.CheckForWave()) |
|
556 { |
|
557 WaveEventArgs waveEvent = new WaveEventArgs(server, debug); |
|
558 OnWaveEvent(waveEvent); |
|
559 Console.Out.WriteLine("WAVE"); |
458 } |
560 } |
459 |
561 |
460 //Si l'utilisateur se déplace dans la zone de détection. |
562 //Si l'utilisateur se déplace dans la zone de détection. |
461 //On traite le problème en plusieurs limites, on discrétise la zone. |
563 //On traite le problème en plusieurs limites, on discrétise la zone. |
462 if (first.TrackingState == SkeletonTrackingState.Tracked) |
564 if (first.TrackingState == SkeletonTrackingState.Tracked) |
540 if (RightHandQuitEvent != null) |
642 if (RightHandQuitEvent != null) |
541 RightHandQuitEvent(new object(), e); |
643 RightHandQuitEvent(new object(), e); |
542 } |
644 } |
543 |
645 |
544 /* |
646 /* |
|
647 * Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur se penche. |
|
648 */ |
|
649 public static void OnBendEvent(BendEventArgs e) |
|
650 { |
|
651 if (BendEvent != null) |
|
652 BendEvent(new object(), e); |
|
653 } |
|
654 |
|
655 /* |
|
656 * Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur croise les bras en X. |
|
657 */ |
|
658 public static void OnCrossEvent(CrossEventArgs e) |
|
659 { |
|
660 if (CrossEvent != null) |
|
661 CrossEvent(new object(), e); |
|
662 } |
|
663 |
|
664 /* |
|
665 * Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur lève le genou. |
|
666 */ |
|
667 public static void OnKneeUpEvent(KneeUpEventArgs e) |
|
668 { |
|
669 if (KneeUpEvent != null) |
|
670 KneeUpEvent(new object(), e); |
|
671 } |
|
672 |
|
673 /* |
545 * Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un swipe right. |
674 * Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un swipe right. |
546 */ |
675 */ |
547 public static void OnSwipeEvent(SwipeEventArgs e) |
676 public static void OnSwipeEvent(SwipeEventArgs e) |
548 { |
677 { |
549 if (SwipeEvent != null) |
678 if (SwipeEvent != null) |