プロジェクションマッピング実例と応用


リアルタイムにトラッキング

 先日公開されたお仕事ですが、”Driving kids with TOYOTA”での企画で、kzさんとのコラボレーションMVに使われれた映像演出の送出システムを開発しました。

 車に再帰性反射材のマーカーを付けて、車の位置をトラッキングしながらその周りで映像が展開するという演出です。車のトラッキングには、6台のoptiTrackを15mの高さから吊り下げてセンシングをしています。

optiTrackとは赤外線による光学式モーションキャプチャで、複数台を連携させて高い精度とfpsでマーカーの位置が取得できるデバイスです。

QuadWarp的なことを自分でやってみる

 プロジェクションと実際の位置の平面的な対応を合わせるためには、”ホモグラフィ行列”と呼ばれる物を使います。

cv::Mat homography;
vector<ofxCv::Point2f> srcPoints, dstPoints;

for (int i = 0;i < homoPts.size();i++){
srcPoints.push_back(ofxCv::Point2f(homoPts[i].src.x,homoPts[i].src.y));
dstPoints.push_back(ofxCv::Point2f(homoPts[i].dst.x,homoPts[i].dst.y));
}

homography = ofxCv::findHomography(ofxCv::Mat(srcPoints),ofxCv::Mat(dstPoints));

対応する2点の配列をそれぞれ用意して、findHomography関数を呼んであげる事でホモグラフィ行列が取得できます!

こうして3 x 3の行列が生成できたわけなのです。これに2次元のベクトルを適用してあげればすっと求まりますが、より深い理解のため、行列を元に自分で計算してみましょう。(それらしき関数が見つけられなかった)
なお射影変換の数学的理解はこの辺の方がきちんとした解説を書かれているので、是非参考に…!

ofVec2f src = ofVec2f(300,300);//変換したい任意の座標
ofVec2f dst;
double A = homography.at<double>(0,0);
double B = homography.at<double>(0,1);
double C = homography.at<double>(0,2);
double D = homography.at<double>(1,0);
double E = homography.at<double>(1,1);
double F = homography.at<double>(1,2);
double G = homography.at<double>(2,0);
double H = homography.at<double>(2,1);

dst.x = (src.x * A + src.y * B + C) / (src.x * G + src.y * H + 1);
dst.y = (src.x * D + src.y * E + F) / (src.x * G + src.y * H + 1);

ホモグラフィ行列の値を拾ってきて、dstに計算してあげる事で変換先の座標が求まります。
※エディタ実演する

レイテンシ補完

 このようにして、トラッカーの座標とプロジェクタの位置を合わせる事でプロジェクショントラッキングが可能になります。ですが、コンピュータからプロジェクターに出力する時、プロジェクターによっては多少の遅れが生じてしまいます。

そこで、取得したデータの1フレーム前を取っておいて、進んだ分足してあげる事で、ある程度の動きは補完することができます。

ofVec2f bef = ofVec2f(cars[Num].nodeLast.getGlobalPosition().x,cars[Num].nodeLast.getGlobalPosition().z);

ofVec2f src = ofVec2f(cars[Num].node.getGlobalPosition().x,
cars[Num].node.getGlobalPosition().z);

src = src + (src - bef) * preset_guess;

 1つ前のフレームbefと、srcの差 = 直前の速度ベクトルをsrcに足してあげて”ちょっと未来にいるであろう座標”を計算してあげます。ちょっと未来の座標は遅れて結果現在の位置として表示されます。preset_guessには未来具合の係数を入れてあげます。

 結果をシミュレートしてあげた映像がこんな感じです。かなり気持ち良いレベルでトラッキングされてくれます。後半で枠が表示されますが、ちょっと遅れてくる枠がリアルタイムで取得できている座標なので、素直に座標を描画してしまうと枠の分だけ遅延が発生していることになります。

 物にぶつかって止まるようなレベルの急停止/急発進、つまり加減速度があまりに大きいとこの補完方法ではケアしきれませんが、今回トラッキングの対称は車だったので、この方法で十分追えるスピードでした。

この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

1

ひつじ

oFセミナー資料

2014年 デジタルアートセミナー#3 (oFセミナー)にて、ひつじが担当したプレゼンについての資料まとめです。
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。