ラベル ARToolkit の投稿を表示しています。 すべての投稿を表示
ラベル ARToolkit の投稿を表示しています。 すべての投稿を表示

2009年2月27日金曜日

三角錐のエッジを鋭くした

WPFの法線って、(面ではなく)頂点毎に指定されて、共有される頂点に対して何も指定しないと、面から計算した法線を自動的に平均化するのね。

というわけで、頂点を共有しないようにしたら、より三角錐らしくなった。
以前:

以後:

ミクさん:

コードも更新した。

2009年2月23日月曜日

ミクさんで拡張現実でWPFなWMPの視覚エフェクトプラグインの動画


視覚エフェクトの動画を作ってきた

朝から雨で気温も低いけど、37.0のびみょーな微熱とともにいつもと同じく倦怠感、目が腫れぼったい、霞む、集中できない、で家にいても何も手につかない。

居たたまれなくなって午後雨が収まってから無理に外出したらすぐにやばいほど疲れ果ててネカフェで休憩。それでふと思い付いて、PCカメラを借りて、最近製作したミクさんでARな視覚エフェクトのCamStudioによるキャプチャ動画を作ってみた。ネカフェのPCって、ゲームもできるようになっているから性能良いなあ。

ずっと座りながらの作業だったのにネカフェを出る時には足が棒のようで、目も一段と霞んで、歩くのに危険を感じる程だった。

というわけで散々苦労した挙句だが、ネット動画用の素材は揃った。

2009年2月21日土曜日

ミクさんで拡張現実でWPFなWMPの視覚エフェクトプラグインを更新

更新内容は
1.IWMPEffects, IWMPEffects2をそれぞれ明示的に実装した。これで、過去のWMPでも使えるはず。
2.パラメタを少しいじった。

パラメタをいじったので、レジストリのHKCU/software/tomorrowplusplus/WMPEmitMiku以下を削除してから実行すると良いかも。

ここのWMPEmitMiku.zipです。

自分のPCだとパフォーマンスに難があるし、ネカフェだと.net framework3.5のインストールとかに時間がかかったりで、準備に時間がかかり過ぎる。

誰か、3D性能およびWEBカメラの性能の両方が良い環境の方、うまい音楽を選んでパラメタをうまくいじってCamStudioでのキャプチャ動画を作ってくれませんかねえ。CamStudioならスピーカ出力もキャプチャできるし(ただし何故かうちではできない)。

2009年2月20日金曜日

ミクさんで拡張現実でWPFなWMPの視覚エフェクトプラグインを更新

更新内容は
1.パワーの対数を取るオプションを追加し、デフォルトでオンにした
2.インストールの方法に関する説明で、レジストリファイルの修正が必要な事に言及していなかったので言及した。

ここのWMPEmitMiku.zipです。

ミクさんで拡張現実でWPFなWMPの視覚エフェクトプラグイン


最低限の形にはなった。指数分布に従って確率的にミクさんを放出し、その時に、帯域毎のパワーに応じて単位時間辺りのミクさん放出数を決めている。パラメタなどいじる余地がまだまだあるし、初速度を帯域のパワーと関連させるのもありだろう。

ここのWMPEmitMiku.zipがソース。バイナリも入っているので、readme-en.txtの指示に従えば遊ぶだけも可。

追記:設定をレジストリで持つようにしたら、平均ミク放出数の最小値と最大値を同じにしてしまって音楽に合わせた変化が生まれなくなってしまった。このバグは修正した。

2009年2月15日日曜日

ミクさん大放出



2009年2月14日土曜日

あ、足が、目が・・・

調子に乗ってたら著しく体調が悪くなってきた。最近、朝起きて数十分とその後との落差が酷い。

2009年2月13日金曜日

クオータニオンを使って姿勢をランダムにした


