我正在尝试使用Reactive Extensions for Unity(UniRX,与Unity 4.5兼容的Reactive Extension的重新实现)进行手势识别。有一个简单的例子,但它使用了一个非常简单的手势。
我已经编写了在IObservable中生成特征向量流的逻辑。
我想实现看起来像";看一个IOobservable。当(初始条件发生)时,除非(取消/中止条件),否则在(完全条件发生)之后发出手势事件"
我可以为每一组条件编写RX表达式,但将它们链接在一起以使它们以这种方式发挥作用对我来说并不明显
即:
// initial condition -- passes events through if hand more open than some threshold, and closing
handStream
.Buffer(2, 1)
.Where(h => h[0].pinchStrength > m_openThresh)
.Where(h => h[0].pinchStrength > h[1].pinchStrength)
或
// end condition -- passes event through if hand more closed than some threshold
handStream
.Where(h => h[0].pinchStrength < m_pinchThresh)
但第二个表达式没有意义,除非在以前的某个时间满足了第一个条件。
我应该如何处理这件事?
您似乎需要对以下查询进行某种变体:
var query =
handStream
.Buffer(2, 1)
.Publish(bhs =>
bhs
.Where(h => /* start condition */)
.Select(h =>
bhs
.Where(x => /* values to return */)
.TakeUntil(
bhs
.Where(x => /* stop condition */))))
.Switch();
这基本上是寻找开始条件,然后返回一个可观察的值,该值将返回您感兴趣的值,直到停止条件出现。.Switch()
方法"切换"到返回的最后一个可观测值(关闭前一个)。这个操作员非常强大,值得一试。
根据您的初始流,您可能需要也可能不需要.Publish(...)
运算符。