16th
Ruby + ARToolKit なバインディングを書きかけています件
(画像はハメコミ合成ではありません)
事情から説明すると以前から島根で Ruby合宿 とかいうのがあって、今年は講師で呼ばれたわけだ。
んで「なにか発展的な内容を」と言われたので、それならデバイスアートで拡張現実でニコニコ技術部でしょとか思っちゃったのが運の尽きで。
いや ARToolKit はそれはそれでいいとして、お題目がRuby合宿であるがゆえにARToolKitで完結してよかったねーでは当然ダメで、なんとかしてRubyが絡まにゃいかん。
というわけでとりあえず合宿当日までに俺がARToolKitのRubyバインディングを突貫で書いて当日合宿所でいきなり使いましょうという。ここまでくると俺講師なんだか合宿参加者なんだかよくわからんよな。
ところが面白いものでというか、ARToolKit自体はよくできていて、APIデザインを悩まなければ(まあ悩むんだけど)、わりとバインディング自体は素直に書けそうということが分かった。
問題はRuby本体の方で、というのも今回はWindowsがターゲットだけど、ARToolKitはビデオキャプチャとかするのであからさまにVCでコンパイルする必要があるわけだが、VC2008でコンパイルしたARToolKitとcygwinのRubyが混ざるわけがねえ。しかもやってみたらVCでRuby1.8.7コンパイル通らねえ。というなかなかゴージャスな状況。お気付きの通りわりと最近Ruby 1.8.7のリリースが出たのは主にこのため(仕事で使うから俺の中で優先度がとても上昇した)だったのさ。すごい話だね。
でまあ、数々の障害を乗り越えてとりあえずバインディングを書くところまでは来てるので、あとは当日までにどんだけ作り込めるか。とりあえず現状だと最低限でlibARがあればarDetectMarkerできる状況にはなっていて、ここまででもたとえばドアにマーカー貼っておいて最尤度マーカーの位置がズレたのを検出して全自動でマシンをロックするネオ「ボスが来た」ボタン(すでにボタンではないが)とか、アサガオのつるにマーカー貼っておいてウェブカムで撮影してなつやすみの宿題の全自動化とか、あるいはカメラの前でマーカ振ると再生されてる音のピッチが変わるARカオスパッドとか、まあアイディア次第でいくらでも面白いことはできるんじゃねえの? って話だが、そうは言ってもやっぱビデオシースルーしたいじゃん? 自分の机の上で初音ミク踊らせたいじゃん? となると、RubyとARToolKitの他にOpenGLは当然としても表示のためのRuby/SDLかGLUTが必要で(当然それらもVCでコンパイルしなおせよ)、そういうのがあるととりあえず例の急須程度なら
GLUT.Init ARGV
AR.video_open "Data\\WDM_camera_flipV.xml"
AR.load_patt "Data\\patt.hiro"
cparam = AR.param_load("Data\\camera_para.dat").change_size *AR.video_inq_size
AR.init_cparam cparam
cparam.arg_init 1, false, 0, 0, false
AR.video_cap_start
AR.g_main_loop do
next unless img = AR.video_get_image
begin
AR.g_draw_mode_2d
img.arg_disp_image 0, 0
AR.video_cap_next
next unless m = img.detect_marker(100)
next unless k = m.max_by {|i| i.cf }
next unless t = k.trans_mat([0, 0], 80)
AR.g_draw_mode_3d
AR.g_draw_3d_camera 0, 0
GL.MatrixMode GL::MODELVIEW
GL.LoadMatrix t.arg_conv_gl_para
GL.Translate 0, 0, 25.0
GL.Rotate 90, 1, 0, 0
GLUT.SolidTeapot 50.0
ensure
AR.g_swap_buffers
end
end
こんくらいで出るようになる。終了処理とかサボってるけどな。非力なVAIO Xだけど20fps弱でぐりぐり動くので、人間が動画にカクカクした違和感を感じなくなるのがおおむね15fpsくらいからと言われていることを考えると、まあ十分だな。というか予想してたより全然軽い。
というわけであからさまに色々足りてないがそろそろとりあえずのデモくらいはできるようになってきたし、公開のOKもとったので、まだ開発中ではあるものの一応 GitHubにあげといた 。自力で一式コンパイルできる勇者は試してみてもいいんじゃないですかね。Ruby合宿には当然俺がコンパイルして動作確認済みのバイナリを持っていくので、待てる人はそっちに参加したほうが確実とは思います。