
5月底的时候,用Leap Motion模拟了一下鼠标。用很简单的代码实现了比较简单粗糙的功能(移动,左键单击和右键单击)。基本上是能满足最简单的操作了,但是由于精度太高,过于灵敏,使得特别容易误操作。
当然我的最终目的并不是做出一个鼠标来,因为那样手实在太累了。官方博客里曾经有一篇写给开发者和用户的文章,大体内容是在说,这个设备能做的事远远超过简单的鼠标操作和触屏操作,所以不要把思维限制在这上面。想想,说的很对。就这设备目前能做得东西已经远远超过鼠标和触摸屏,但是很多操作体验上远远不如这两者好用。
进入正题,简单说一下这个鼠标的功能是怎么实现的。
1.模拟鼠标移动(MOVE)
a.先获取特定手指映射在屏幕上的坐标。
b.利用Windows API的mouse_event()函数,让鼠标进行绝对位移移动到相应的屏幕位置。
1 2 3 4 5 6 7 8 9 10 11 |
PointableList pointables = controller.frame().pointables(); InteractionBox iBox = controller.frame().interactionBox(); for( int p = 0; p < pointables.count(); p++ ) { Pointable pointable = pointables[p]; Vector normalizedPosition = iBox.normalizePoint(pointable.stabilizedTipPosition()); float x = normalizedPosition.x * 65535; float y = 65535 - normalizedPosition.y * 65535; mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE,x,y,0,0); /*......*/ } |
2.模拟鼠标左键单击(LEFT)
a.检测手指Touch Distance的值(即手指离触摸仿真面的距离,值域[-1,+1])。
b.若touchDistance()<=0,执行mouse_event()里的LEFTDOWN,模拟鼠标左键按下。
c.若touchDistance()>0,执行mouse_event()里的LEFTUP,模拟鼠标左键松开。
1 2 3 4 5 6 7 8 9 10 |
if(pointable.touchDistance() <= 0 && mouse_S==0) { mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,x,y,0,0); mouse_S=1; } else if(pointable.touchDistance() > 0 && mouse_S==1) { mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,x,y,0,0); mouse_S=0; } |
3.模拟鼠标右键单击(RIGHT)
检测到Circle手势时,在Circle手势的圆心坐标处执行mouse_event()里的RIGHTDOWN和RIGHTUP。
1 2 3 4 5 6 7 8 9 10 |
if (circle.pointable().direction().angleTo(circle.normal()) <= PI/4) { clockwiseness = "clockwise"; } else { clockwiseness = "counterclockwise"; float Rx = circle.center().x * 65535; float Ry = 65535 - circle.center().y * 65535; mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTDOWN,Rx,Ry,0,0); mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTUP,Rx,Ry,0,0); Sleep(1000); } |
如无注明,均为原创。转载请注明: 转载自MITGAI`S THINKING
本文链接地址: Leap Mouse – Qt Sample
本文链接地址: Leap Mouse – Qt Sample
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
如果本文对您生活或工作产生了积极影响,那我非常高兴。
如果您愿意为文章的内容或想法提供支持,欢迎点击下边的捐赠按钮,资助作者创作更多高价值高品质的内容。
如果您愿意为文章的内容或想法提供支持,欢迎点击下边的捐赠按钮,资助作者创作更多高价值高品质的内容。