2013年12月7日土曜日

[AWAC2013]今年一番ヒットだったツールは「RICOH THETA」

いきなり世界が真っ白になった青森の2013年12月7日。Aomori Web Adevent Calendar 2013 7日目のこくぼあつしです。

今年一番ヒットだったツールは、RICOHの全天球カメラTHETA(シータ)です。
いわゆるパノラマ写真を撮影できるカメラです。



このカメラのすごいところは、シャッターを1回切るだけで全周囲撮影できるところ。これがなんとおよそ4万円。

欠点は、画素数が3584x1792と少ないことと、暗所でのノイズが多いこと。しかし、それを補って余りあるお手軽さ。

シャッターを切って急いでぐるりんと回って撮影する必要もなければ、パシャパシャと分割して撮影したものをパノラマ合成ソフト(スティッチングソフト)でつなぐ必要もありません。
その秘密は、2つの超広角の魚眼レンズ。これが前後に2つついていて、本当に1シャッターで全周撮影できます。そして、カメラの中で、正距円筒図法(Equirectangular)の画像に合成してくれます。



 今まで、このような写真を撮影しようとすると、ある程度広角なレンズ、カメラをのせて回転させる雲台といった機材を使って、ちょっとずつ角度を変えて分割撮影し、それをHuginなどのパノラマ合成ソフトで合成していました。また、表示するにはパノラマ画像表示ソフトが必要で、よく知られた実例はQuickTime VRです。

たとえば、以下のような本にその方法が解説されています。


あるいは、Googleストリートビューのように、全天球が1シャッターで撮影できるように、カメラを何台も組み合わせたシステムが必要でした。

RICOHの全天球カメラTHETAは、これらをシャッターを1回切るだけでできるようにしてくれました。

最初に書いたように、画素数は3584x1792。もしも普通のカメラで横1周ぐるりんと8分割して撮影したとすると、1ショットあたりの横幅は3584/8=448画素に相当します。かなり粗い画像だと言えるでしょう。

また、暗いところで撮影すると、ノイズが目立ちます。

しかし、なんと言ってもお手軽です。

撮影するには直接シャッターボタンを押してもいいし、iPhoneやAndroid用の専用アプリなどからリモート撮影も可能です。

THETAは無線LANの親機になることができます。iPhoneやAndroidから、THETAに無線でつなぎ、専用アプリを起動すると、リモートで撮影したり、カメラ内の画像を取り込むことができ、全天球画像を楽しめます。また、PCにUSB接続すれば、普通のカメラに見え、正距円筒図法の画像を取り出すことができます(Macの場合、iPhotoなどを経由)。

また、Webで公開するための手段も用意されています。
必要なのは、Facebookアカウントと専用アプリ。専用アプリに画像を取り込んで、Facebookアカウントでtheta360.comにログインします。すると、画像を投稿して共有することができます。


この画像はPCやスマホなどから、そのまま閲覧することができます。
また、FacebookやTwitter、Tumblrに投稿することもできます。

現状、theta360.comのサイトでは、サーバーサイドにはRuby on Railsを使っているっぽく見えます。そして、RICOH THETAで撮影された正距円筒図法画像をAmazon S3に保存しているようです(似たようなシステムの構築方法は、栗田由菜、『RailsとiPhoneではじめるアプリケーション開発』、インプレスジャパン、2013年あたりに)

その画像をPCなどからはFlashを使って見ることができるようになっています。
また、スマホなどから見る場合には、画像を立方体に投影し、CSS Transforms Module Level 1を用いて、表示しているようです。

あまりにおもしろいので、WebGLを使って正距円筒図法のパノラマ画像を表示するアプリTheta Viewerを作ってみました。jQueryのプラグインなので、Web屋さんには簡単に使えると思います。


 ちなみに今日までのAomori Web Adevent Calendar 2013は、以下のみなさんでした。


明日は、すどうまさゆきさん!

2013年8月22日木曜日

福島GameJam 2013に参加しました

2013年8月3、4日に開催された東北ITコンセプト 福島GameJam2013に参加してきた。 これは、プロや若い人たちが一緒になって即席のチームで30時間でゲームを開発するイベントだ。

東日本大震災では、津波により大きな被害が東日本沿岸に発生し、特に福島県では原発事故が起こり復興を困難にした。 ITで復興を支援することを目的にはじまった福島GameJamは、今年3年目をむかえ、さまざまな広がりを見せている。

昨年度は地元(南相馬)の高校生が参加した。「女子高生とゲームが作れるのは、福島GameJamだけ!」みたいな。そして、今年度はそれに加えてITの研修を受講した地元の技術者も参加した。更に、当日に開発見学や制作体験ワークショップも開催された。また、福島GameJamがきっかけとなり、昨年度から郡山でFUSEというゲーム開発イベントが立ち上がり、毎月のように開催されている。仙台でもCORONAというゲーム開発イベントが立ち上がっている。

