【问题标题】:Connecting a Netwire network to OpenGL/GLUT Callbacks将 Netwire 网络连接到 OpenGL/GLUT 回调
【发布时间】:2023-07-22 17:08:02
【问题描述】:

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

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

【问题讨论】:

    标签: haskell glut frp


    【解决方案1】:

    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)
    

    【讨论】:

      【解决方案2】:

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

      没有法律规定您必须使用(免费)GLUT。 GLFW(几乎)具有同样的能力,它允许您随心所欲地控制渲染循环。它是一个基于轮询的 API,因此任何回调只会在您希望它们发生时发生。

      【讨论】:

      • 是的,我有。但是我已经有很多 GLUT 的经验,而且我只是在学习 Netwire。如果可能的话,我想坚持我所知道的。