0

作为实验,我设置了一组模拟齿轮连接到电机并使用 OpenGL/GLUT 渲染它们。目前,Wire 网络的唯一输入是Time. 我想用键盘来控制改变电机的速度。我还想将物理时间步从帧速率中分离出来,如修复你的时间步中所述!.

这意味着我需要使用三种不同类型的输入从三个不同的 GLUT 回调(、、和)keyboardMouseCallback运行idleCallbackWire网络。displayCallback我不清楚如何将 Netwire 与 GLUT 回调集成。

4

2 回答 2

3

GLUT 对需要控制主循环的框架(例如 Netwire)有点敌意。这是可能的,但您可能必须使用 IORef 或类似的东西。我所知道的对 Netwire 最友好的 OpenGL 管理器是 SDL,当然你也可以试试 Nicol 的 GLFW 建议。否则,您确实必须从多个事件处理程序中走出来。

为了处理实际的键盘输入,我建议您将事件信息添加到您正在使用的任何底层 monad(阅读器 monad 可能是最好的解决方案)。然后实现,比如说,keyDown每当按住给定键时产生一条线:

keyDown :: (Monoid e) => Key -> Wire e (Reader GuiState) a a

现在你可以做这样简单的事情:

position = integral_ 0 . speed
    where
    direction key dir = dir . keyDown key <|> 0
    speed = direction Right 1 + direction Left (-1)
于 2012-11-17T04:01:02.917 回答
1

你有没有考虑过……不这样做?

没有法律规定您必须使用(免费)GLUT。GLFW(几乎)同样有能力,它允许您根据需要控制渲染循环。它是一个基于轮询的 API,所以任何回调只会在你想要的时候发生。

于 2012-11-17T02:01:17.340 回答