ZIGCAMの深度情報とCGを合わせる
TDA名義でARKitのWorldTrackingのカメラトラッキング情報と深度情報とカラー画像をまとめてNDIで飛ばせるZIGCAMをリリースしました。
今回はZIGCAMのカメラ情報と深度情報の座標を合わせる方法とカメラのトラッキング情報の使い方を共有します。サンプルはこちら。
併せてZIGCAMも是非DLしてみてください。AppStoreへのリンクはこちら。
Custom Projection Matrixを使う
カメラの情報は移動情報(tx,ty,tz)と回転情報(rx,ry,rz)とField of View(h_fov, v_fov)を送っていますが、それ以外にもProjection Matrix(p_mat11…p_mat44)を送っています。このProjection Matrixを使います。
Camera COMPのViewタグにあるProjectionの方式をCustom Projection Matrixに設定すると、Projection MatrixをCHOPもしくはDATで設定することができるのでこちらにp_matだけをセレクトしたCHOPをリンクさせます。
GeometryとCameraを親子関係にする
深度情報を使うGeometry COMPをCameraと親子関係にしてしまうとカメラ正面からの深度情報をいちいち計算しなくても良いので便利です。ちゃんと計算したい人はPoint Transform TOPを使って深度情報に回転と移動の処理を加えます。
深度からXY座標を計算するGLSL TOPを作る
レンズには画角がついているため、遠くになればなるほどXY座標は広がっていきます。なので深度からその点のXY座標を計算します。頑張れば通常のTOPでもできる気がしますが今回はGLSL TOPでやりました。
この計算にはh_fovとv_fovが必要になります。
深度が取得できない頂点は描画しない
エッジ部分や画面に近すぎる部分は深度情報が取得できず、カメラに張り付いたような位置に計算されてしまいます。これだと映像が見づらくてしょうがないのでThreshold TOPを使って深度の近すぎる箇所は描画しないようにします。
あとはご自由に!
これで現実の深度情報とCG上のカメラおよび空間座標をマッチさせることができました。
サンプルでは深度情報をポイントクラウドにしていますが、実際のARKitのサンプルなどでは深度情報はポイントクラウドにはせずあくまでステンシル的に使う場合が多いようです。