>   >  Unityでつくるインタラクティブコンテンツ:第7回:プロジェクタのキャリブレーションをする
第7回:プロジェクタのキャリブレーションをする

第7回:プロジェクタのキャリブレーションをする

<2>ノイズ除去

しかし、触っていないのに環境にある凹凸を認識して物体があると認識してしまっているようです(Sceneエディタ上で確認しました)。


センサ周りの障害物を全てなくすことができれば一番ですが、状況によってはそれができないことがあります。今回は背景差分を取って回避しました。起動後にスペースバーを押すとその時点でのセンサ情報が保存され、以後認識された情報との差を取ります。こうすることで変化があったところだけがオブジェクトの認識候補になります。

さらにノイズ除去の処理としてメディアンフィルタを追加しました(URGSensor.cs 156行目から168行目)。メディアンフィルタはデータをなめすことなく細かなノイズを除去することができます。以下のコードは3つの距離データの中央値を使うメディアンフィルタの実装例です。filterSizeに指定する数を大きくすることでフィルタのかかり具合を変更できますが、数が大きくなるに従って処理は重くなります。


int filterSize = 3;
var tmp = new long[filterSize];
int mid = filterSize / 2;
for (int i = 0; i < this.Steps; i++)
{
    for (int n = 0; n < filterSize; n++)
    {
        var m = Math.Min(Math.Max(0, i + n - mid), this.Steps - 1);
        tmp[n] = Math.Abs(_distance[m] - _calib_distance[m]);
    }
    Array.Sort(tmp);
    _filtered_distance[i] = tmp[mid];
}

171行目からはボックスフィルタ、190行目からはフィルタなしの実装がコメントアウトされています。物体の認識が安定したところで、手を認識した場所に花を表示してみます。

動作の様子

花の素材はAdobe Stockを利用しています、花のアニメーションはDOTweenアセットでつけています。このアセットはスクリプトからアニメーションを付けるときにとても便利なものです。

花を咲かせ5秒後に閉じるアニメーションの部分は以下のように書けます。プログラムだけで簡単に書くことができるので、Timelineよりも便利な場面もあります(URGSensorView.cs 124行目から)。


void Bloom(int n, Vector3 p)
{
        _spawn[n] = GameObject.Instantiate(_flowers[n % _flowers.Length], p, Quaternion.identity);
        _spawn[n].transform.localScale = Vector3.zero;

        var seq = DOTween.Sequence();
        seq.Append(_spawn[n].transform.DOScale(Vector3.one * 0.25f, 0.5f));
        seq.Join(_spawn[n].transform.DOShakeRotation(0.5f, 30f));
        seq.AppendInterval(5f);
        seq.Append(_spawn[n].transform.DOScale(Vector3.zero, 1f));
        seq.Join(_spawn[n].transform.DOShakeRotation(1f, -30f));
        seq.OnComplete(() => {
            GameObject.Destroy(_spawn[n]);
            _spawn[n] = null;
        });
}

コンテンツでの測域センサの使い方はこのような感じです。実際のコンテンツでは死角をなくすため複数の測域センサを利用するケースがあります。その場合はもう少し工夫が必要になってきますが、基本的な考え方は同じです。

次回はゲーム筐体でよく使われる押しボタンをUnityで使ってみます。できることはキーボードやマウスのボタンと同じですが、何らかの形でPCにボタンが押されたことを通知する必要があります。その方法を考えてみたいと思います。



Profile.

高田稔則/Toshinori Takata(Codelight)
Codelight株式会社 代表取締役・インタラクションエンジニア
フリーランス、株式会社TBSテレビ等で映画CG制作、株式会社ソニー・コンピュータエンタテインメント(現 ソニー・インタラクティブエンタテインメント)でPS4のOSD開発などを経て2006年にCodelight株式会社を設立。インタラクティブコンテンツの制作を中核として、製造業向けのプロトタイプ開発なども行う
www.codelight.co.jp




その他の連載