作为我的太阳系计划的一部分,一切都得到了很好的实施和说法,我试图扩展我的程序,包括用户可以绕着奥里飞行或换句话说,从太空飞船中观看飞行通过使用方向键。这就是我基本上做的:
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 27: /* Escape key */
exit(0);
break;
case (GLUT_KEY_LEFT): lon += TURN_ANGLE;
if(lon == 360)
lon = 0;
break;
case (GLUT_KEY_RIGHT):
lon -= TURN_ANGLE;
if(lon == -360)
lon = 0;
break;
case (GLUT_KEY_PAGE_UP):
if(lat + TURN_ANGLE <= 90)
lat += TURN_ANGLE;
break;
case (GLUT_KEY_UP): eyex += sin(DEG_TO_RAD * (lon)) * RUN_SPEED;
eyez += cos(DEG_TO_RAD * (lon)) * RUN_SPEED;
break;
case (GLUT_KEY_DOWN): eyex -= sin(DEG_TO_RAD * (lon)) * RUN_SPEED;
eyez -= cos(DEG_TO_RAD * (lon)) * RUN_SPEED;
break;
default: break;
}
}
其中lat
和lon
是与当前视点(eyex
,eyey
,eyez
)一起使用的全局角度,以及
距离XZ平面中的步距RUN_SPEED
。我不知道为什么这部分不工作,即使我没有在这部分得到任何错误所有编译文件但箭头键不起作用。有帮助吗?
答案 0 :(得分:2)
使用glutKeyboardFunc()
,您只能捕获简单的ASCII字母,以便响应设置单独事件处理程序所需的其余键:glutSpecialFunc()
。
请注意,特殊处理程序的签名稍有改变:
void special(int key, int x, int y)
{
switch (key)
{
case GLUT_KEY_LEFT: lon += TURN_ANGLE;
if(lon == 360)
lon = 0;
break;
/* ... */
default: break;
}
}
请记住,这个特殊的处理程序不替换您一直在使用的键盘处理程序,它只是补充它。