今回は、本会場として南相馬に加えて郡山も加わり、サテライト会場も国内各地に海外の台湾、コロンビア、チリなど多数になり、参加者も500人を越える大きなイベントになった。また、参加者向けに事前にゲーム開発ツールのセミナーも開催された。即興のチームで開発手法をゼロから相談してゲームを作るのもいいけれど、それは大変でもあるので、こういう事前セミナーがあると、開発しやすくなると思う。ぼくは青森に住んでいるので、参加しなかったけれど。

今回、ぼくは、思い出深い南相馬会場に参加した。南相馬会場は、これまでと同じ、市役所の向かいの「ゆめはっと」という施設だった。これまでは、近くに買い物ができる場所がなかったため、30時間過ごすためにさまざまなものを持ち込む必要があり、荷物が増える傾向があった。今年からは、近くにコンビニも開店したおかげで、参加しやすくなった。

現地でチーム分けとテーマが発表となり、開発に入った。南相馬のチーム7「Kine Kine 7」。1回目でも一緒だった山口さんや、学生時代に読んでいた「ゲーム批評」の小野さんほか、なかなか濃いメンバーだった。Kinectを持ち込んだ方がいて、テーマが「Jump」だったので、Kinectでジャンプするゲームを作ることになった。

悪のフランチャイズ菓子チェーンが攻めてきて、さらわれた姫が赤ベコに姿を変えられてしまった。天空に囚われた姫を救いに行くというゲームだ。

開発ツールは、Unity。Unityは使ったことがなかったので、その場でオライリーの『Unityによる3Dゲーム開発入門』のPDFをネットで購入。と言っても、ぼくは実際にはUnityは触らなかった。今回は(前回に引き続き今回も?)、プログラマ系の人ばっかりだったので、IGDA東北の菅浪さんとぼく(授業でコンピュータグラフィックスの制作も教えていたり…)はグラフィック素材を作ることにした。

メイングラフィックスは菅浪さんに担当していただき、ぼくはもっぱら子供たちの描いた絵を、Kinectで操作する人形のモデルにはるためのテクスチャーに変換するプログラムや「ゆめはっと」の3D CGを作成した。

福島GameJamでは伝統的に、地元の子供たちが描いてくれた絵を、素材として使うように推奨されている。今回、これらの絵は、WebのAPIから取得できるようになった。
そこで、まず、shellスクリプトで、curlを使ってすべての画像を取得するプログラムを作成した。

子供たちは円と長方形の枠線が描かれた型紙の中に顔と胴体を描いている。また、腕のパーツもある。

福島GameJamのサイトより

これらを切り抜いて別パーツにするプログラムをProcessingで作成した。Processingは、Javaをベースとしたオープンソースのアーティスト向けのプログラミング環境で、短いコードでインタラクティブなアプリや画像処理ソフトを作ることができる。ゲームを作るのにも向いている。青森大学では、ソフトウェア情報学部の1年生のプログラミングの入門の授業で利用しているが、初心者でもゲームが作れるようになったりする。

切り抜いた画像のうち、顔の部分は加工が必要だった。人形のモデルの顔の部分に相当するのは球形だ。円の中に描かれた顔をテクスチャーとしてはるため、画像の投影法を正射影から正距円筒図法に変換する必要があった。そこで、変換式を紙に書いて計算して、プログラムをProcessingで作成した。座標変換はまじめにやっているが、画像のピクセル補間はかなり適当にした。

「ゆめはっと」の3D CGは、ロケを行なって写真を撮影し、ネットで「ゆめはっと」の図面を探した。これらを元に、3D CGツールでモデリングし、写真をテクスチャーとして使用した。

一方、Unityでゲームのプログラムを書いていたメンバーは苦戦していたようだ。課題となったのはバージョン管理で、今回はDropboxを使っていた(Unityにはアセットサーバーというバージョン管理ツールがある。こちらを使うと以下の問題は発生しないのかもしれない)。Dropboxの場合、画像などのバイナリデータの共有には向いている。また、一応、履歴も取ってくれる。でも、差分やマージ機能があるわけではないので、プログラムなどを共有するのには必ずしも向いていない。また、Unityとの相性もあまりよくなく、更新していない3Dオブジェクトが上書きされたりして、作業が煩雑になっていたように見えた。
それでも、子供たちが遊びにくる、2日目午前中までにはなんとか動くようになった。そして、子供たちの反応を見て、ゲームを改良していく。

