作为一项实验,我已经设置了一组连接到电机的模拟齿轮,并使用OpenGL / GLUT进行渲染。目前,有线网络的唯一输入是Time
。我想用键盘来控制电机的速度变化。我还想将物理时间步长从帧速率中分离出来,如Fix your Timestep!中所述。
这意味着我需要使用三种不同类型的输入从三个不同的GLUT回调(keyboardMouseCallback
,idleCallback
和displayCallback
)运行Wire网络。我不清楚如何将Netwire与GLUT回调集成。
答案 0 :(得分: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)
答案 1 :(得分:1)
你考虑过......不这样做吗?
没有法律规定你必须使用(免费)GLUT。 GLFW(几乎)有能力,它允许您根据需要控制渲染循环。这是一个基于轮询的API,因此任何回调只会在您需要时才会发生。