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),但实际上在边缘处检测精度较低。
实际应用中采用下图方式进行交互:
则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?