クオータニオンで一様な回転を生成するには、単にその四つの係数を四次元球面上に一様に分布させれば良い(⇒これは誤り。回転軸を球面上一様分布で、回転角を一様分布で生成してクオータニオンを生成すべき。だったら、AxisAngleRoatate3Dで良かったんだな。まあ良いや。回転軸は確かに一様だし)。実際には、四つの係数を[0,1]の一様分布で生成する事を長さが1以下になるまで繰り返して、その後まずクオータニオンを作ってしまってからNormalize()を呼べば良い。

というわけで今現在のコードで、ミクさんのモデルデータは重心が原点にくるように移動させてあって、それをContentsとするVisual3DのTransformにTransform3DGroupを設定して、そのChildrenをRotateTransform3D⇒TranslateTransform3Dの順に設定し、この二つの変換を支配するQuaternionおよびPoint3Dを公開して、UpdatePose()を呼ぶと変換に反映するようにした。現在はPoint3Dのみを重力加速度に従って動かしているけれど、このデータ構造なら、オイラーの剛体方程式に従って剛体回転も容易に扱えるはず。やる気はしないけれど。

コードと実行ファイルはARWithWPFMikuEmitted.zipを詳細サイトのダウンロードページから取ってきてください。

ちなみに、この画像ではボタンの``Emit Miku!''の綴りが``Emmit Miku!''となっていて格好悪いけれど、アップしたソースでは修正してあります。

ARToolkitPlusで体感ゲームを作る予定は未定だけど準備だけ


ミクさんがマーカの位置からランダムな初速度を与えられて射出されて重力で自由落下するぞ。

ミクさんは三次元CG@七葉の4169さんのローポリなデータをお借りしています。

しかしWPFのStoryboard使わずに普通にオンフレームアニメーションにしてしまったので、プログラム的にはあまり面白くない。一連のARToolkit+WPFの実験はWPFを活かす事に主眼があるので続くかどうかは未定。

2009年2月11日水曜日

回ってフワフワするようにした



写真じゃ分かり難いけれど(当たり前だ)、z軸中心の回転とz軸方向の平行移動のアニメーションを加えた。さながらデジタルフィギュア。

コードはいつもの所においてある。実行ファイル入りなのでとりあえず遊びたい人もどうぞ。

追記:

ニコニコ動画にアップした。

2009年2月9日月曜日

ミクさんリアルだ


今回から、カメラの位置だけでなくマーカの位置の左と右に点光源を置いたのでミクさんは下から照明されているのだが、お陰で怖い程のリアリティがある。画像じゃ伝わらないかもしれないけれど、ちゃんとマーカの動きが追従されている時、どきっとするくらいに本物らしい時がある。これは完全にモデル製作者の力量に拠ってるよなあ。日曜モデリングさまに感謝を。

追記:せっかくの拡張現実なので、現実感と非現実感が同居している感じに照明を調節してみた。

ミクさんのコード

一応置いておいたけどまだやっつけなので注意。とりあえず動くとは思う。

ミクさんを表示してみた


もう何番煎じというレベルではないですが。しかしネタとしてはともかく、スケルトンが超整理されていて3D表示がWPFであるためにプログラミングという観点からはとっても可能性が広がっているのです。

さあ、データを気合入れて作って振り付けをアニメーションするのは職人に任せて、WPFを活かしたコードでのお気楽アニメーションをやってみるぞ!

ちなみに、データは日曜モデリングさまのものです。というかデータの準備に、工学ナビの中の人のこのエントリを参考にしたというわけなんだけど。

mqoからxamlの3Dデータの準備の仕方のメモ。Identityを使用して、この記事を参考にした。

