2009年2月3日火曜日

NyARToolkit with WPFの途中経過

980円で買ってきた超安物のPCカメラでもサンプルプログラムはちゃんと動いてなかなか面白かった。

自分で書いたWPFアプリケーションのコードも、PCカメラからキャプチャした動画を表示してマーカーを検出する所までは簡単にできた。

問題は、やはりマーカー座標系からカメラ座標系への変換と射影変換。

private Matrix3D NyARDoubleMatrix34ToMatrix3D(NyARDoubleMatrix34 mat)
{
return new System.Windows.Media.Media3D.Matrix3D
(mat.m00,mat.m10,mat.m20,0,
mat.m01,mat.m11,mat.m21,0,
mat.m02, mat.m12, mat.m22, 0,
mat.m03,mat.m13,mat.m23,1);
}

こういうメソッドを作っておいてViewport3D.Cameraの子要素にしたMatrixCameraオブジェクトであるMainViewport3DCameraに対して

//AR用カメラパラメタファイルをロード
m_ap = new NyARParam();
m_ap.loadARParamFromFile(Properties.Settings.Default.AR_CAMERA_FILE);
m_ap.changeScreenSize(Properties.Settings.Default.Width, Properties.Settings.Default.Height);

//投影行列をAR用カメラパラメタから設定
NyARPerspectiveProjectionMatrix ProjectionMatrix = m_ap.getPerspectiveProjectionMatrix();
MainViewport3DCamera.ProjectionMatrix = NyARDoubleMatrix34ToMatrix3D(ProjectionMatrix);

こんな感じで射影行列を設定。んでもってModelVisual3DオブジェクトであるcubeVisual3Dに対して

cubeVisual3D.Transform=new MatrixTransform3D(NyARDoubleMatrix34ToMatrix3D(result_mat));

こんな感じで変換行列を設定。

コードとしてはこんな感じで良いはずなのだが、何かを勘違いしていて動かない。

そもそも変換行列の類は意味合いがライブラリ/フレームワークでみんな異なるからなあ。でも、行列の行-列番号のアサインとかちゃんと確かめたんだけどなあ。

0 件のコメント: