/// /// ZWN-XHJ /// 20211018 /// using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public enum Wave_State { None, Wave_Left,//左挥手 Wave_Right,//右挥手 Wave_Up,//上挥手 Wave_Down//上挥手 } public class wavingaround : MonoBehaviour { public float space_time = 0.5f;//状态改变间隔时间 public float space_nose = 1.3f;//肩的距离大于肩到鼻子高度的比例,小于该比例为侧身 public float space_hand = 1.3f;//肘部位置小于手部的比例 public float space_handX = 1f;//手部幅度大于肩宽一半的比例 public bool Wave_Flag = false;//整体是否检测 Dictionary zwn_Single_Vec = new Dictionary();//关于位置数据的存储 Vector3 shoulder_Right, shoulder_Left;//右手//右肘//右肩//左手//左肘//左肩 Vector3 hand_Right, hand_Elbow_Right, hand_Left, hand_Elbow_Left;//右手//右肘//右肩//左手//左肘//左肩 public float width;//宽 int hand_Count = 25, buff_sz = 3; //存储帧数// avg size public List list_Shoulder_Y, list_Shoulder_X, list_ShoulderZ_X;//肩部XY记录 //关于左侧属性 #region bool flag_time_Left = false; float state_time_Left = 0; Wave_State cur_WaveState_Left = Wave_State.None; Wave_State last_WaveState_Left = Wave_State.None; public Wave_State Cur_WaveState_Left { get { return cur_WaveState_Left; }//返回属性的值 set { cur_WaveState_Left = value; }//通过Value这个变量给属性赋值 } Wave_State cur_WaveState_LeftUD = Wave_State.None; Wave_State last_WaveState_LeftUD = Wave_State.None; public Wave_State Cur_WaveState_LeftUD { get { return cur_WaveState_LeftUD; }//返回属性的值 set { cur_WaveState_LeftUD = value; }//通过Value这个变量给属性赋值 } public bool Wave_Flag_Left = false;//是否计算 public List list_Hand_X_Left, list_Hand_Y_Left;//左右手X Y列表 public List list_Elbow_X_Left, list_Elbow_Y_Left;//左右肩X Y列表 int None_Num_Left, Wave_Num_Left;//挥手 string last_Left; public Text show_Left, show_Left_Num; #endregion //关于右侧属性 #region bool flag_time_Right = false; float state_time_Right = 0; Wave_State cur_WaveState_Right = Wave_State.None; Wave_State last_WaveState_Right = Wave_State.None; public Wave_State Cur_WaveState_Right { get { return cur_WaveState_Right; }//返回属性的值 set { cur_WaveState_Right = value; }//通过Value这个变量给属性赋值 } Wave_State cur_WaveState_RightUD = Wave_State.None; Wave_State last_WaveState_RightUD = Wave_State.None; public Wave_State Cur_WaveState_RightUD { get { return cur_WaveState_RightUD; }//返回属性的值 set { cur_WaveState_RightUD = value; }//通过Value这个变量给属性赋值 } public bool Wave_Flag_Right = false;//是否计算 public List list_Hand_X_Right, list_Hand_Y_Right;//左右手X Y列表 public List list_Elbow_X_Right, list_Elbow_Y_Right;//左右肩X Y列表 int None_Num_Right, Wave_Num_Right;//挥手 string last_Right; public Text show_Right, show_Right_Num; #endregion void Awake() { if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer) { hand_Count = 25; buff_sz = 3; } if (Application.platform == RuntimePlatform.Android)// 使用Unity切换Platform无法模拟 { hand_Count = 6; buff_sz = 1; } space_handX = 0.5f;//手部幅度大于肩宽一半的比例 } bool reInit = false; /// /// 初始化打拳 /// public void Init_Wave() { cur_WaveState_Left = Wave_State.None; last_WaveState_Left = cur_WaveState_Left; cur_WaveState_LeftUD = Wave_State.None; last_WaveState_LeftUD = cur_WaveState_LeftUD; flag_time_Left = true; state_time_Left = 0; cur_WaveState_Right = Wave_State.None; last_WaveState_Right = cur_WaveState_Right; cur_WaveState_RightUD = Wave_State.None; last_WaveState_RightUD = cur_WaveState_RightUD; flag_time_Right = true; state_time_Right = 0; if (reInit) { if (list_Hand_X_Left.Count > 0) { list_Hand_X_Left.Clear(); list_Elbow_X_Left.Clear(); list_Hand_Y_Left.Clear(); list_Elbow_Y_Left.Clear(); } if (list_Hand_X_Right.Count > 0) { list_Hand_X_Right.Clear(); list_Elbow_X_Right.Clear(); list_Hand_Y_Right.Clear(); list_Elbow_Y_Right.Clear(); } } Wave_Flag = true; Wave_Flag_Left = true; Wave_Flag_Right = true; if (!reInit) { reInit = true; } } /// /// 结束打拳 /// public void End_Wave() { if (reInit) { if (list_Hand_X_Left.Count > 0) { list_Hand_X_Left.Clear(); list_Elbow_X_Left.Clear(); list_Hand_Y_Left.Clear(); list_Elbow_Y_Left.Clear(); } if (list_Hand_X_Right.Count > 0) { list_Hand_X_Right.Clear(); list_Elbow_X_Right.Clear(); list_Hand_Y_Right.Clear(); list_Elbow_Y_Right.Clear(); } } cur_WaveState_Left = Wave_State.None; last_WaveState_Left = cur_WaveState_Left; cur_WaveState_LeftUD = Wave_State.None; last_WaveState_LeftUD = cur_WaveState_LeftUD; flag_time_Left = true; state_time_Left = 0; cur_WaveState_Right = Wave_State.None; last_WaveState_Right = cur_WaveState_Right; cur_WaveState_RightUD = Wave_State.None; last_WaveState_RightUD = cur_WaveState_RightUD; flag_time_Right = true; state_time_Right = 0; Wave_Flag = false; Wave_Flag_Left = false; Wave_Flag_Right = false; } float time_delay = 0; void Update() { time_delay += Time.deltaTime; //print("time_delay: " + time_delay); if (time_delay >= 0.5f) { Resources.UnloadUnusedAssets();//卸载未占用的asset资源 System.GC.Collect();//回收内存 time_delay = 0; } if (Wave_Flag) { ZWN_Single_Vec(); List_Run(); if (Wave_Flag_Left) { List_Wave_Left(); } if (Wave_Flag_Right) { List_Wave_Right(); } } } /// /// 单人点 /// void ZWN_Single_Vec() { /*0:鼻子1:左眼2:右眼3:左耳4:右耳 5:左肩6:右肩7:左肘8:右肘9:左腕 10:右腕11:左臀12:右臀13:左膝 14:右膝15:左脚踝16:右脚踝 */ for (int i = 0; i < 17; i++) { if (zwn_Single_Vec.ContainsKey(i)) { zwn_Single_Vec[i] = common_data.single.zwn_single_vec[i]; } else { zwn_Single_Vec.Add(i, common_data.single.zwn_single_vec[i]); } } hand_Right = zwn_Single_Vec[9]; hand_Elbow_Right = zwn_Single_Vec[7]; shoulder_Right = zwn_Single_Vec[5]; hand_Left = zwn_Single_Vec[10]; hand_Elbow_Left = zwn_Single_Vec[8]; shoulder_Left = zwn_Single_Vec[6]; //if (width != Helper.Width) // width = Helper.Width; } #region 肩部相关信息 void List_Run() { if ( shoulder_Right.x != -1 && shoulder_Right.y != -1 && shoulder_Left.x != -1 && shoulder_Left.y != -1) { list_Shoulder_Y.Add((int)((shoulder_Right.y + shoulder_Left.y) / 2)); list_Shoulder_X.Add((int)(Mathf.Abs(shoulder_Right.x - shoulder_Left.x) / 2)); list_ShoulderZ_X.Add((int)(Mathf.Abs(shoulder_Right.x + shoulder_Left.x) / 2)); } if (list_Shoulder_Y.Count > hand_Count) { list_Shoulder_Y.Remove(list_Shoulder_Y[0]); list_Shoulder_X.Remove(list_Shoulder_X[0]); list_ShoulderZ_X.Add(list_ShoulderZ_X[0]); List_Run_Y(); List_Run_X(); List_RunZ_X(); ratioTmpY = (max_RunY - min_RunY) / width;//肩部Y占比例 ratioTmpX = ave_List_RunX / width;//肩部X占比例 ratioTmpZ_X = (max_RunY - min_RunY) / width;//肩部Y占比例 } } float cur_DirZ_X = 0, cur_Dir_StartZ_X = 0, cur_Dir_EndZ_X = 0, max_RunZ_X = -0xffff, min_RunZ_X = 0xffff, ratioTmpZ_X; /// /// 求X位移差、位移比例、滑动方向 /// void List_RunZ_X() { cur_DirZ_X = 0; cur_Dir_StartZ_X = 0; cur_Dir_EndZ_X = 0; max_RunZ_X = -0xffff; min_RunZ_X = 0xffff; for (int i = 0; i < list_ShoulderZ_X.Count; i++) { if (i == 0) { max_RunZ_X = list_ShoulderZ_X[i]; min_RunZ_X = list_ShoulderZ_X[i]; } if (i < buff_sz) { cur_Dir_StartZ_X += list_ShoulderZ_X[i]; } if (i >= list_ShoulderZ_X.Count - buff_sz) { cur_Dir_EndZ_X += list_ShoulderZ_X[i]; } if (list_ShoulderZ_X[i] > max_RunZ_X) max_RunZ_X = list_ShoulderZ_X[i]; if (list_ShoulderZ_X[i] < min_RunZ_X) min_RunZ_X = list_ShoulderZ_X[i]; } cur_DirZ_X = (cur_Dir_StartZ_X / buff_sz) - (cur_Dir_EndZ_X / buff_sz); } float cur_DirY = 0, cur_Dir_StartY = 0, cur_Dir_EndY = 0, max_RunY = -0xffff, min_RunY = 0xffff, ratioTmpY; /// /// 求X位移差、位移比例、滑动方向 /// void List_Run_Y() { cur_DirY = 0; cur_Dir_StartY = 0; cur_Dir_EndY = 0; max_RunY = -0xffff; min_RunY = 0xffff; for (int i = 0; i < list_Shoulder_Y.Count; i++) { if (i == 0) { max_RunY = list_Shoulder_Y[i]; min_RunY = list_Shoulder_Y[i]; } if (i < buff_sz) { cur_Dir_StartY += list_Shoulder_Y[i]; } if (i >= list_Shoulder_Y.Count - buff_sz) { cur_Dir_EndY += list_Shoulder_Y[i]; } if (list_Shoulder_Y[i] > max_RunY) max_RunY = list_Shoulder_Y[i]; if (list_Shoulder_Y[i] < min_RunY) min_RunY = list_Shoulder_Y[i]; } cur_DirY = (cur_Dir_StartY / buff_sz) - (cur_Dir_EndY / buff_sz); } float cur_DirX = 0, cur_Dir_StartX = 0, cur_Dir_EndX = 0, max_Shoulderx = -0xffff, min_Shoulderx = 0xffff; float ave_List_RunX, ratioTmpX; /// /// 求X位移差、位移比例、滑动方向 /// void List_Run_X() { cur_DirX = 0; cur_Dir_StartX = 0; cur_Dir_EndX = 0; max_Shoulderx = -0xffff; min_Shoulderx = 0xffff; ave_List_RunX = 0; for (int i = 0; i < list_Shoulder_X.Count; i++) { if (i == 0) { max_Shoulderx = list_Shoulder_X[i]; min_Shoulderx = list_Shoulder_X[i]; } if (i < buff_sz) { cur_Dir_StartX += list_Shoulder_X[i]; } if (i >= list_Shoulder_X.Count - buff_sz) { cur_Dir_EndX += list_Shoulder_X[i]; } if (list_Shoulder_X[i] > max_RunY) max_Shoulderx = list_Shoulder_X[i]; if (list_Shoulder_X[i] < min_RunY) min_Shoulderx = list_Shoulder_X[i]; ave_List_RunX += list_Shoulder_X[i]; } ave_List_RunX = ave_List_RunX / list_Shoulder_X.Count; cur_DirX = (cur_Dir_StartX / buff_sz) - (cur_Dir_EndX / buff_sz); } #endregion //右侧信息 #region /// /// 右侧状态判断 /// void List_Wave_Right() { if (hand_Right.x != -1 && hand_Right.y != -1 && hand_Elbow_Right.x != -1 && hand_Elbow_Right.y != -1) { list_Hand_X_Right.Add(hand_Right.x); list_Elbow_X_Right.Add(hand_Elbow_Right.x); list_Hand_Y_Right.Add(hand_Right.y); list_Elbow_Y_Right.Add(hand_Elbow_Right.y); } if (!flag_time_Right) { flag_time_Right = true; state_time_Right += Time.deltaTime; if (state_time_Right >= space_time) { flag_time_Right = true; state_time_Right = 0; } } if (list_Hand_X_Right.Count > hand_Count) { list_Hand_X_Right.Remove(list_Hand_X_Right[0]); list_Elbow_X_Right.Remove(list_Elbow_X_Right[0]); list_Hand_Y_Right.Remove(list_Hand_Y_Right[0]); list_Elbow_Y_Right.Remove(list_Elbow_Y_Right[0]); List_Wave_Right_X(); List_Wave_Right_Y(); List_Wave_Right_ElbowY(); ratioTmpX_Right = (max_x_Right - min_x_Right) / width;//右手X最大差 ratioTmpY_Right = (max_y_Right - min_y_Right) / width;//右手Y最大差 last_ElbowY_Right = list_Elbow_Y_Right[list_Elbow_Y_Right.Count - 1]; last_Y_Right = list_Hand_Y_Right[list_Hand_Y_Right.Count - 1]; speed_list_X_Right = Mathf.Abs(list_Hand_X_Right[list_Hand_X_Right.Count - 1] - list_Hand_X_Right[list_Hand_X_Right.Count - 2]) / width; speed_list_Y_Right = Mathf.Abs(list_Hand_Y_Right[list_Hand_Y_Right.Count - 1] - list_Hand_Y_Right[list_Hand_Y_Right.Count - 2]) / width; //print((speed_list_X_Right == 0) + " " +(speed_list_Y_Right == 0)); if (speed_list_X_Right == 0 || speed_list_Y_Right == 0) { State_None_Right(); State_None_RightUD(); None_Right(); } else { //print((ratioTmpX > 0) + " " + //(ratioTmpX_Right - ratioTmpZ_X > ratioTmpX * space_handX) + " " + // (ratioTmpY_Right > ratioTmpX * space_handX)); last_Right = ""; if (ratioTmpX > 0) { if ((ratioTmpX_Right - ratioTmpZ_X > ratioTmpX * space_handX) || (ratioTmpY_Right > ratioTmpX * space_handX)) { if (ratioTmpX_Right - ratioTmpZ_X > ratioTmpX * space_handX) //&& last_Y_Right < last_ElbowY_Right) { if (cur_Dir_X_Right > 0) { State_Wave_Right(2); } else if (cur_Dir_X_Right < 0) { State_Wave_Right(1); } } else { State_None_Right(); None_Right(); } if (ratioTmpY_Right > ratioTmpX * space_handX) { if (cur_Dir_Y_Right > 0) { State_Wave_RightUD(4); } else if (cur_Dir_Y_Right < 0) { State_Wave_RightUD(3); } } else { State_None_RightUD(); None_Right(); } } else { /* State_None_Right(); State_None_RightUD(); None_Right();*/ } } else { State_None_Right(); State_None_RightUD(); None_Right(); } } if (show_Right != null) { show_Right.text = last_Right; } if (show_Right_Num != null) { show_Right_Num.text = None_Num_Right + "\n挥手" + Wave_Num_Right; } } } float ratioTmpX_Right; float cur_Dir_X_Right = 0; float cur_Dir_Start_RightX = 0, cur_Dir_End_RightX = 0; float max_x_Right, min_x_Right; float speed_list_X_Right; /// /// 求X位移差、位移比例、滑动方向 /// void List_Wave_Right_X() { cur_Dir_X_Right = 0; cur_Dir_Start_RightX = 0; cur_Dir_End_RightX = 0; max_x_Right = -0xffff; min_x_Right = 0xffff; for (int i = 0; i < list_Hand_X_Right.Count; i++) { if (i == 0) { max_x_Right = list_Hand_X_Right[i]; min_x_Right = list_Hand_X_Right[i]; } if (i < buff_sz) { cur_Dir_Start_RightX += list_Hand_X_Right[i]; } if (i >= list_Hand_X_Right.Count - buff_sz) { cur_Dir_End_RightX += list_Hand_X_Right[i]; } if (list_Hand_X_Right[i] > max_x_Right) max_x_Right = list_Hand_X_Right[i]; if (list_Hand_X_Right[i] < min_x_Right) min_x_Right = list_Hand_X_Right[i]; } cur_Dir_X_Right = (cur_Dir_Start_RightX / buff_sz) - (cur_Dir_End_RightX / buff_sz); } float cur_Dir_Y_Right = 0; float cur_Dir_Start_RightY = 0, cur_Dir_End_RightY = 0; float max_y_Right, min_y_Right; float ratioTmpY_Right; float last_Y_Right, last_ElbowY_Right; float speed_list_Y_Right; /// /// 求Y位移差与位移比例 /// void List_Wave_Right_Y() { cur_Dir_Y_Right = 0; cur_Dir_Start_RightY = 0; cur_Dir_End_RightY = 0; max_y_Right = -0xffff; min_y_Right = 0xffff; for (int i = 0; i < list_Hand_Y_Right.Count; i++) { if (i == 0) { max_y_Right = list_Hand_Y_Right[i]; min_y_Right = list_Hand_Y_Right[i]; } if (i < buff_sz) { cur_Dir_Start_RightY += list_Hand_Y_Right[i]; } if (i >= list_Hand_Y_Right.Count - buff_sz) { cur_Dir_End_RightY += list_Hand_Y_Right[i]; } if (list_Hand_Y_Right[i] > max_y_Right) max_y_Right = list_Hand_Y_Right[i]; if (list_Hand_Y_Right[i] < min_y_Right) min_y_Right = list_Hand_Y_Right[i]; } cur_Dir_Y_Right = ((cur_Dir_Start_RightY / buff_sz) - (cur_Dir_End_RightY / buff_sz)) / 2; } float cur_Dir_ElbowY_Right = 0; float cur_Dir_StartElbow_RightY = 0; float max_Elbowy_Right, min_Elbowy_Right; void List_Wave_Right_ElbowY() { cur_Dir_ElbowY_Right = 0; cur_Dir_StartElbow_RightY = 0; max_Elbowy_Right = 0; min_Elbowy_Right = 0; for (int i = 0; i < list_Elbow_Y_Right.Count; i++) { if (i == 0) { max_Elbowy_Right = list_Elbow_Y_Right[i]; min_Elbowy_Right = list_Elbow_Y_Right[i]; } if (list_Elbow_Y_Right[i] > max_Elbowy_Right) max_Elbowy_Right = list_Elbow_Y_Right[i]; if (list_Elbow_Y_Right[i] < min_Elbowy_Right) min_Elbowy_Right = list_Elbow_Y_Right[i]; if (i < buff_sz) { // cur_Dir_StartElbow_RightY += list_Elbow_Y_Right[i]; } cur_Dir_StartElbow_RightY += list_Elbow_Y_Right[i]; if (i >= list_Hand_Y_Right.Count - buff_sz) { // cur_Dir_EndElbow_RightY += list_Elbow_Y_Right[i]; } } // cur_Dir_ElbowY_Right = ((cur_Dir_StartElbow_RightY / buff_sz) + (cur_Dir_EndElbow_RightY / buff_sz)) / 2; cur_Dir_ElbowY_Right = cur_Dir_StartElbow_RightY / (list_Hand_Y_Right.Count - buff_sz * 2); } /// /// 上一个状态提示 /// void last_State_Right() { //last_Right = "上一个左右状态:"; switch (last_WaveState_Right) { case Wave_State.None: //last_Right += "空\n"; break; case Wave_State.Wave_Left: // last_Right += "向左挥手\n"; break; case Wave_State.Wave_Right: // last_Right += "向右挥手\n"; break; } } /// /// 上一个状态更新 /// void End_State_Right() { last_WaveState_Right = cur_WaveState_Right; } /// /// 空状态 /// void State_None_Right() { if (cur_WaveState_Right != Wave_State.None) { None_Num_Right += 1; last_State_Right(); cur_WaveState_Right = Wave_State.None; End_State_Right(); last_Right = last_Right + "\n当前左右状态:空\n"; } } /// /// 右手状态 /// void State_Wave_Right(int state) { //print("right: " + state); if (last_WaveState_Right == Wave_State.None)// && flag_time_Right) // || last_WaveState_Left == Wave_State.Stay)) { Wave_Num_Right += 1; last_State_Right(); switch (state) { case 1: if (cur_WaveState_Right != Wave_State.Wave_Right) { cur_WaveState_Right = Wave_State.Wave_Right; } last_Right = last_Right + "\n当前左右状态:向右挥手\n"; break; case 2: if (cur_WaveState_Right != Wave_State.Wave_Left) { cur_WaveState_Right = Wave_State.Wave_Left; } last_Right = last_Right + "\n当前左右状态:向左挥手\n"; break; } End_State_Right(); flag_time_Right = false; state_time_Right = 0; } } /// /// 上一个状态提示 /// void last_State_RightUD() { //last_Right = "上一个上下状态:"; switch (last_WaveState_RightUD) { case Wave_State.None: //last_Right += "空\n"; break; case Wave_State.Wave_Up: //last_Right += "向上挥手\n"; break; case Wave_State.Wave_Down: //last_Right += "向下挥手\n"; break; } } /// /// 上一个状态更新 /// void End_State_RightUD() { last_WaveState_RightUD = cur_WaveState_RightUD; } /// /// 空状态 /// void State_None_RightUD() { if (cur_WaveState_RightUD != Wave_State.None) { None_Num_Right += 1; last_State_RightUD(); cur_WaveState_RightUD = Wave_State.None; End_State_RightUD(); last_Right = last_Right + "\n当前上下状态:空\n"; } } /// /// 右手状态 /// void State_Wave_RightUD(int state) { //print("right: " + state); if (last_WaveState_RightUD == Wave_State.None)// && flag_time_Right) // || last_WaveState_Left == Wave_State.Stay)) { Wave_Num_Right += 1; last_State_RightUD(); switch (state) { case 3: if (cur_WaveState_RightUD != Wave_State.Wave_Up) { cur_WaveState_RightUD = Wave_State.Wave_Up; } last_Right = last_Right + "\n当前上下状态:向上挥手\n"; break; case 4: if (cur_WaveState_RightUD != Wave_State.Wave_Down) { cur_WaveState_RightUD = Wave_State.Wave_Down; } last_Right = last_Right + "\n当前上下状态:向下挥手\n"; break; } End_State_RightUD(); flag_time_Right = false; state_time_Right = 0; } } void None_Right() { /* if (list_Hand_X_Right.Count > 0) { list_Elbow_X_Right.Clear(); list_Hand_Y_Right.Clear(); list_Elbow_Y_Right.Clear(); list_Hand_X_Right.Clear(); }*/ } #endregion //左侧信息 #region /// /// 右侧状态判断 /// void List_Wave_Left() { if (hand_Left.x != -1 && hand_Left.y != -1 && hand_Elbow_Left.x != -1 && hand_Elbow_Left.y != -1) { list_Hand_X_Left.Add(hand_Left.x); list_Elbow_X_Left.Add(hand_Elbow_Left.x); list_Hand_Y_Left.Add(hand_Left.y); list_Elbow_Y_Left.Add(hand_Elbow_Left.y); } if (!flag_time_Left) { flag_time_Left = true; state_time_Left += Time.deltaTime; if (state_time_Left >= space_time) { flag_time_Left = true; state_time_Left = 0; } } if (list_Hand_X_Left.Count > hand_Count) { list_Hand_X_Left.Remove(list_Hand_X_Left[0]); list_Elbow_X_Left.Remove(list_Elbow_X_Left[0]); list_Hand_Y_Left.Remove(list_Hand_Y_Left[0]); list_Elbow_Y_Left.Remove(list_Elbow_Y_Left[0]); List_Wave_Left_X(); List_Wave_Left_Y(); List_Wave_Left_ElbowY(); ratioTmpX_Left = (max_x_Left - min_x_Left) / width;//右手左右最大差 ratioTmpY_Left = (max_y_Left - min_y_Left) / width; last_ElbowY_Left = list_Elbow_Y_Left[list_Elbow_Y_Left.Count - 1]; last_Y_Left = list_Hand_Y_Left[list_Hand_Y_Left.Count - 1]; speed_list_X_Left = Mathf.Abs(list_Hand_X_Left[list_Hand_X_Left.Count - 1] - list_Hand_X_Left[list_Hand_X_Left.Count - 2]) / width; speed_list_Y_Left = Mathf.Abs(list_Hand_Y_Left[list_Hand_Y_Left.Count - 1] - list_Hand_Y_Left[list_Hand_Y_Left.Count - 2]) / width; if (speed_list_X_Left == 0 || speed_list_Y_Left == 0) { State_None_Left(); State_None_LeftUD(); None_Left(); } else { last_Left = ""; if (ratioTmpX > 0) { if ((ratioTmpX_Left - ratioTmpZ_X > ratioTmpX * space_handX) || (ratioTmpY_Left > ratioTmpX * space_handX)) { if (ratioTmpX_Left - ratioTmpZ_X > ratioTmpX * space_handX) //&& last_Y_Left < last_ElbowY_Left) { if (cur_Dir_X_Left > 0) { State_Wave_Left(2); } else if (cur_Dir_X_Left < 0) { State_Wave_Left(1); } } else { State_None_Left(); None_Left(); } if (ratioTmpY_Left > ratioTmpX * space_handX) { if (cur_Dir_Y_Left > 0) { State_Wave_LeftUD(4); } else if (cur_Dir_Y_Left < 0) { State_Wave_LeftUD(3); } } else { State_None_LeftUD(); None_Left(); } } else { /* State_None_Left(); State_None_LeftUD(); None_Left();*/ } } else { State_None_Left(); State_None_LeftUD(); None_Left(); } } if (show_Left != null) { show_Left.text = last_Left; } if (show_Left_Num != null) { show_Left_Num.text = None_Num_Left + "\n挥手" + Wave_Num_Left; } } } float ratioTmpX_Left; float cur_Dir_X_Left = 0; float cur_Dir_Start_LeftX = 0, cur_Dir_End_LeftX = 0; float max_x_Left, min_x_Left; float speed_list_X_Left; /// /// 求X位移差、位移比例、滑动方向 /// void List_Wave_Left_X() { cur_Dir_X_Left = 0; cur_Dir_Start_LeftX = 0; cur_Dir_End_LeftX = 0; max_x_Left = -0xffff; min_x_Left = 0xffff; for (int i = 0; i < list_Hand_X_Left.Count; i++) { if (i == 0) { max_x_Left = list_Hand_X_Left[i]; min_x_Left = list_Hand_X_Left[i]; } if (i < buff_sz) { cur_Dir_Start_LeftX += list_Hand_X_Left[i]; } if (i >= list_Hand_X_Left.Count - buff_sz) { cur_Dir_End_LeftX += list_Hand_X_Left[i]; } if (list_Hand_X_Left[i] > max_x_Left) max_x_Left = list_Hand_X_Left[i]; if (list_Hand_X_Left[i] < min_x_Left) min_x_Left = list_Hand_X_Left[i]; } cur_Dir_X_Left = (cur_Dir_Start_LeftX / buff_sz) - (cur_Dir_End_LeftX / buff_sz); } float cur_Dir_Y_Left = 0; float cur_Dir_Start_LeftY = 0, cur_Dir_End_LeftY = 0; float max_y_Left, min_y_Left; float ratioTmpY_Left; float last_Y_Left, last_ElbowY_Left; float speed_list_Y_Left; /// /// 求Y位移差与位移比例 /// void List_Wave_Left_Y() { cur_Dir_Y_Left = 0; cur_Dir_Start_LeftY = 0; cur_Dir_End_LeftY = 0; max_y_Left = -0xffff; min_y_Left = 0xffff; for (int i = 0; i < list_Hand_Y_Left.Count; i++) { if (i == 0) { max_y_Left = list_Hand_Y_Left[i]; min_y_Left = list_Hand_Y_Left[i]; } if (i < buff_sz) { cur_Dir_Start_LeftY += list_Hand_Y_Left[i]; } if (i >= list_Hand_Y_Left.Count - buff_sz) { cur_Dir_End_LeftY += list_Hand_Y_Left[i]; } if (list_Hand_Y_Left[i] > max_y_Left) max_y_Left = list_Hand_Y_Left[i]; if (list_Hand_Y_Left[i] < min_y_Left) min_y_Left = list_Hand_Y_Left[i]; } cur_Dir_Y_Left = (cur_Dir_Start_LeftY / buff_sz) - (cur_Dir_End_LeftY / buff_sz); } float cur_Dir_ElbowY_Left = 0; float cur_Dir_StartElbow_LeftY = 0; float max_Elbowy_Left, min_Elbowy_Left; void List_Wave_Left_ElbowY() { cur_Dir_ElbowY_Left = 0; cur_Dir_StartElbow_LeftY = 0; max_Elbowy_Left = 0; min_Elbowy_Left = 0; for (int i = 0; i < list_Elbow_Y_Left.Count; i++) { if (i == 0) { max_Elbowy_Left = list_Elbow_Y_Left[i]; min_Elbowy_Left = list_Elbow_Y_Left[i]; } if (list_Elbow_Y_Left[i] > max_Elbowy_Left) max_Elbowy_Left = list_Elbow_Y_Left[i]; if (list_Elbow_Y_Left[i] < min_Elbowy_Left) min_Elbowy_Left = list_Elbow_Y_Left[i]; if (i < buff_sz) { // cur_Dir_StartElbow_LeftY += list_Elbow_Y_Left[i]; } cur_Dir_StartElbow_LeftY += list_Elbow_Y_Left[i]; if (i >= list_Hand_Y_Left.Count - buff_sz) { // cur_Dir_EndElbow_LeftY += list_Elbow_Y_Left[i]; } } cur_Dir_ElbowY_Left = cur_Dir_StartElbow_LeftY / (list_Hand_Y_Left.Count - buff_sz * 2); } /// /// 上一个状态提示 /// void last_State_Left() { // last_Left += "上一个左右状态:"; switch (last_WaveState_Left) { case Wave_State.None: // last_Left += "空\n"; break; case Wave_State.Wave_Left: //last_Left += "向左挥手\n"; break; case Wave_State.Wave_Right: // last_Left += "向右挥手\n"; break; } } /// /// 上一个状态更新 /// void End_State_Left() { last_WaveState_Left = cur_WaveState_Left; } /// /// 空状态 /// void State_None_Left() { if (cur_WaveState_Left != Wave_State.None) { None_Num_Left += 1; last_State_Left(); cur_WaveState_Left = Wave_State.None; End_State_Left(); last_Left = last_Left + "\n当前左右状态:空\n"; } } /// /// 左手状态 /// void State_Wave_Left(int state) { //print("left: " + state); if (last_WaveState_Left == Wave_State.None)// && flag_time_Left) // || last_WaveState_Left == Wave_State.Stay)) { Wave_Num_Left += 1; last_State_Left(); switch (state) { case 1: if (cur_WaveState_Left != Wave_State.Wave_Right) { cur_WaveState_Left = Wave_State.Wave_Right; } last_Left = last_Left + "\n当前左右状态:向右挥手\n"; break; case 2: if (cur_WaveState_Left != Wave_State.Wave_Left) { cur_WaveState_Left = Wave_State.Wave_Left; } last_Left = last_Left + "\n当前左右状态:向左挥手\n"; break; } End_State_Left(); flag_time_Left = false; state_time_Left = 0; } } /// /// 上一个状态提示 /// void last_State_LeftUD() { // last_Left += "上一个上下状态:"; switch (last_WaveState_LeftUD) { case Wave_State.None: // last_Left += "空\n"; break; case Wave_State.Wave_Up: // last_Left += "向上挥手\n"; break; case Wave_State.Wave_Down: // last_Left += "向下挥手\n"; break; } } /// /// 上一个状态更新 /// void End_State_LeftUD() { last_WaveState_LeftUD = cur_WaveState_LeftUD; } /// /// 空状态 /// void State_None_LeftUD() { if (cur_WaveState_LeftUD != Wave_State.None) { None_Num_Left += 1; last_State_LeftUD(); cur_WaveState_LeftUD = Wave_State.None; End_State_LeftUD(); last_Left = last_Left + "\n当前上下状态:空\n"; } } /// /// 左手状态 /// void State_Wave_LeftUD(int state) { //print("left: " + state); if (last_WaveState_LeftUD == Wave_State.None)//&& flag_time_Left) // || last_WaveState_Left == Wave_State.Stay)) { Wave_Num_Left += 1; last_State_LeftUD(); switch (state) { case 3: if (cur_WaveState_LeftUD != Wave_State.Wave_Up) { cur_WaveState_LeftUD = Wave_State.Wave_Up; } last_Left = last_Left + "\n当前上下状态:向上挥手\n"; break; case 4: if (cur_WaveState_LeftUD != Wave_State.Wave_Down) { cur_WaveState_LeftUD = Wave_State.Wave_Down; } last_Left = last_Left + "\n当前上下状态:向下挥手\n"; break; } End_State_LeftUD(); flag_time_Left = false; state_time_Left = 0; } } void None_Left() { /*if (list_Hand_X_Left.Count > 0) { list_Elbow_X_Left.Clear(); list_Hand_Y_Left.Clear(); list_Elbow_Y_Left.Clear(); list_Hand_X_Left.Clear(); }*/ } #endregion }