作为我的太阳系计划的一部分,一切都实现得很好,我试图扩展我的程序,以包括用户可以绕太阳系飞行,或者换句话说,通过使用方向键。这就是我基本上所做的:
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
步距。我不知道为什么这部分不起作用,即使我在这部分所有编译文件中没有收到任何错误,但箭头键不起作用。有什么帮助吗?
最佳答案
使用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;
}
}
请记住,这个特殊的处理程序不会取代您一直在使用的键盘处理程序,它只是对其进行补充。
关于c - 在openGL程序中实现太阳能系统中的方向键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10236262/