【发布时间】:2012-09-08 02:15:41
【问题描述】:
设置:
我正在使用 Reactive Banana 和 OpenGL,并且我有一个想要旋转的齿轮。我有以下信号:
bTime :: Behavior t Int -- the time in ms from start of rendering
bAngularVelosity :: Behavior t Double -- the angular velocity
-- which can be increase or
-- decreased by the user
eDisplay :: Event t () -- need to redraw the screen
eKey :: Event t KeyState -- user input
最终,我需要计算bAngle,然后将其传递给绘图函数:
reactimate $ (draw gears) <$> (bAngle <@ eDisp)
角度容易计算:a = ∫v(t) dt
问题:
我认为我想做的是将这个积分近似为每个电子显示事件的a = ∑ v Δt(或者如果需要,可以更频繁地)。这是解决这个问题的正确方法吗?如果是这样,我如何从bTime 获得Δt?
另见:
我怀疑答案使用了mapAccum 函数。如果是这样,也请参阅my other question。
【问题讨论】:
-
如果您愿意,您可以通过让用户更改 bTime 的间隔来避免计算,就像 github.com/HeinrichApfelmus/reactive-banana/blob/master/…> 示例一样。
-
@AndrewC,我猜this是你想要的链接?
-
是的。 。缺点:低速时抖动,高速时图形引擎过载,丑陋。我收回我的建议:使用角速度要优雅得多。
-
我应该明确指出
bTime是挂钟时间。 AndrewC,你的第一个解决方案是原始 OpenGL 作者所做的,它确实不流畅,尤其是在处理键盘/鼠标输入时。