1.mqoをメタセコイアで読み込む。一度正方形を適当な大きさで作ってミクさんのフットプリントを確認しておく。今回のデータの場合、およそ100x100の正方形に収まるが、そのうち大半は髪の毛のボリュームなので、プログラムでスケール変換する時にmarkerwidth/50.0を係数とする。(markerwidthはARToolkitPlusの初期化時に渡すマーカのマーカ座標系における幅。)
2.Identityが吐くxamlにはエンコーディング指定がないので、日本語の材質名、物体名などは変更しておく。なお、今回のデータの場合、日本語の名前の材質は全て未使用(製作の過程で一時的に割り当てたっぽい)だったのでざっくり削除した。
3.Identityはインストール先のディレクトリのTexturesディレクトリからのみテクスチャファイルを探す。従って一度テクスチャファイルは全てコピーする。
4.Identityでmqoファイルを開く。ファイル-名前を付けて保存メニューを選択し、xamlをファイルの種類として選び、UV座標と法線にチェックを入れて保存する。この時オリジナルのテクスチャがあるディレクトリに出力すると改めてテクスチャファイルを生成しようとしてエラーが出るが別に問題はない。気になるなら別のディレクトリに出力する。
5.xamlファイルをがんばって書き換えて次のようにする。この時x:Nameは全てx:Keyに書き換える。

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<MaterialGroup x:Key="Material_miku_pose1_face" >
...
<Transform3DGroup x:Key="Transform_Character_miku_pose1_Character_0" >
...
<MeshGeometry3D x:Key="Geometry_miku_pose1_head_0" ... />
...
<Model3DGroup x:Key="ここにプログラムから参照する名前を入れる。今回はmiku_pose1とした">
...
</Model3DGroup>
</ResourceDictionary>
6:ソリューションにMIKUフォルダを作り、xamlとテクスチャファイルを全て入れる。プロパティで``ビルドアクション''を「コンテンツ」に、``出力ディレクトリにコピー''を「新しい場合はコピー」にする(注:xamlもコンパイルせずにこのようにした方が、ユーザがデータを入れ替えられて良いと思うのでそうした)。
7:Window1.xamlに
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MIKU/miku_pose1_resource.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
という記述を追加。これで、コードビハインドのWindow1クラス中で(Model3D)this.Resources["miku_pose1"]としてミクさんのモデルを参照できる。

キャリブレーションの仕方を英語で書いた

http://sites.google.com/site/augmentedrealitytestingsite/#TOC-How-to:-Camera-Calibration
にキャリブレーションの仕方を英語で書いておいた。この情報は探しても全然見つからないのでかなり有用だと思う。頭がパンクしかけたのでかなり端折ったけど、かえってこのエントリに書いたキャリブレーションの仕方の説明よりも簡略になって分かりやすくなった気がする。

mqo to xamlができるソフト

Identityというソフトがあるらしい。これでマーカーの上でミクさんを踊らしたりとかできるのかな。

連番mqo出力ができるアニメーションツール RokDeBone2なんてのもある。

ありゃ、Identityって、ただの変換ツールかと思ったらアニメーションツールなのか。それでxaml出力ができるって、アニメーションするオブジェクトをマーカに表示するだけならプログラム超簡単にならないか?

あと、メタセコイアへのポインタ


追記:Identityを使ってみたが、Viewbox3Dをルート要素としブラウザで開くと単体で動作する手取り足取り状態のxamlが出力される。これはこれで便利だが、プログラムから参照するのには不便。ここの記事にリソースディクショナリへの加工の仕方がある。

2009年2月8日日曜日

英語サイトを作った

ARToolkitPlus+WPFは必要としている人は少ないが確実に有用である類のプロジェクトなので、世界に広く公開した方が良い。それで、英語サイトを作った。
http://sites.google.com/site/augmentedrealitytestingsite/
今はアドイン「身も蓋もない」の軒先を借りている状況なので、ソースコードのコメントを英語でリライトしたらこちらに完全に移行するつもり。

追記:コメントを英語にしたので移行した。今後はソースなどはこちらにアップロードする。

デモ動画

デモ動画を作ってみた。

2009年2月7日土曜日

サンプルを更新

ここにおいてあるARToolktPlus+DShowNET+WPFのサンプルを更新した。

