Spark ARでウィンクを実装する
EXORを使ったウィンクの制御。
ウィンクが出来てるかどうかはここでは議論しない。#SparkAR #ブログ用 pic.twitter.com/VcV7OHl48u— コバヤシマサト (@kobax_km7) August 20, 2019
問題点
現在,Spark ARには目の状態を検出する関数として,”Left Eye Closed”と”Right Eye Closed”が実装されている.
一見,この関数だけで簡単にウィンクが実装出来そうだが,両目を閉じたときにも反応してしまうため,普通の瞬きにも反応してしまう問題がある.
排他的論理和で解決
今回実装するウィンクに求められる仕様は以下の表の通り. この仕様を満たす論理演算を考えると,排他的論理和(EXOR:Exclusive OR)と同値であることがわかる.
もっとスマートな方法はあるかもしれないがとりあえず,この方法で解決.
左目 | 右目 | ウィンクか否か | 論理値 |
---|---|---|---|
0 | 0 | ❌ | 0 |
0 | 1 | ⭕️ | 1 |
1 | 0 | ⭕️ | 1 |
1 | 1 | ❌ | 0 |
※0=開眼,1=閉眼
論理演算の世界ではEXORはよく使われるので,それ相応の関数が用意されていることが多いがSpark ARには用意されていないので自分でEXORを実装する.
EXORは色々な組み合わせで作ることができるが,今回はWikipediaにあったこの回路を参考に実装.
入力Aが左目の状態,入力Bが右目の状態として,出力がウィンクしたかどうか.
これをSpark ARのPatchで実装するとこんな感じ.