また、作品制作ルールになるべく適合するように、チューニングしていく。「会場周辺の情景」を取り入れるという項目があったので、近隣のお菓子屋さん(お菓子がテーマのゲームを作成したので)を背景に使用しようと、撮影に出かけた。日曜日だったが、ほとんどのお菓子屋さんが営業していなかった。地方都市ではありがちな光景だが、震災の影響もあるのかもしれない。撮影中に大きな地震が発生し、電信柱がグラグラ揺れる事態に遭遇した。幸い、ぼくにも会場にも大きな影響はなく、ゲーム制作は続けられた。

そうして完成した作品が「福島Game de Watch〜赤べこ救出編」。当初の構想のすべてが反映されたわけではないが、Windows版のバイナリをダウンロードしてKinectを接続すると、プレイすることができる。また、Web版(現在のUnityのバージョンだとMacだと動かない不具合があるっぽい)もあるし、キーボードでも操作できる。

「福島Game de Watch〜赤べこ救出編」
ぼくは、スキルとしてはゲーム開発者というよりはWeb開発者やサーバ屋さんだ。 これまでの福島GameJamでは、ゲーム・プログラミングという、ふだんの仕事とはかなり異なるチャレンジングなタスクを担当して、エキサイトする体験だった。 今回は、シェル・スクリプトを書いたり、今年から担当している「画像処理」の授業で教えた画像処理プログラミング、研究室でやっている研究の一つである街の景観の3D CG制作、説明資料の作成など、ふだんやっている仕事に近いものを担当した。 「ああ、なんか、いつもと同じような仕事をしているよ」と思った。 日常感が満載だったが、仕事はスムーズにできた。 ゲーム開発者の人は、GameJamに参加すると、こんな感じだったのだろうか。

それから、プログラマが多い場合の即興チームでの共同作業については、いろいろ考えさせられた。昨年度の福島GameJamでも全員がプログラマというチームで、JavaScriptで書かれたenchant.jsのコードをDropboxで共有していたが、今回同様にコードのバージョン管理とマージが煩雑になった。 たぶん、このような作業には、gitなど(Unityならアセットサーバーなども)のバージョン管理ツールを使った方がいいのだろう。 たとえば、Pro Gitの「Chapter5 Git での分散作業」で紹介されている「中央集権型のワークフロー」を用いて、自分の作業はトピックブランチを作成して行ない(masterで細かい作業をしない)、ひとまとまりの作業が完了したらmasterブランチにマージするとか。

また、今やほとんどのゲーム開発ツールはオブジェクト指向言語を使っていると思われるが、そのクラスの継承や合成の機能(JavaScriptの場合は相当する方法)を使って、全体で共有するべきコードと自分で個別にいじるコードを分離するという方法もあると思う。

とは言え、ふだんから一緒に仕事をしていれば、開発ツールや開発ルールの共有は簡単だが、即興のチームで行なうのはなかなか難しいかもしれない。

でも、習得のしきいが高かったgitも、最近はSourceTreeなどのクライアントも出てきたので、もっとみんな使ってもいいような気がする。

福島GameJamで学んだことは、いろいろ学生の指導にも参考にしている。なるべく上級者の開発ではバージョン管理システムを使うようにしたり、共同開発ではオブジェクト指向言語の機能を活用して自分がいじる部分を切り分けるなどの工夫をするようにしている。

2013年7月30日火曜日

WindowsのHuginでPTBatcherGUI.exeの起動エラーの対処方法

Windows版のHuginでは、スティッチングを実行しようとすると、PTBatcherGUI.exeの起動に失敗することがある。 PTBatcherGUI.exeを起動すると、複数起動できないように起動していることを識別するためのファイルを作り、これは終了時に削除される。 しかし、何らかの原因で終了時にこのファイルが削除されないと、次回から起動できなくなる。

ファイルはWindows XPの場合、ドライブ:\Documents and Settings\ユーザー名\Application Data\.ptbt0や.ptbt1。
Windows 7の場合、ドライブ:\Users\ユーザー名\AppData\Roaming\.ptbt0や.ptbt1。

これらは隠しフォルダに入っていたりするので、隠しフォルダなどをフォルダオプションで見えるようにしないと見ることができない。

バッチファイルで削除するには、以下の内容のバッチファイルを作成して実行するとうまくいった(無保証。ご自分の責任でご利用ください)。

Windows XP用
---
@echo off
set AppData="%USERPROFILE%\Application Data"
if exist %AppData%\.ptbt0 (del %AppData%\.ptbt0)
if exist %AppData%\.ptbt1 (del %AppData%\.ptbt1)
---

Windows 7用
---
@echo off
set AppData="%USERPROFILE%\AppData\Roaming"
if exist %AppData%\.ptbt0 (del %AppData%\.ptbt0)
if exist %AppData%\.ptbt1 (del %AppData%\.ptbt1)
---

追記

Mac OS Xの場合は、~/Library/Preferences/.ptbt0や.ptbt1