今回、デフォルトを自分用のキャリブレーショファイルにしてしまったので、これで上手くいかない場合は設定でLogitech_Notebook_Pro.calを選択するか、このエントリを参考に自分用のキャリブレーションファイルを作ってください。

それと、もう少しましなPCカメラ欲しいなあ。同じ30万画素でも普通はもっとましらしいし、ネット通販ならそれらでも980円で買えたりする。ちょっとGroovy GR-CAM030はひどすぎる。980円とは言え、安物買いの・・・って奴だ。

And finally...

MatlabのスクリプトってC++にコンバートした上でコンパイルするなんて事ができるので、もしかしたらと思って探したら、Camera Calibration Toolbox For MatlabのModified Versionのページで紹介されていたー。

さあ、これでたぶん、カメラのキャリブレーションが自前でできるぞ。

実際にやってみた。

まず、Windows 7でやっているので、.net framework 1.1がないと怒られた。

http://www.microsoft.com/downloads/details.aspx?familyid=262D25E3-F589-4842-8157-034D1E7CF3A3&displaylang=ja

http://www.microsoft.com/downloads/details.aspx?FamilyId=04DBAF2E-61ED-43F4-8D2A-CCB2BAB7B8EB&displaylang=ja

をダウンロードしてインストール。

http://research.graphicon.ru/calibration/gml-c-camera-calibration-toolbox-5.html
から GML C++ Camera Calibration Toolbox の``Latest Binaries''をダウンロードしてインストール。

インストール先の``Calibration pattern''フォルダ中のpattern_A4.pdfを印刷。

GML Camera Calibration Toolboxを起動して、白紙のアイコンのボタンをクリック。。pattern_A4.pdfを印刷したなら、Object Sizeは7, 10, square sizeは24(実測値を使う事!)くらいを入力。

何らかの方法で印刷したパターンを撮影した画像を用意する。私が使用しているGroovy GR-CAM030では、ボタンを押すと動画のキャプチャソフトが起動する(付属CDからドライバをインストールしたわけではないのでWindows 7標準の機能かもしれない)が、ここでもう一度ボタンを押すと静止画がキャプチャできる。何枚か用意する。この時
http://research.graphicon.ru/calibration/recommendations-for-taking-calibration-photos.html
を参考にして色々な姿勢から撮影する。枚数は多い方が良い。意外と認識に失敗する事が多い。また、全ての画像のサイズは等しくする事。全ての測定結果はピクセルで表される。

プラス記号のアイコンのボタンをクリックして画像を全部追加する。チェッカーボードが二枚重なっているボタンを押すと全ての画像に対して認識が試行される。失敗した画像はマイナスのアイコンのボタンで削除。あまり成功枚数が少ないor姿勢のバリエーションが少なければ、新たに画像を追加してチェッカーボード一枚のアイコンのボタンで個別に認識を試行できる。

カメラのアイコンのボタンを押すとキャリブレーションが実行される。
で、下のようなテキストファイルを作る。分かり易いように``,''を入れたが、これは実際には書いてはいけない。

ARToolKitPlus_CamCal_Rev02
使用した画像の幅, 使用した画像の高さ, 出力されたprincipal pointの一つ目, 出力されたprincipal pointの二つ目, 出力されたfocal lengthの一つ目, 出力されたfocal lengthの二つ目, Distortionの四つの数字を順に, 0.0, 0.0, 10くらいの好きな数字


これで自分のカメラ用のキャリブレーションファイルが完成!!・・・と思う。

ちょっと気になるのは、640x480の画像を使ってGroovy GR-CAM030をキャリブレーションすると、principal pointのxが420くらいになる事。実際にずれているのか、それともパラメタの解釈か手順に問題があるのか・・・。

で、このキャリブレーションファイルを使ってARしてみた結果:

まあ特に何が変わったとも思えないけど心なしか自然になった気がする。ブラシーボ効果かもしれない。