15 * |
15 * |
16 * Auteur : alexandre.bastien@iri.centrepompidou.fr |
16 * Auteur : alexandre.bastien@iri.centrepompidou.fr |
17 * |
17 * |
18 * Fonctionnalités : Permet de détecter si l'utilisateur a sauté, en se basant sur |
18 * Fonctionnalités : Permet de détecter si l'utilisateur a sauté, en se basant sur |
19 * des règles appliquées à la positions des noeuds dans le temps. |
19 * des règles appliquées à la positions des noeuds dans le temps. |
20 * |
|
21 * P.S : Cette partie est encore en développement. |
|
22 */ |
20 */ |
23 |
21 |
24 using System; |
22 using System; |
25 using System.Collections.Generic; |
23 using System.Collections.Generic; |
26 using System.Linq; |
24 using System.Linq; |
53 |
51 |
54 //Si il n'y a pas assez de positions dans l'historique local pour vérifier le geste. |
52 //Si il n'y a pas assez de positions dans l'historique local pour vérifier le geste. |
55 if (localHistory.Count < indexesToCheck) |
53 if (localHistory.Count < indexesToCheck) |
56 return false; |
54 return false; |
57 |
55 |
58 /* (HeadBelowBaseLine || LeftKneeBelowBaseLine || RightKneeBelowBaseLine || |
|
59 * LeftAnkleBelowBaseLine || RightAnkleBelowBaseLine || BodyFaceUpwards |
|
60 * |
|
61 * NOT |
|
62 * |
|
63 * AND |
|
64 * |
|
65 * HeadAboveBaseLine && LeftKneeAboveBaseLine && RightKneeAboveBaseLine && |
|
66 * LegsStraightPreviouslyBent) |
|
67 * |
|
68 * OR |
|
69 * |
|
70 * HeadFarAboveBaseLine |
|
71 */ |
|
72 |
|
73 //La distance de référence est ici la distance entre les épaules et les hanches. |
56 //La distance de référence est ici la distance entre les épaules et les hanches. |
74 refDistance = Math.Abs(localHistory[0][(int)JointType.ShoulderCenter].Position.Y - localHistory[0][(int)JointType.HipCenter].Position.Y); |
57 refDistance = Math.Abs(localHistory[0][(int)JointType.ShoulderCenter].Position.Y - localHistory[0][(int)JointType.HipCenter].Position.Y); |
75 //On commence la position pour les indexesToCheck dernières postures (celle à l'index 0 étant la dernière). |
58 //On commence la position pour les indexesToCheck dernières postures (celle à l'index 0 étant la dernière). |
76 |
59 |
77 int beginIdx = localHistory.Count - indexesToCheck + 1; |
60 int beginIdx = localHistory.Count - indexesToCheck + 1; |
106 if (Math.Abs(localHistory[beginIdx][(int)JointType.Spine].Position.Y - localHistory[i][(int)JointType.Spine].Position.Y) < refDistance / 5 || |
81 if (Math.Abs(localHistory[beginIdx][(int)JointType.Spine].Position.Y - localHistory[i][(int)JointType.Spine].Position.Y) < refDistance / 5 || |
107 localHistory[beginIdx][(int)JointType.Spine].Position.Y < localHistory[i][(int)JointType.Spine].Position.Y) |
82 localHistory[beginIdx][(int)JointType.Spine].Position.Y < localHistory[i][(int)JointType.Spine].Position.Y) |
108 { |
83 { |
109 probableJump = true; |
84 probableJump = true; |
110 endIdx = i; |
85 endIdx = i; |
111 debug.onR1(true); |
|
112 //Console.Out.WriteLine("TOP"); |
|
113 } |
86 } |
114 } |
87 } |
115 } |
88 } |
116 else |
89 else |
117 { |
90 { |
118 debug.onR0(false); |
91 //On supprime l'historique local. |
119 debug.onR1(false); |
92 localHistory.Clear(); |
120 debug.onR2(false); |
|
121 return false; |
93 return false; |
122 } |
94 } |
123 |
95 |
124 if (probableJump) |
96 if (probableJump) |
125 { |
97 { |
126 if (Math.Abs(localHistory[beginIdx][(int)JointType.Spine].Position.Z - localHistory[endIdx][(int)JointType.Spine].Position.Z) < 0.10) |
98 if (Math.Abs(localHistory[beginIdx][(int)JointType.Spine].Position.Z - localHistory[endIdx][(int)JointType.Spine].Position.Z) < 0.10) |
127 { |
99 { |
128 debug.onR2(true); |
100 //On supprime l'historique local. |
|
101 localHistory.Clear(); |
129 return true; |
102 return true; |
130 } |
103 } |
131 } |
104 } |
132 else |
105 else |
133 { |
106 { |
134 debug.onR0(false); |
107 //On supprime l'historique local. |
135 debug.onR1(false); |
108 localHistory.Clear(); |
136 debug.onR2(false); |
|
137 return false; |
109 return false; |
138 } |
110 } |
139 |
|
140 //if (localHistory[i - 1][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.HandRight].Position.Y && !topOfJump) |
|
141 //return false; |
|
142 |
|
143 //Si la position Y de la main est plus haute que la tête |
|
144 //OU si la position Y de la main est plus basse que la hanche |
|
145 //OU si la nouvelle position Z de la main est moins profonde que la précédente |
|
146 //OU si la nouvelle position X de la main est plus éloignée de la distance N par rapport à la première position X |
|
147 //OU si la nouvelle position Y de la main est plus éloignée de la distance N par rapport à la première position Y |
|
148 //Alors la main en question ne fait pas de push. |
|
149 /*if (localHistory[i - 1][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.HandRight].Position.Y && |
|
150 topOfJump || localHistory[i - 1][(int)JointType.HandRight].Position.Y < localHistory[i][(int)JointType.HandRight].Position.Y && |
|
151 !topOfJump) |
|
152 return false;*/ |
|
153 //} |
|
154 |
|
155 //Console.Out.WriteLine("OK"); |
|
156 |
|
157 //Si la distance en Z du geste a été plus courte que la distance N |
|
158 //Alors on retourne faux. |
|
159 //float dist = (localHistory[localHistory.Count - 1][handRightID].Position.X - localHistory[localHistory.Count - indexesToCheck][handRightID].Position.X); |
|
160 |
|
161 //Console.WriteLine(Math.Abs(localHistory[0][handLeftID].Position.Z - localHistory[localHistory.Count - indexesToCheck][handLeftID].Position.Z) * 100 + " " + refDistance); |
|
162 |
|
163 //Si la dernière position de la main droite/gauche est sur le côté gauche/droit du corps |
|
164 //OU si la première position calculée de la main droite/gauche est sur le côté gauche/droit du corps |
|
165 //Alors on retourne faux. |
|
166 |
111 |
167 //On supprime l'historique local. |
112 //On supprime l'historique local. |
168 |
113 localHistory.Clear(); |
169 return false; |
114 return false; |
170 } |
115 } |
171 } |
116 } |
172 } |
117 } |