Leap Motion开发(二)OpenGL绘制手部位置

Main函数代码 实现后待插入
文件名及文件路径在此写入 
并且在文件处ReadMe.txt里键入本篇文章的链接

接下来对代码中需要注意的一些点进行说明。

1. 代码配置的问题

程序包含了GLutils和ExampleConnection的头文件,在Main.cpp里完成主要功能的实现。
在进行环境配置的时候,需要包含glew、glut,但是配置时总是出现链接错误(应该是lib的问题),更改相关文件的x64、x86架构无效,换别的glew库、包含文件依旧报这个错误,最后换成老师提供的OpenGL example文件夹里的glew才不报错误,但是实际运行后窗口是黑色的,将架构改为Debug Win32后解决。

2. 功能说明

采用GLUT实现了窗口、手部节点的绘制及回调。在其中绘制茶壶,并获取手部关节的数据,若frame->nHands的数量大于0,则绘制所有hand的手部节点,每个手的节点包括胳膊节点2,手掌节点1,手指关节54,共计23个节点。

3. 关于GLUT的回调函数

程序中使用的回调函数包括:

glutIdleFunc()  // 闲时回调函数,本代码中基本用不到
glutReShapeFunc()   //  允许窗口的改变,若无本回调函数,窗口无法移动、改变
glutKeyboardFunc()  // 键盘回调函数

以及最重要的回调函数:

glutDisplayFunc(displayFunc)

在此回调函数中完成主体的绘制,若不在回调函数displayFunc()中添加语句glutPostRedisplay();,则只绘制一次,添加则循环执行displayFunc()。

4. 从IR170到程序的坐标转换

IR170采用的坐标系同OpenGL,且坐标是与真实空间1:1的,单位是毫米,比如IR170获得的关节点坐标是(100,100,100),即是指该关节点的空间位置是在IR170所在空间的(10cm,10cm,10cm)处。
在实际应用中,IR170能检测到的空间范围大概是(-700,0,-700)~(700,700,700),但实际上在边缘处检测精度较低。
OpenGL / Stereo IR 170坐标系
实际应用中采用下图方式进行交互:请添加图片描述
则IR170坐标变为:请添加图片描述
则与程序坐标系进行比对得出,IR170检测出的局部空间坐标(x,y,z)在程序坐标中标示为(x,-z,y)。此外,代码中使用

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef(0, 0, -800); //"Camera" viewpoint
// Painting...
glPopMatrix();

利用GLTranslatef将模型移动到(0,0,-800)位置处(向屏幕外为正),则模型放置在Z轴-800处,而观察平面相当于z=1(在gluPerspective()中设置),手离IR170越近,palm.position.y越小,则model手在虚拟空间中z轴的位移为palm.position.y越小,则离观察平面(z=1)越远,model越小。以此实现了手离IR170越近,model手越小的效果。
若要实现手离IR170越近,model手越大的效果,则将IR170检测出的局部空间坐标(x,y,z)在程序坐标中标示为(x,-z,700-y)即可。

尚未解决的问题:

怎么在空间中指定位置绘制图形? done?
窗口比例不会影响图形的比例?
现在做的是离IR170越近的手越大,还是离IR170越远的手越大会好些呢?
模型的包围盒怎么获取?
怎么判断手的位置和模型的位置的关系?掌心position进入到模型的包围盒且手的grabstrengh>0.5?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值