Leap Motion API仅支持四种标准手势:圆形,轻扫,按键和屏幕分接。在我的应用程序中,我需要其他手势,但我不知道如何添加手势,或者甚至可以添加更多手势。我阅读了API,这没有帮助。如何实现非标准的Leap Motion手势?
在我的应用程序中,我想允许用户保存一个对象并将其拖动。这可以使用Leap Motion API吗?如果是这样,我该怎么做?
Leap Motion API仅支持四种标准手势:圆形,轻扫,按键和屏幕分接。在我的应用程序中,我需要其他手势,但我不知道如何添加手势,或者甚至可以添加更多手势。我阅读了API,这没有帮助。如何实现非标准的Leap Motion手势?
在我的应用程序中,我想允许用户保存一个对象并将其拖动。这可以使用Leap Motion API吗?如果是这样,我该怎么做?
您需要创建自己的方法来识别手势的起点,过程和终点。
开始点: 您的程序如何识别您正在尝试持有的东西?我能想到的一个简单的手势是2个手指与1个手掌相连。因此,在框架中,如果您看到两个手指与一个手掌相连并且手指距离相距10-20 mm,则您可以将其识别为一种握住某物的手势。当这些条件满足时,程序将识别该手势,并且可以在这些条件内编写一些代码。
对于一个非常难看例如在C#:
起点: 布尔gesture_detected = FALSE;
Frame frame = controller.Frame();
HandList hands = controller.Hands;
if (hands.Count == 1)
{
foreach (Hand hand in hands)
{
if (hand.fingers.Count == 2)
{
int fingerA_x,fingerB_x;
foreach (Finger finger in hand.fingers)
{
if(fingerA_x == 0)
{
fingerA_x = finger.x;
} else
{
fingerB_x = finger.x;
}
}
}
}
if((fingerA_x - fingerB_x) < 20)
{
//Gesture is detected. Do something...
gesture_detected = true;
}
}
过程: 你的手势试图做什么?如果你想移动,你将不得不调用鼠标方法来进行拖动。使用事件MOUSEEVENTF_LEFTDOWN在PInvoke下的C++中搜索mouse_event()方法。
终点: 您完成拖动后,你需要调用像MOUSEEVENTF_LEFTUP鼠标事件的方法来模拟已完成鼠标拖动。但是,您的程序如何检测何时应该停止拖动?最合乎逻辑的方式是如果手势不再在帧中被检测到。所以编写一个条件来处理备用方案。
if (!gesture_detected)
{
// Do something
}
有没有在某个时间点怀疑自己,如果有必要,以定义自定义类与其他的API来获得一些大跃进运动CLASSE(S),原来你没有。下面是C++中的一个简短例子,即Leap Motion本地语言,自定义手势定义,Lift手势,将空中的所有运动物体提升到空中。
手势定义需要2个可见的手,两个手掌均向上打开并向上移动速度低于预定义的(当前不推荐的)Leap Motion轻扫手势,因此在滑动在Leap Motion回调函数void GestureListener::onConnect(const Leap::Controller& controller)
的启动过程中启用了手势。
从示例中可以看出,手势定义对双手的法线和速度施加了约束,因此它不会随机检测到,但也不会太多,所以仍然可以在合理的努力下执行。
// lift gesture: 2 hands open flat, both palms up and moving up slowly
void LeapMotion::liftGesture(int numberHands, std::vector<glm::vec3> palmNormals, std::vector<glm::vec3> palmVelocities) {
if ((numberHands == 2) &&
(palmNormals[0].x < 0.4f) && (palmNormals[1].x < 0.4f) &&
(palmNormals[0].y > 0.9f) && (palmNormals[1].y > 0.9f) &&
(palmNormals[0].z < 0.4f) && (palmNormals[1].z < 0.4f) &&
(palmVelocities[0].z > 50.0f) && (palmVelocities[1].z > 50.0f) &&
(palmVelocities[0].z < 300.0f) && (palmVelocities[1].z < 300.0f)) {
m_gesture = LIFT;
logFileStderr(VERBOSE, "\nLift gesture...\n");
}
}
第一:你用什么语言开发?你必须准确研究你手势的x/y/z轴,并分析它们。 – Larme
Larme说,你需要提供更多的信息给我们来帮助你。您使用哪种Leap Motion API(JS,Objective-C等)?你如何让人们握住这个物体(手指,抓握手)?另外,你应该阅读你提供的文本,而不是试图通过粘贴到你的问题来游戏系统。 –
好的,我重写了你的问题,并在最后清除了垃圾。它仍然有点宽泛,但它更接近于负责任。不过,它仍然有助于获得更多的细节。 –