Skip to content

Commit

Permalink
# 改进手势
Browse files Browse the repository at this point in the history
  • Loading branch information
rexq57 committed Jun 1, 2021
1 parent 03f5605 commit cebc8bd
Show file tree
Hide file tree
Showing 7 changed files with 129 additions and 166 deletions.
86 changes: 14 additions & 72 deletions driver_leap/Devices/CLeapController/CLeapControllerIndex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -304,108 +304,50 @@ void CLeapControllerIndex::UpdateGestures(const LEAP_HAND *f_hand, const LEAP_HA
std::map<CGestureMatcher::HandGesture, bool> gestures;
std::vector<float> values;
CGestureMatcher::GetGestures(f_hand, gestures, values, f_oppHand);
//CControlMatcher::GetGestures(f_hand, l_gestures, l_controls);

bool trackpadTouched = values[CGestureMatcher::HGS_TrackpadX] != 0.0f && values[CGestureMatcher::HGS_TrackpadY] != 0.0f;
bool thumbstickTouched = values[CGestureMatcher::HGS_ThumbstickX] != 0.0f && values[CGestureMatcher::HGS_ThumbstickY] != 0.0f;
bool disable_gesture = gestures[CGestureMatcher::__HG_Disable];

#define SET_VALUE(idx, val) m_buttons[idx]->SetValue(disable_gesture ? 0.0f:val);
#define SET_STATE(idx, val) m_buttons[idx]->SetState(disable_gesture ? false:val);
#define SET_VALUE(idx, val) m_buttons[idx]->SetValue(disable_gesture ? 0.0f:val);
#define SET_STATE(idx, val) m_buttons[idx]->SetState(disable_gesture ? false:val);

SET_VALUE(IB_TriggerValue, values[CGestureMatcher::HGS_Trigger]);
SET_STATE(IB_TriggerClick, values[CGestureMatcher::HGS_Trigger] >= 1.0f);
//m_buttons[IB_TriggerValue]->SetValue(values[CGestureMatcher::HGS_Trigger] && !disable_gesture);
//m_buttons[IB_TriggerClick]->SetState(values[CGestureMatcher::HGS_Trigger] >= 1.0f && !disable_gesture);
if (values[CGestureMatcher::HGS_TrackpadClick] == 0.0f) {
SET_VALUE(IB_TriggerValue, values[CGestureMatcher::HGS_Trigger]);
SET_STATE(IB_TriggerClick, values[CGestureMatcher::HGS_Trigger] >= 1.0f);
}
else {
SET_VALUE(IB_TriggerValue, 0.0f);
SET_STATE(IB_TriggerClick, false);
}


SET_VALUE(IB_GripValue, values[CGestureMatcher::HGS_Hold]);
SET_STATE(IB_GripTouch, gestures[CGestureMatcher::HG_EmptyHold]);
SET_VALUE(IB_GripForce, gestures[CGestureMatcher::HG_SolidHold]);

//m_buttons[IB_GripValue]->SetValue(values[CGestureMatcher::HGS_Hold]);
//m_buttons[IB_GripTouch]->SetState(gestures[CGestureMatcher::HG_EmptyHold]);
//m_buttons[IB_GripForce]->SetValue(gestures[CGestureMatcher::HG_SolidHold]);

//// m_buttons[IB_TrackpadTouch]->SetState(l_gestures[CGestureMatcher::HG_ThumbPress] >= 0.5f);
//// m_buttons[IB_TrackpadForce]->SetState((l_gestures[CGestureMatcher::HG_ThumbPress] >= 0.5f) ? (l_gestures[CGestureMatcher::HG_ThumbPress] - 0.5f) *2.f : 0.f);
//// if(l_gestures[CGestureMatcher::HG_ThumbPress] >= 0.5f)
//// {
//// m_buttons[IB_TrackpadX]->SetValue(l_gestures[CGestureMatcher::HG_PalmPointX]);
//// m_buttons[IB_TrackpadY]->SetValue(l_gestures[CGestureMatcher::HG_PalmPointY]);
//// }
//// else
//// {
//// m_buttons[IB_TrackpadX]->SetValue(0.f);
//// m_buttons[IB_TrackpadY]->SetValue(0.f);
//// }

SET_STATE(IB_TrackpadTouch, trackpadTouched);
SET_STATE(IB_TrackpadTouch, values[CGestureMatcher::HGS_TrackpadX] != 0.0f && values[CGestureMatcher::HGS_TrackpadY] != 0.0f);
SET_STATE(IB_TrackpadForce, values[CGestureMatcher::HGS_TrackpadClick]);
SET_VALUE(IB_TrackpadX, values[CGestureMatcher::HGS_TrackpadX]);
SET_VALUE(IB_TrackpadY, values[CGestureMatcher::HGS_TrackpadY]);

//m_buttons[IB_TrackpadTouch]->SetState(trackpadTouched);
//m_buttons[IB_TrackpadForce]->SetState(values[CGestureMatcher::HGS_TrackpadClick]);
//m_buttons[IB_TrackpadX]->SetValue(values[CGestureMatcher::HGS_TrackpadX]);
//m_buttons[IB_TrackpadY]->SetValue(values[CGestureMatcher::HGS_TrackpadY]);


SET_STATE(IB_ThumbstickTouch, thumbstickTouched);
SET_STATE(IB_ThumbstickTouch, values[CGestureMatcher::HGS_ThumbstickClick]);
SET_STATE(IB_ThumbstickClick, values[CGestureMatcher::HGS_ThumbstickClick]);
SET_VALUE(IB_ThumbstickX, values[CGestureMatcher::HGS_ThumbstickX]);
SET_VALUE(IB_ThumbstickY, values[CGestureMatcher::HGS_ThumbstickY]);

//m_buttons[IB_ThumbstickTouch]->SetState(thumbstickTouched);
//m_buttons[IB_ThumbstickClick]->SetState(values[CGestureMatcher::HGS_ThumbstickClick]);
//m_buttons[IB_ThumbstickX]->SetValue(values[CGestureMatcher::HGS_ThumbstickX]);
//m_buttons[IB_ThumbstickY]->SetValue(values[CGestureMatcher::HGS_ThumbstickY]);


////m_buttons[IB_SystemTouch]->SetState(l_gestures[CGestureMatcher::HG_OpisthenarTouch] >= 0.5f);
////m_buttons[IB_SystemClick]->SetState(l_gestures[CGestureMatcher::HG_OpisthenarTouch] >= 0.75f);

SET_STATE(IB_BTouch, gestures[CGestureMatcher::HG_IndexTouch]);
SET_STATE(IB_BClick, gestures[CGestureMatcher::HG_IndexTouch]);
SET_STATE(IB_ATouch, gestures[CGestureMatcher::HG_PinkyTouch]);
SET_STATE(IB_AClick, gestures[CGestureMatcher::HG_PinkyTouch]);

//m_buttons[IB_BTouch]->SetState(gestures[CGestureMatcher::HG_IndexTouch] );
//m_buttons[IB_BClick]->SetState(gestures[CGestureMatcher::HG_IndexTouch] );
//m_buttons[IB_ATouch]->SetState(gestures[CGestureMatcher::HG_PinkyTouch] );
//m_buttons[IB_AClick]->SetState(gestures[CGestureMatcher::HG_PinkyTouch] );
//{

SET_STATE(IB_SystemTouch, values[CGestureMatcher::HGS_PalmTouch] >= 1.0f);
SET_STATE(IB_SystemClick, values[CGestureMatcher::HGS_PalmTouch] >= 1.0f);
//m_buttons[IB_SystemTouch]->SetState(values[CGestureMatcher::HGS_PalmTouch] >= 1.0f);
//m_buttons[IB_SystemClick]->SetState(values[CGestureMatcher::HGS_PalmTouch] >= 1.0f);

// // m_buttons[IB_BTouch]->SetState(l_gestures[CGestureMatcher::HG_ThumbPinkyTouch] >= 0.5f);
// // m_buttons[IB_BClick]->SetState(l_gestures[CGestureMatcher::HG_ThumbPinkyTouch] >= 0.75f);

// // m_buttons[IB_ATouch]->SetState(l_gestures[CGestureMatcher::HG_ThumbMiddleTouch] >= 0.5f);
// // m_buttons[IB_AClick]->SetState(l_gestures[CGestureMatcher::HG_ThumbMiddleTouch] >= 0.75f);

// m_buttons[IB_BTouch]->SetState(l_controls[CControlMatcher::CT_KeyDown_B] == 1.0f);
// m_buttons[IB_BClick]->SetState(l_controls[CControlMatcher::CT_KeyDown_B] == 1.0f);
//
// m_buttons[IB_ATouch]->SetState(l_controls[CControlMatcher::CT_KeyDown_A] == 1.0f);
// m_buttons[IB_AClick]->SetState(l_controls[CControlMatcher::CT_KeyDown_A] == 1.0f);
//
//}

//// m_buttons[IB_ThumbstickTouch]->SetState(l_gestures[CGestureMatcher::HG_ThumbCrossTouch] >= 0.5f);
//// m_buttons[IB_ThumbstickClick]->SetState(l_gestures[CGestureMatcher::HG_ThumbCrossTouch] >= 0.75f);
//m_buttons[IB_ThumbstickTouch]->SetState(l_controls[CControlMatcher::CT_RockerPress] >= 0.75f);
//m_buttons[IB_ThumbstickClick]->SetState((l_controls[CControlMatcher::CT_RockerPress] >= 0.75f) ? (l_controls[CControlMatcher::CT_RockerPress] - 0.75f) *4.f : 0.f);
//m_buttons[IB_ThumbstickX]->SetValue(l_controls[CControlMatcher::CT_RockerX]);
//m_buttons[IB_ThumbstickY]->SetValue(l_controls[CControlMatcher::CT_RockerY]);

//m_buttons[IB_FingerIndex]->SetValue(l_gestures[CGestureMatcher::HG_IndexBend]);
//m_buttons[IB_FingerMiddle]->SetValue(l_gestures[CGestureMatcher::HG_MiddleBend]);
//m_buttons[IB_FingerRing]->SetValue(l_gestures[CGestureMatcher::HG_RingBend]);
//m_buttons[IB_FingerPinky]->SetValue(l_gestures[CGestureMatcher::HG_PinkyBend]);

// ÊÖÖ¸»ù±¾Êý¾Ý´«¸øÓÎÏ·
for(size_t i = 0U; i < 5U; i++)
{
const LEAP_DIGIT &l_finger = f_hand->digits[i];
Expand Down
80 changes: 43 additions & 37 deletions driver_leap/Utils/CGestureMatcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ void CGestureMatcher::GetGestures(const LEAP_HAND* f_hand, std::map<HandGesture,
static_value[i] = 0.0f;
}

printf("reset\n");
printf("[%d] reset\n", f_hand->type);
}
}
else {
Expand Down Expand Up @@ -105,34 +105,33 @@ void CGestureMatcher::GetGestures(const LEAP_HAND* f_hand, std::map<HandGesture,
if (f_oppHand) {

std::map<HandGesture, bool>& static_gesture2 = static_lr_gestures[f_oppHand->type];
std::vector<float>& static_value2 = static_lr_values[f_oppHand->type];
if (static_value2.size() == 0) {
static_value2.resize(HGS_MAX);
for (int i = 0; i < static_value2.size(); i++) {
static_value2[i] = 0.0f;
}
}

// 副手食指触摸 + 主手指向
if (static_gesture2[HG_EmptyHold]) {
//std::vector<float>& static_value2 = static_lr_values[f_oppHand->type];
//if (static_value2.size() == 0) {
// static_value2.resize(HGS_MAX);
// for (int i = 0; i < static_value2.size(); i++) {
// static_value2[i] = 0.0f;
// }
//}

// 副手握拳 + 主手指向
if (static_gesture2[HG_EmptyHold] || static_gesture2[HG_SolidHold]) {

if (static_gesture[HG_Point]) {

// 取副手手掌中心作为移动点
auto vec = GetVector(f_oppHand, P_Palm);
glm::vec3 l_start(vec.x, vec.y, vec.z);

if (static_value2[__HGS_TrackpadX] == 0.0f && static_value2[__HGS_TrackpadY] == 0.0f) {
if (static_value[__HGS_TrackpadX] == 0.0f && static_value[__HGS_TrackpadY] == 0.0f) {

// printf("触摸重置 \n");
printf("[%d] 触摸重置 \n", f_oppHand->type);

static_value2[__HGS_TrackpadX] = l_start.x;
static_value2[__HGS_TrackpadY] = l_start.y;
static_value[__HGS_TrackpadX] = l_start.x;
static_value[__HGS_TrackpadY] = l_start.y;
}
else {
// // 计算与中心点的角度
const float length = 25.0f;
glm::vec2 l_uv(-(l_start.x - static_value2[__HGS_TrackpadX]), l_start.y - static_value2[__HGS_TrackpadY]);
glm::vec2 l_uv(-(l_start.x - static_value[__HGS_TrackpadX]), l_start.y - static_value[__HGS_TrackpadY]);

l_uv /= 25.0f;

Expand All @@ -141,8 +140,8 @@ void CGestureMatcher::GetGestures(const LEAP_HAND* f_hand, std::map<HandGesture,
if (glm::length(l_uv) > 1.f)
l_uv = glm::normalize(l_uv);

static_value2[__HGS_TrackpadX2] = l_uv.x;
static_value2[__HGS_TrackpadY2] = l_uv.y;
static_value[HGS_TrackpadX] = l_uv.x;
static_value[HGS_TrackpadY] = l_uv.y;
}

// 副手扣动扳机作为触摸板点击
Expand All @@ -154,56 +153,63 @@ void CGestureMatcher::GetGestures(const LEAP_HAND* f_hand, std::map<HandGesture,
}

// 副手实心握 + 主手指向
if (static_gesture2[HG_SolidHold]) {
if (static_gesture[HG_Point]) {

if (static_gesture[HG_Point]) {
if (static_gesture2[HG_Point] || !(static_value[__HGS_ThumbstickX] == 0.0f && static_value[__HGS_ThumbstickY] == 0.0f)) {

// 取副手手掌中心作为移动点
auto vec = GetVector(f_oppHand, P_Palm);
auto vec = GetVector(f_hand, P_Palm);
glm::vec3 l_start(vec.x, vec.y, vec.z);

if (static_value2[__HGS_ThumbstickX] == 0.0f && static_value2[__HGS_ThumbstickY] == 0.0f) {
if (static_value[__HGS_ThumbstickX] == 0.0f && static_value[__HGS_ThumbstickY] == 0.0f) {

// printf("触摸重置 \n");
printf("[%d] 摇杆重置 \n", f_hand->type);

static_value2[__HGS_ThumbstickX] = l_start.x;
static_value2[__HGS_ThumbstickY] = l_start.y;
static_value[__HGS_ThumbstickX] = l_start.x;
static_value[__HGS_ThumbstickY] = l_start.y;
}
else {
// // 计算与中心点的角度
const float length = 25.0f;
glm::vec2 l_uv(-(l_start.x - static_value2[__HGS_ThumbstickX]), l_start.y - static_value2[__HGS_ThumbstickY]);
glm::vec2 l_uv(-(l_start.x - static_value[__HGS_ThumbstickX]), l_start.y - static_value[__HGS_ThumbstickY]);

l_uv /= 35.0f;
l_uv /= 35.0f + 20;

glm::vec2 old_uv = l_uv;

if (glm::length(l_uv) > 1.f)
l_uv = glm::normalize(l_uv);

static_value2[__HGS_ThumbstickX2] = l_uv.x;
static_value2[__HGS_ThumbstickY2] = l_uv.y;
static_value[HGS_ThumbstickX] = l_uv.x;
static_value[HGS_ThumbstickY] = l_uv.y;

printf("[%d] 摇杆设置 %.2f, %.2f \n", f_hand->type, static_value[HGS_ThumbstickX], static_value[HGS_ThumbstickY]);
}

// 副手扣动扳机作为触摸板点击
static_value[HGS_ThumbstickClick] = static_value[HGS_Trigger] >= 1.0f;

// 禁用副手手势
static_gesture2[__HG_Disable] = true;
//static_gesture2[__HG_Disable] = true;
}
}


static_value[HGS_TrackpadX] = static_value2[__HGS_TrackpadX2];
static_value[HGS_TrackpadY] = static_value2[__HGS_TrackpadY2];
//static_value[HGS_TrackpadX] = static_value[__HGS_TrackpadX2];
//static_value[HGS_TrackpadY] = static_value[__HGS_TrackpadY2];

static_value[HGS_ThumbstickX] = static_value2[__HGS_ThumbstickX2];
static_value[HGS_ThumbstickY] = static_value2[__HGS_ThumbstickY2];
// 摇杆存储在自身
//static_value[HGS_ThumbstickX] = static_value[__HGS_ThumbstickX2];
//static_value[HGS_ThumbstickY] = static_value[__HGS_ThumbstickY2];
}

gestures = static_gesture;
values = static_value;

// 扳机键功能互斥
/*if (values[HGS_TrackpadClick]) {
values[HGS_Trigger] = 0.0f;
}*/

if (values[HGS_ThumbstickClick]) {
values[HGS_Trigger] = 0.0f;
}
Expand Down
8 changes: 4 additions & 4 deletions driver_leap/Utils/CGestureMatcher.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,14 @@ class CGestureMatcher
__HGS_TrackpadX,
__HGS_TrackpadY,

__HGS_TrackpadX2,
__HGS_TrackpadY2,
//__HGS_TrackpadX2,
//__HGS_TrackpadY2,

__HGS_ThumbstickX,
__HGS_ThumbstickY,

__HGS_ThumbstickX2,
__HGS_ThumbstickY2,
//__HGS_ThumbstickX2,
//__HGS_ThumbstickY2,

__HGS_DisableTrigger,

Expand Down
Loading

0 comments on commit cebc8bd

Please sign in to comment.