Miyabiarts.net

一年に一度の更新頻度

CEDEC2011 3日目

情報化社会、インターネット、デジタルアート、日本文化

猪子 寿之 (チームラボ株式会社 代表取締役社長)

メディアと日本文化を融合させることで新しいアートを切り開いたり、コンピュータを使った面白いものを沢山作り出しているチームラボの猪子社長の基調講演。前に飛行機の機内番組でチームラボ特集をやっていたのを見たことがあるため、猪子社長がどんな人物であるかはなんとなく分かっていたのですが、予想通りその場で考えて話すタイプなので、面白い事を言っているけど、なかなかまとまらずに伝わらない感じでした。映像再生のためにWindowsのエクスプローラからファイルを探したり、該当箇所をシークバーで探すなどの細かいところで話の腰を折ってしまうのも、話の世界から遠ざけてしまうので、このあたりは基調講演でありますし、しっかりと準備してきていただきたいと思います。

上のこともあって、話全部を覚えているわけではないのですが、講演の内容は、日本文化がどういうものであるのか。今あるものが昔からあるものとどうつながっているか。ということが多く語られていました。こういった対比は面白いのですが、ゲームの話に関しては、それは後から意味付けをしたものであって、当時の開発者たちは考えていたわけではないだろう。という感想を抱きました。

講演本体が終わってから、会場の方や司会者からの質問に猪子社長が答えていたのですが、ここが一番面白かったです。この人はきっと一方的に何かを語る。というよりも、人とインタラクションすることでアイデアを高めていくというタイプの人間ですよね。質疑応答の時のほうが、とても人間的な魅力を感じました。

メモ

  • 芸術とプレゼンの違いはあるとは思うけど、表現を扱っているなら、こういう場所での見せ方ももうちょっと拘って欲しいかな。映像再生のためにWindowsのディレクトリに行ったり、シークバーで探すなどの細かい部分が気になってしまう。
  • 比べたいというわけではないですが、その点を考えると、昨年のMIT 石井裕先生は徹底して表現に生きているな。と感じました。
  • 日本の庭は3次元的でレイヤー構造で、横に歩いて美しく見える。 西洋の庭はパースペクティブで、正面に歩いていくことを想定しており、横方向に歩くとレイアウトが崩れる。
  • 横に歩いて見える文化が、マリオにつながっている。
  • 日本の大和絵も、ドラクエにつながっている。
  • ゲームに関しては(特にゲーム開発黎明期)、その映像表現が技術的制約からきたものであることが多いとは思うけど、まぁ技術者がその時に技術レベルで出来る限りのことをしたことを、後世の人達がより文化的な背景を見つけようとするのは、ゲームに限らず良くあることかな。
  • 「言語化できない特有の積み重ねが、最大の強み。」というのは感情的に支持したいとは思う一方で、特定の人にしかできないことを誰にでもできるように言語化・システム化・大衆化していくことが技術者の矜持でもあったりするので、そこは難しいところだな。
  • あれや、人類全体が言語ではなく、感覚を共有するようにして、うまく言語化できないものを皆がなんとなく理解できるようにできる仕組みを作ればいいんや。 なんだかそんな設定の映画かアニメあったような気がするけど忘れた。それが実現された社会がどうなったかも忘れた。

『時代を超えるキャラクターと世界を創る』 ~ボトムズからのメッセージ~

髙橋 良輔 (大阪芸術大学)

 

メモ

  • 大学でアニメーションを研究している先生方が、驚くほどアニメーションを知らない。
  • 虫プロダクションは、手塚治虫先生がまず漫画好きで、集まった人たちも中学生くらいからプロの漫画家として活躍する人がいるほど漫画好きだった。
  • 手塚治虫は、元々極東のディズニーを作ろうとする東映を手伝っていたが、思うことあってか、自ら虫プロダクションは設立した。
  • 手塚治虫は、「アニメーション」と「TVアニメ」を区別して呼称するように指導していた。
  • アトムには、多くのシナリオライターが参加した。今言えばあの方か、と言われるようなSF作家の人もストーリーを作っていた。
  • ある意味で、手塚治虫が大きなお兄ちゃん向けのアニメの文化を作り上げる基盤となったとも言えますね。
  • アニメーションはお金がかかる。 アトムの頃は一社提供が多かった。 それがアニメ界を支えてくれた。 宇宙戦艦ヤマト・ガンダムの頃からは、複数のスポンサー提供になり、関連グッズがアニメ界を支えた。
  • ガンダムなんかも、お金がカツカツの時に生まれた作品ですね。
  • 技術の進歩により、コピー商品が増え、パッケージビジネスに大打撃を与えている。
  • 「有能な人は有能な人を見つけるので、なかなか私のところには来てくれない。何年も鳴かず飛ばずの人を頼りにしていた。」
  • 仕事をしてくれる人を悪く言う会社はない。 次から仕事が少なくなることはあるけど。
  • 企画を100本考えて、1本が映像化されれば上々。

ゲームにおける破壊

原田 隆宏 (AMD) ほか2名

 

メモ

  • パーティクルベースの水面シミュレーション。GPUのアーキテクチャに適している。
  • 水面シミュレーション。パーティクルの衝突。統合。 衝突のためにいくつかのアクセレーション。一様グリッドがGPUに適している。ダイバージェンスの計算。
  • パーティクルの衝突計算。パーティクルが一様グリッドのどこにいるかを計算。GPUに適した条件としては、異なるパーティクルのサイズが大体同じ程度であること。計算の領域が変わるため、スレッドごとの計算のムダが多くなる。
  • 大小のパーティクルが存在する場合、それぞれの大きさで計算した後に統合。小さいサイズのパーティクル間はGPUで計算。大きいサイズはCPUで計算。同期を取りながら結果を統合。
  • マルチコアCPUのために大小のパーティクル間の衝突に対して、更なる最適化。 スレッドを使って共有メモリに書き込み。
  • 小さいパーティクル間の衝突にCPUを利用することで、更なる改善。 パーティクルをZ curveに並べることでキャシュヒット率を上げる。このソーティングにCPUで行う。基数ソート。

メモ

  • 事前に破壊する場所を与えたモデルを作し、ランタイムで破壊する。
  • ConvexとConcave
  • Voronoi Scatterで3Dモデルを分割。MAYAで動くコードがGoogleCodeにある。Blenderにもスクリプトがある。
  • Convex Decomposition Sourceforgeにコードが存在。
  • Tetrahedraへの分解もSourceforgeに存在。
  • リアルタイムにブーリアンで地形を破壊するデモがGoogleCodeに。
  • いくつかのパーティクルを接続した物理シミュレーションがBulletに組み込まれている。
  • GPUへの有限要素法の実装が行われている。 恐竜がプニプニ。
  • 剛体のシミュレーション。Box2D。絵が思いっきりAngryBird。
  • Composit method 事前に破壊したデータと破砕面の接続、破壊される限界を決めるしきい値をアーティストが作成。ランタイム時にしきい値以上の力がかかったら、接続を切る。
  • 静的有限要素法を用いて、剛体を分割する手法もある。
  • Blender上での破壊デモ中。
  • アドインで、Fractual Objectを入れて、有効にしておく。
  • MAYA上での破壊デモ中。

超シンプル物理!~「ドラゴンズ ドグマ」での衣服/髪シミュの秘密+剛体/ラグドールへの拡張~

松宮 雅俊 (株式会社カプコン)

メモ

  • 「超シンプル物理!」
  • パーティクルの並進運動のみで物理シミュレーション。 蛇の多関節IK。IKチェインによる髪の毛。ソフトボディによる布。剛体。ラグドール。
  • Verlet物理の復習。 いきなりシンプルじゃない気がw
  • PixelJunkシリーズとかがVerlet物理を使っている。
  • Verlet積分:位置を直接動かすことができる。 速度のつじつまが自動的にあう。位置と速度がずれないので安定。 現在の位置と速度ではなく、現在の位置と前の位置を保存しておく。
  • スティック拘束:パーティクル間の長さ(距離?)を維持する。Verlet積分の特性により位置を動かすだけ。
  • スティック拘束をチェインにするだけで、揺れものができる。 上位の拘束から順に計算。
  • sqrtは重いので、近似計算を行う。 √a ≒ r + (a-r^2)/r
  • コリジョンは、各パーティクルの位置を形状外に押し出すだけ。
  • チェインの姿勢と角度制限:姿勢はバインドポーズからの最小回転で算出。コーン形状により角度制限。コーンの軸に直交な平面上に投影し、xの比較のみを行う。範囲を超えていたら制限位置に戻す。
  • ヘビIK:目標位置を決める。現在位置と目標位置をバネモデルで近づける。あとはスティック拘束とコリジョンが面倒みてくれる。
  • ソフトボディは、キャラクターの服・マント、ライオンのたてがみ、やぎのヒゲなどに使われている。
  • スティック拘束は逐次処理なので、互いに独立した処理群に分割してからGPU計算。 トポロジーが変化しない場合は事前計算。 SPUでは、1SPUのLSに入る頂点数分をLSに送って逐次処理。 今回は入り切れない場合などはなかった。
  • コリジョン:画像ベース テクスチャに保存した高さフィールドとのコリジョン。 背景やキャラクターを高さフィールド化。
  • ドラゴンズドグマでは、Verlet剛体・ラグドールはまだ使われていない。
  • Verlet剛体:4パーティクル。6スティック拘束。質量=4パーティクル質量合計。慣性テンソル=4パーティクルの質量配分と配置。四面体で配置:重心座標系で配置。多面体で最小の頂点・辺・面であるため採用。
  • Verlet積分なので、位置を移動するだけ。コリジョンは物体形状。 衝突した位置から、4頂点をどう動かすかが重要。衝突しない位置までの移動量を4頂点に分配。このときに重心座標に応じて分配。
  • 摩擦:頂点移動を行う際に、摩擦面に投影したベクトルに摩擦係数を掛けることで、擬似的に摩擦を計算。
  • ボールジョイント:4頂点の位置をジョイント位置に移動するだけ。 ヒンジジョイントのために、ボールジョイントに最小距離を加える。
  • ヒンジジョイントは、ボールジョイント1個、最大距離ジョイント3つで表現。
  • 最大距離で関節角の制限を行うことができる。 どう計算するかは、今回は割愛。
  • 四面体は形状よりも大きくても問題ない。
  • モーション駆動ラグドール。 基本はモーションによる位置・姿勢に合わせてVerlet剛体の4頂点位置を動かすだけ。 2フレーム動かしてラグドールに切り替えれば、モーションからラグドールへスムーズに切り替え。
  • 本当に超シンプルだった。
  • しっかりするならインパルスベース。 簡単にそれなりにするならVerlet。

CEDEC CHALLENGE: 3Dアニメーター列伝!メイキング特別講演

橋本 トミサブロウ (株式会社サテライト) ほか3名

異なる会社の3名(+1名)に、「伝説の剣を引きぬく勇者」というお題を与えて3Dアニメーションを作ってもらうというものでした。全編通して映像を見せながらのものだったので、説明は難しいですが大変面白かったです。プロが実際に3Dアニメーションをつけているところを見たことがなかったので、スクリーンを凝視していましたよ。自分が一番気に入ったのは、最初のセガの方の足で剣を引きぬくスタイリッシュ剣抜きでした。

モーション付けのやりかたは今のところ全く分からない(操作というよりも、感覚的なものですが)ので、時間が空いたら少しずつでも覚えていきたいなと思います。年が明けたら少しは時間があるはず。

新・ゲームAIを横浜で語る

南野 真太郎 (ポリゴンマジック株式会社) ほか2名

Twitterを見てれば、どれほどAIを愛しているかが分かる三宅陽一郎(@miyayou)さんを一目見ておこうと思って、参加しました。ラウンドテーブル形式で、参加者を含めての討論大会でしたが、少し盛り上がりに欠ける感じでした。自分もTwitterのハッシュタグで数件つぶやいていたりしたのですが、ちょっと残念な感じに。

なかなか議論が行われなかったので、色々なイベントの宣伝に入ってしまい、そしてそのまま終わりの時間が来てしまいました。何気にラウンドテーブル形式のセッションは初めてであったため、惜しい記憶とともに刻まれるでしょう。でもまぁAIについては、@miyayouさんをフォローしておけば、今後も充実するので満足しておきましょう。

 

という感じのCEDEC2011の3日間でした。毎年真面目に参加している方ですが、今回は特に技術方面でしっかりと勉強した感じです。後は、参加して勉強したつもりになるだけではなく、いくつかは自分で実装したりすることで、ちゃんと技術として身につけることですね。ついでにですが、今回おそらくCEDEC関連で一番つぶやいたのは私でしょう(笑)

広告

CEDEC2011 2日目

「ムーンショット」 デザイン幸福論

奥山 清行 (工業デザイナー / KEN OKUYAMA DESIGN 代表)

ホテルでダラダラしていたら、思いっきり遅れていくことになりました。正直、工業デザイナーなので聞かなくても良いかなあ。と最後の15分ほどだけ聴いていたのですが、全部聞けば良いなと後悔しておりました。

自動車の自動運転に関する話は、直接というわけではないですが、今大学で行なっている研究にも近いことであるので、野心的だと思って聴いていました。確かに、環境が整えば自動運転は可能だとは思うのですが、現実の環境では、歩行者がいたり、想定外の事象が多く発生するため、この点をどう解決していくかというのは非常に興味深いところです。

聴いていないところはあとから記事を見て補完したのですが、「来るかどうか分からない15分のために準備するのがプロ」というのは良い言葉ですね。

ショートセッション: リアルタイムCG技術の先端

五反田 義治 (株式会社トライエース) ほか5名

前半はグローバルイルミネーションレンダリングの基礎的な話。基礎的な話と言っても、今回は式が多く出てきたので、初めて聴く方で、普段数式とかに触れていない方にはつらいのではないかなという印象は受けました。私は、ここらへんの話は個人的に色々やってきたので、復習がてらに聴いておりました。

内容は、グローバルイルミネーションレンダリングの基本となるKajiyaのレンダリング方程式の説明から入り、BRDF(双方向反射分配関数)、反射モデルをLambertにしたときの具体的な式展開という順番で行われました。また、そのまま実装するとリアルタイムでは動かないため、どのように実装するかの簡単な話で、実際に実装する話については午後のセッションとなりました。(午後のセッションは、私は聴いていません。)

メモ

  • セッションの目的 Kajiyaのレンダリング方程式を解いて、物理的に正しいレンダリングを行う。
  • 放射輝度。それを領域で積分した放射照度。それを時間微分した放射束。
  • ここらへんはPBR本とか、Jensenのフォトンマップ本に詳しく書かれていますね。
  • ある地点の放射輝度=反射光+発光。反射光はその地点に入射する半球全ての光と反射特性であるBRDFから決まる。
  • BRDFの物理的制約: エネルギー保存の法則、入ってきた光と出ていく光の総量は等価。可換性、入射角と反射角を入れ換えてもBRDFの値は変わらない。
  • レンダリング方程式には再帰性があるので、そのままだと解けない。→ パストレースなどの近似解法。
  • Lambert、というか間接光をシェーダで扱う方法。放射輝度マップをキューブマップで用意し、シェーダで参照。
  • そのまま実装すると計算量が半端ないので、大胆な近似が必要。球面基底関数を利用したPRT系など。
昨年のCEDEC2010のポスタで見た話ではあったのですが、今年はオーラル形式で聴講。半透明物体をラスタライズ形式でレンダリングすることは、今まであまりやられておらず、また難しい問題だったのですが、BRDFに反射面の曲率を加えたCRDFを考えることで、これを解決するという発表でした。原理を簡単に言ってしまえば、通常は入射光と法線のなす角が90度を超える場合は、視点から見えないので、レンダリングしないのですが、このような箇所から光が見える領域に滲み出るようにレンダリングすることで半透明物体を表現していました。
学会発表みたいだと、Twitterでつぶやいていたら、講演者にリプライを受けました(笑)。発表自体は大変分かりやすかったです。

メモ

  • BRDFに表面の曲率を加えたCRDF
  • 物体表面に曲率を持たせることで入射光と法線が90度を超えるような箇所の光を滲み出させることによって半透明物体を表現。

物理エンジンを利用したクリーチャーのプロシージャルアニメーション

辛 孝宗 (株式会社バンダイナムコゲームス)

前日の別のプロシージャルアニメとはちょっと趣が異なったのですが、こちらは多足クリーチャに対して、プロシージャルにアニメーションをつける話でした。対象とするクリーチャーはクモ型で、メインボディに2関節を持つ脚が付いているようもので、このクリーチャーをどのように制御するかについての話でした。序盤の方は、一般的なロボット制御の話で、単純な制御から問題点を解決して、一般的に用いられる制御の式を導きだしていたのですが、ここらへんの話はちょっと冗長だった気がします。最後の方は、CGだとそのまま式を使ってしまうと安定し過ぎてしますので、いかにバランスを崩すかという話になり、いかにバランスを取ろうかとする現実のロボット制御の話とは正反対の話で、聴いていて興味深かったです。

メモ

  • プロシージャルアニメーション: 作ったアニメーションをベースにインタラクティブにアニメーションを生成。
  • 肩ジョイントは2自由度のUniversal Joint 肘ジョイントは1自由度のHinge Joint
  • 足が増えると、足を上げ下げするタイミングを考えないといけない。
  • 物理エンジンでジョイントの角度を制限
  • 旋回するときは、旋回方向の足の上げ下げの周期を変える。ボートのオールのように。問題点は安定過ぎるため、演出に向いていない。
  • つまるところ目標の関節角を与えて、そこに近づけるような逆運動で、そのままの目標関数がばねモデルで振動する。そのため、ダンピング項を加える。さらに、目標値に届かなくなる場合が起こるので、それを考慮した項をくわえる。というロボット制御では極めて一般的な話かな?
  • メインボディの6自由度の位置、姿勢と、足のジョイントの制御をどうつなげるか。
  • CGだと安定しすぎてしまうので、Zero Moment Pointを考慮するなどして、わざとバランスを崩す。
  • ロボット工学と違うところは、ロボット工学はバランスを取るために色々工夫すること。CGではそれっぽく動かすためにバランスを崩すことに色々工夫すること。
  • さっきから足をぶちぶちと切られる8足キャラクター スパイダーくん。

SpyPartyの初期ベータマルチプレイヤーゲームアーキテクチャ

Chris Hecker (definition six, inc.)

一世を風靡したMinecraftと同じビジネスモデルで、次に来ると言われているSpyPartyの作者の講演でした。「ゲームデザイン」ではなく「ゲームアーキテクチャ」というところを間違えたのが悪かったのですが、正直良くわかりませんでした。最初に本人も言っていたのですが、早口過ぎて何言っているかわかりませんでした。もちろん英語です。

「ゲームデザイン」と思っていたので、インディーズのゲームを作る上で、どういう考えでゲームデザインをしたのかという話と思っていたら、前半は延々と認証周りのシステムの話。後半もネットワークの問題をどうするかという話を非常に高いレベルで、超高速で話していただいたため、ほとんど理解できずまま終わってしましました。残念。

メモ

  • SpyPartyのゲームデザインの話。スライドがすごく古風な感じ。「私は普段話すのが凄い速いので、できるだけゆっくり話しますね。」と言った途端、超早口。はい。私もですが。
  • SpyParty: Minecraftと同じビジネスモデルのインディースのオンラインゲーム
  • SkyPartyをStartCraftみたいなゲームにしていきたい。
  • モダンな特徴:ロビーがある。ビデオチャットがある。上手い人が見えるような仕組み。誰がオンラインであるかが分かる。マッチメイキング。etc
  • アイテム課金みたいなものは入れたくないので話さない。 プレイヤーのスキルを競いあうようなものを作りたい。
  • 完璧主義者なので、洗練されている、セキュアである、スケーラブルである、柔軟であることを目標とする。これが正しいかは疑問であるだろうが、自分は正しいものだと思っている。インディーゲームの作者であるので、こういうものを目指す。
  • Minecraftのログイン画面のIPを入力させる画面は、講演者の理想とするものの全く反対のもの。 セキュアでもスケーラブルでも全くない。
  • 認証と許可は異なる。運転免許証で自分を特定するのが認証、実際に車を運転することを許すのが許可。
  • 認証まわりの結構濃ゆい話が、超高速で流れて行っているので、そろそろついていけなくなって参りました。
  • MITで作られたチケットシステム(プロトコル):ケルベロスhttp://en.wikipedia.org/wiki/Kerberos_(protocol)
  • ケルベロス クールだぜ! ほとんど拡張せずにセキュアな通信できるぜ! オープンソースで移植性あるぜ! スケーラブルも当然! 皆使っているよ! サポートもあるぜ!
  • オープンソースをデバッグをすることは善良な市民としてできる。
  • オンラインゲームにおけるNAT Firewallの問題に関する話。
  • SpyPartyがどんなゲームであるかを全く分からないまま終わりそうだぜ。 HAHAHA

ARMORED CORE Vの対戦AIにおける階層型ゴール指向プランニングと機体制御

岡村 信幸 (株式会社フロム・ソフトウェア)

前日に続いてACVのAIの話。最初マシントラブルがあったようで、動画が再生されませんでした。他のセッションでもちょくちょくあったので、事前に動画を確認しましょう。とまぁ学会ではよくあることです。

前日はパス検索の話でしたが、今回はACの戦略をどう決めるかの話。ACVでは広大なフィールド内でACの挙動を決めるために階層型ゴール指向プランイングによるAIを採用しています。ゴール指向プランニングは最終ゴールに向けて、途中の行動を決定していくもので、ACVのように広大なフィールドを対象としたときには、意思決定を行うまでの計算コストが大きいため、3段階の階層構造を取っています。この時に状態遷移関数を上手く設計してやる必要があるのですが、目で確認しながらは色々と問題がある。機械学習の手法は見通しがまだ立っていないので見送り。そのため、ACV独自の方法を取った。という流れが少し分からなかったです。結論としては、ACVでは現在状態から目標状態までのパスをいきなり計算するのではなく、機体制御の予測結果を始点として目標状態までのパスを探索するものであるという理解だったのですが、あっているかはちょっと自信がありません。

最後まで聴いた感想としては、行動決定のための状態遷移関数などの設計はまだまだ人手によるところが非常に大きいので、機械学習分野の研究者が入り込む余地があるのではないかと思いました。

メモ

  • AIに要求すること。異なる時間粒度を解決すること。短期戦略と長期戦略。 並行する複数の条件をクリアすること。
  • ゴール指向プランニング。目標を達成する手順を決める方法。
  • はじめにゲームの状況から「状態」を作る。キャラクタの残り体力など。状態は無数にあるが、そのなかに「AIの目標を達成した状態」がある。現在状態から目標状態への状態遷移をする行動手順を見つける。
  • 「行動」は状態遷移の関数として表現。木構造の状態遷移図を作り、ゴールへのパスを求める。より良いゴールへ辿り着くためにパスに評価値を割り当てる。AIの性格を評価関数で表現。
  • パス探索はあくまで予測なので、行動の途中で無効になることがあるので、それに対応する必要がある。
  • 階層型ゴール指向プランニングで、短期戦略と長期戦略に対応。ACVでは3階層にした。第1層は戦略層、第2層は戦術層、第3層は機体制御層。層が下になるほど空間的、時間的にも粒度が細かくなる。
  • 再探索の効率化; 下位階層だけの再探索のときは上位階層は保持。一度失敗したパスは再探索しないようにカリング。
  • 状態遷移関数は「不確定な未来の予想」どう設計するかが匙加減次第。敵も予測する場合、どう全体をマージする?まだまだ改良の余地がある。
  • 複雑な制御ルールの機体の制御は難しい。経路は求まっても、機体の性能次第で、旋回できずに経路を辿れない場合などがある。
  • ACVにおける状態遷移関数の設計方法: 機体を動かしながら目測で決める→色々ダメ 。数理モデルの利用→上手くいくかわからなかったため見おくり。 機体制御の予測結果を初期状態としてゴールへのパスを探索するようなアプローチ。
  • ちょっと状態遷移関数まわりの説明が理解できなかった。
  • 経路探索は行動の経路を探索しているので、空間的な経路と混同しないようにしないとな。動画の壁を蹴って上に昇るなどの例を見て思いました。
  • さっきの状態遷移関数まわりは、現在状態から目標状態へのパスを直接探索するということではなく、機体制御の予測した結果から目標状態に迎えるように状態遷移関数を作る。ということかな?
  • ACVの状態遷移関数の設計を機械学習で解決できるかは検討しているけど、まだできるかどうか分からない段階みたいなので、機械学習屋さんは売り込むチャンスですぞ。

CEDEC2011 1日目

夏はなんだかんだでやること沢山ありました。お久しぶりです。CEDEC2011というエンターテイメント(主にゲーム)の開発者会議に参加しました。パラレルセッションで、同時に聴けるのは1つだけなので、自分が聴講したセッションのみのレポートをします。今回は、聴きながらかなりつぶやいたので、Twitterを参照すると良いかもしれません。ただし、入力が間に合っていない場合があり、いくつかの話をまとめながらなので、正確性には自信がありませんので、そこらへんはご了承ください。内容の詳細な話は、ニュースサイトなどにまとめられているので、気が向いたら、後でリンクを貼ります。

未踏宇宙を拓く「はやぶさ」探査機搭載イオンエンジン

國中 均 (宇宙航空研究開発機構 宇宙輸送工学研究系 教授)

イオンエンジンの説明から、はやぶさプロジェクトがどのような経緯で進められていったか。そして、度重なるトラブルを「こんなこともあろうか」と技術を駆使して解決し、無事に帰還を果たすまでのストーリーを小気味良く話してくださいました。日本の宇宙事業は、他国に比べて予算も規模も小さいですが、その制限された中で、他国よりも優れたことを成し遂げたというエンジニアの誇りみたいなものを感じられるような講演でした。

今回のCEDECのテーマが「CROSS BORDER」ということで、異なる分野からの基調講演ということのようです。話自体はとても面白かったのですが、参加者の期待するものとはちょっと違うのではないかな?という懸念はありました。

また、講演そのものとは関係ないのですが、運営がちょっと拙い感じでした。基調講演が始まっても、かなりの人数が会場に入りきれず、話の途中で次々に人が入ってきたり、入り口が一つしか開放していなかったため、終わったあとも長い行列ができ、次のセッションになかなか行けない人も多数いたようです。このあたりは、反省事項になると思いますので、来年は頑張ってください。

『アニメのエフェクト、ゲームのエフェクト』 ~前篇~

橋本 敬史 (株式会社竜の子プロダクション) ほか1名

スチームボーイなどのエフェクトについてトーク形式で進めていったのですが、画像が全く出てこない。言葉でエフェクトの感じを説明されるので、残念ながら全く理解できませんでした。ホワイトボードに描く場面が多少出てきたのですが、ペンが薄かったりで、ここもちょっと拙い感じ。過去の作品を流しながら、この部分のエフェクトはこんな感じで作りました。というようなセッションを期待していたので、ちょっと残念でした。

開始が25分遅れた割には、その理由が説明されなかったりと、ちょっと不信感を抱かせる感じになってしまいました。講演者の遅刻だったとしても、理由を説明してくれるだけで随分心象は違うものなんですけどね。前後篇通して聴くつもりでしたが、前篇のみにしました。遅れた分、延長はあったのですが、そのおかげで昼飯はまともに食べれず。あ、でもUnity本は買えたことは良かったです。

ショートセッション: AI に命を吹き込むには

並木 幸介 (株式会社フロムソフトウェア) ほか2名

前半は「ぽかぽかアイルー村」のAI、後半は「ARMORED CORE V」のパス検索の話でした。

前半の「ぽかぽかアイルー村」では、キャラクターの行動をそのままスクリプトで記述すると、組み合わせ数が爆発してしまうので、アフォーダンスの考え方により、これを解決するという話でした。通常のAIでは「キャラクターが環境に合わせて行動を決定する」ことに対して、アフォーダンスを用いた場合は「環境がキャラクターの行動を決定する」という考え方でAIを設計します。これによって、組み合わせの数を大きく削減することができるようです。

メモ

  • アイルーが個性に応じて提案する提案の組み合わせ数が爆発する
  • if文で分岐させると一匹あたり1 ,500行のスクリプト
  • バランスに関わるので人海戦術が取りにくい
  • アファーダンスを取り入れる。 環境がキャラクタのAIを決定する
  • アフォーダンス志向にすると、組み合わせ数が抑えられる
  • 提案テーブルとアフォーダンステーブル
  • アフォーダンステーブルの値を提案テーブルの値に加算し、全てのアイルーの提案テーブルをまとめてから、提案を提案する
  • 結論: アファーダンス志向にすることで、組み合わせ数が爆発しがちなAIを上手く設計できる

後半の「ARMORED CORE V」では、3次元空間のパス検索についてでした。2次元のパス検索では地形のようなナビゲーションメッシュからパスを構築できることに対して、3次元ではそれができないため、衝突形状からAABB集合を作成し、それからナビゲーショングラフを構築する方法が説明されました。一度、ナビゲーショングラフが構築されれば、A*アルゴリズムを用いて一般的な方法と同様にパス検索できるのですが、ACVでは上空に上がるときにはコストが高く、下がるときにはコストが低くなるなど、1つのパスのコストが非対称であったりするところが、パスが立体的になった時の特色だな、と感じていました。

メモ

  • 複雑な地形に衝突しないようなパス検索が必要
  • 空を飛んだりするため、地形に沿ったパス検索ではダメ
  • 衝突モデルからナビゲーショングラフを生成し、A*でパス検索
  • 衝突モデルをまずボクセル化。ボクセルには属性別に重み付け。ボクセルからAABB集合に変換。変換の際、適したものになるように、色々工夫
  • 工夫はなるべく均等になるとか、同じ属性のボクセルが同じAABBに入るように、など。焼きなまし法で最適化
  • 工夫はなるべく均等になるとか、同じ属性のボクセルが同じAABBに入るように、など。焼きなまし法で最適化
  • AABBをノード、隣接面をエッジとしたナビゲーショングラフを生成
  • パス検索は普通にA*を利用。機体の機動力を考慮してエッジコストを調整
  • 機体は上空に上がるときはコストが高い。下降するときはコストが低い。非対称なエッジコスト
  • 理想は地形は三角メッシュ。空間は凸包分解。ただ、空間の凸包分解は難しい
  • 焼きなまし法の計算コストが非常に大きい。高速化も頭打ちになっている

ショートセッション: オープンソースとの付き合い方

蒔田 修一 (株式会社オージス総研) ほか3名

前半はオープンソースの基本的な話とかライセンス形態の話、後半はセガ内でオープンソースを適切に利用するための取り組みの話でした。ゲームで良く用いられているオープンソースとはどんなものか。という話を期待して聴きに行ったので、ちょっと思っていたのとは違う感じでした。

「ドラゴンズ ドグマ」のグラフィックス表現の技術解説

清水 大輔 (株式会社カプコン) ほか1名

前半は、時間変化を伴うフィールドで動的にライティングを行う技術の話。スクリーン空間でライティングを行うDiffered Lightingとか、技術的には飛び抜けて新しいことはなかったですが、タイトルに合うような様々な工夫を聴けて面白かったです。

メモ

  • ライトマップなし・動的ライト/シャドウのみ・ディファードライティング採用
  • ディファードライティング:スクリーンスペースでライティングを生成
  • デカールはジオメトリバッファをアルファブレンド合成。正確ではないが問題ない結果
  • 半透明オブジェクトは、2回のディファードライティングを行う。計算コストを減らすためにバッファを縮小
  • アンチエイリアシングFXAAは今年発表されたけれど、既に幾つかのタイトルで採用されている
  • 天球レンダリングは、ミー散乱とレイリー散乱をシミュレート。任意の時間をレンダリングできる
  • グローバルシャドウは、スクリーンスペースでシャドウマスクを生成して、ライトを減衰させる
  • シャドウに対して優先度をつけて、描画負荷、メモリ使用量を一庭に抑える。 優先度は、カメラから見える・カメラとの距離・スクリーン投影面積でつける
  • 良かった点:動的な時間変化が表現可能、ライトマップを使用しないので、変更がしやすい・作業工程が減少、動的な影に利用により表現の幅が増えた
  • 改善すべき点:アーティストが描画負荷を簡単に把握できる制作環境が必要。もっと沢山のシャドウが必要

後半は、広大なオープンワールド上に存在する木や草を扱う話。木を部分に分割して、個別に動かすだけでも随分と良い動きをするなあ、と感心して見ていました。こちらも品質やコストに応じて、適した方法を選んでおり、こういった工夫のノウハウは大事だと感じました。

メモ

  • インスタシングとビルボード
  • 木の揺らし情報はDCCツールで付加してから、MT Framework上で生成。 テクスチャの種類・描画パス・LODで木を部分にクラスタリング。クラスタ内のテクスチャ情報などから重みを付与。大量にデータを作ることが用意
  • ゲーム中の風は、常に流れている全体風と、ゲームイベント連動するポイント風。ゲームイベントは、嵐や爆発など。
  • 風で揺らす仕組みは、波の方程式。 水面の屈折度に近い処理をモデルの頂点に与える。
  • 木をクラスタに分けて、クラスタごとに揺れ方がことなるため、それっぽく揺れる木を作れる。
  • ビルボードに対しても、インスタシングで使った揺らし情報を再利用。
  • 草はDCCツール上で、頂点カラーで草領域を定義。 MT Framework上で草領域に草を生やす。
  • 草はフォワードライティング。地形のアンビエントオクルージョン・ライトマップを参照。 ディファードライティングは草に不向き。 描画時のオーバドローが過負荷。将来的にはディファードシェーディングで対応。
  • 草は、描画領域を倍にすると描画コストが4倍になるので、LODや、クラスタ単位で間引くなどを行うことで、なるべく違和感ないように描画コストを削減。
  • 良かった点:条件設定に基づくデータの作成。物量をこなせる。変更しやすい。
  • 改善すべき点:直感的ではない操作性。満足できる条件を探すのが大変。DCCツールからプレビューまでが長い。

Kinect専用フリーローミング型ゲームを題材に、ジェスチャ認識をゲームに取り入れる時に考えること

三宅 俊輔 (株式会社セガ)

Kinect対応ゲーム「RISE OF NIGHTMARES」を作る際に、ジェスチャ認識をどのように作ったかという話。当然ですが、ジェスチャ認識を利用するゲームは、上手くジェスチャを認識することが必要となります。このチームは誤認識がなくなるまで、とにかくサンプルを収集するというアプローチを取りました。開発が進む中で、サンプルを収集して行った過程でのワークフローの改善や、収集して分かった傾向などが、具体的な例で紹介されたので分かりやすかったです。私もKinectでジェスチャ認識をやったことがあるので、いくつかの苦労は実体験として共感できました。普段、私が出ているコンピュータビジョンや機械学習の勉強会でも見られる似たような話ではありますが、ゲームの場合、実際に動くことが目標なので、より泥臭い感じの話で面白く聴いていました。このような話を聴くと、ゲームは大きな応用先として、研究者のモチベーションとすることは良いことだと思いました。

メモ

  • 足の開き、腰の回転で移動
  • 手を掲げるとポインタ操作
  • 特定のジェスチャを指示されたら、プレイヤは対応したジェスチャを行う。
  • 疲れることへの否定的意見。移動のジェスチャは、足踏みだと疲れすぎるため、足を前に出すようにした。旋回は腕旋回は疲れるので、型のみで。 Kinect使うゲームは、疲れへの考慮が必要となる。
  • アバタのモーションは、アニメーション再生+ジェスチャによる補正。
  • アニメーションにジェスチャ補正する場合はラグが問題になる。アニメータに発注する段階で注意
  • Kinectを用いたジェスチャ認識は、姿勢情報+深度情報。ルールベースで実装。初期は、画面にデバッグ情報を表示し、席を立って動きながら画面を確認。席に戻ってデバッグ。その繰り返し。
  • 問題点: デバッグ効率悪い。疲れる。自分はジェスチャ認識できるけど、骨格や体型の違う他人は誤認識。
  • 対策: サンブル数を増やす。チームで誤認識が問題ないレベルになるまでひたすらジェスチャをテスト。個別のジェスチャごとのテスト。ステージ全体を通してのテスト。
  • チーム内で10ヵ月かけてサンプルを収集。不定期にチーム外テスト。
  • 改善後の開発: 仕様のサンブル収集。データの分析実装。ジェスチャチェック。問題があればデータ再生。デバッグか仕様の再考。過去のデータを再生し、チェック。繰り返し。
  • 改善した開発フローで分かったジェスチャの問題点:
  • 1.指定したジェスチャをできない人がいる。膝を痛めているなど。→ 代替手段を用意する。
  • 2. 想定外のジェスチャをする人がいる。 ドアを開けるのに手でなく、足を使う。 → ユーザの気持ちを十分に検討する。
  • 3. 想定外のタイミングでジェスチャを行う人がいる。 → ユーザの行動を十分に検討する
  • 4. 同時に認識する動作が衝突 しゃがむとほぼ同時に足を下げる。ストレートパンチとフック。→ 予備動作の検討。動作の優先度付け。
  • ジェスチャ認識が絡むと、工程数が非常に読みづらい。数日で終わることもあれば、数ヵ月かかることもある。原因が複数あるため。後から変更が少ないように初期の仕様段階でしっかり検討。
  • 難しくなるようなものとして、同時に認識する動作がある動作。繰り返しとなる動作。成立するまでしばらく維持する必要のある動作。認識結果がブールではなく連続量になるような動作。
  • 人はキャラクタの動きを見て判断することが多い。自然に動きをさせたい場合に効果的。その反対も然り。させたくないジェスチャを誘発させるような動きをさせない。
  • これだけ労力をかけてやる必要があるならば、CV研究者の大きなモチベーションになるなあ。いやまあ、Kinectは元々ゲーム用途ですがw

懇親会

学生交流会など、いくつか非公式懇親会は発生していたのですが、今回は秋猫さん(@akineko)と同じ会社の人とTwitter上で声をかけた人と一緒に飲みに行きました。CEDEC自体は、最近は毎年参加しているのですが、いつも一人で夕食を取っていました。昨年から色々と活動の場が増えたり、Twitterの知り合いが増えたりで、こんな感じで一緒に飲みにいける人もできてきて、嬉しい限りです。ただ、皆さん、悉く自分より5歳くらい年下で、どちらかというと自分は最高齢に近かったので、軽くショックを受けていました。はい。まだ私は学生です。働いていませんよ。

話していた内容は、主にCEDECの講演の内容とか感想とかです。元々、「秋猫さんにゲームプログラミングについて問い詰める」「Unityについて問い詰める」つもりでしたが、なんだか色々話しているうちに夜遅くなってしまいました。また次の機会ということで。あと、自分の無職ネタはまだまだ絶好調です。

第12回 関西CV・PRML勉強会

予定が空いていたので、京都まで出張して発表してきました。
ずっと前から参加しようと思っていたので、ようやく行けて良かったです。
自分の発表内容は、「CVPR2011俯瞰」として、CVPR2011そのものや、名古屋や関東で紹介されたり個人的に興味あるCVPR2011の論文(Oral)を簡単に紹介するというものです。
発表資料はこちらです。
例のごとく、1日前に作っているので、色々と至らない点はありますが、今回は論文を30件以上読んで作ったので、本人の勉強した感はもの凄くありますよ。
Oralとなった論文中心ですが、今年の論文に良く見るものとして、「転移学習(知識転移・マルチタスク学習などの別名あり)」「Deformable Part Model」「Latent SVM」などが挙げられます。
特に「転移学習」はNIPSなどの機械学習の分野からやってきた概念ですが、今年のCVPRはこれに基づくものが本当に多数ありました。
この「転移学習」は、「あるドメインで学習した結果を、未知のドメインに適応する際に上手く動かすための技術」といった感じです。
これは凄い反面、これって本当にできるのか?とも思わせ、機械学習を黒魔術の領域に向かわせている技術ではないかという疑念も湧きます。
ただ、今の自分では全くと言うほど理解力が足りないので、色々読んでしっかりと理解していきたいと思います。
終了後の懇親会では、@_akisatoさんと研究の話とかを長い間していたような気がします。
そのあとは、二次会でお酒を飲み、朝までカラオケをした後で、名古屋に帰ってきました。
まだまだ元気みたいです。
また時間が空いていたら、是非参加しに行きたいと思います。

第14回コンピュータビジョン勉強会@関東「CVPR2011祭り」

CVPR2011というコンピュータの国際会議で発表された論文の中で、発表者が紹介したいものを掻い摘んで説明する勉強会が開催されました。

いつも通り1週間ほど遅れての更新。

詳しい内容に関しては、@takminさんのブログにまとめてあるので、そちらを参照ください。
自分の発表としては、Kinect論文として有名になった「Real-time Human Pose Recognition in Parts from Single Depth Images」を紹介しました。
既に研究室内の論文紹介、名古屋CV・PRML勉強会で発表したものをもうすこし詳しくしたもので、発表資料は以下の場所にあります。
内容の方はスライドを参照してもらうとして、省略します。
なんだか@handy_foxさんがネコミミを持ってきたので、よく分からないうちに装着し、そのまま発表していました。
他の方の論文紹介も面白かったですが、今回の一番のメインとなっていたのはやはり東大 原田先生と 早稲田大 石川先生のお話でした。
原田先生は一般物体認識・シーン認識のトレンドについて、石川先生はエリアチェアから見たCVPRについて話していただけました。
原田先生は、まだまだ面白い話を聞きたかったのですが、用意した資料が時間内に収まらなく、残念でした。
転移学習などを勉強したいと思っているので、資料を見ながら勉強しましょう。
石川先生は、CVPRの採録までのプロセスを紹介してくれて、日本人もCVPRみたいなトップ会議を狙って行かないといけないなという気にさせて頂きました。
今回は、裏で広島大 玉木先生があちこちで暗躍していたようで、思った以上に大きな勉強会となりました。
今年はまだICCV2011という大きなトップ会議が残っていますため、ICCV祭りが開かれることになるようです。
次は発表するかどうかは分かりませんが、また参加しに行こうかなと思っております。

Japan Computer Vision Day

MIRU2011の前日に、関東・関西・名古屋の合同勉強会としてJapan Computer Vision Dayが開催されました。
開催されてから随分経っていますが、まぁいつものことと言うことで。
私は、最初のLightning Talkの担当をやっていました。
総勢13名の発表者(当日1人キャンセルあって、さらに1人追加)の方たちに、Computer Visionに関連することを盛り込みながら、自分の面白いことと思うことや伝えたいことなどを好きに話してもらいました。
自分は自己紹介と石川県紹介でしたが。
このコーナは後から色々な人に好評だったみたいなので、担当できて良かったです。
内容に関してはTogetterを見て推測してください。
続いて、デモコーナではCoreARとTesseract OCRの紹介。
実際に動いているものを見ていると、本当に使えるかどうか分かるので面白いです。
そして、パネルディスカッションにおいてComputer Visionに関連した問題提起をしてもらい、続いて全員参加のグループディスカッションと移りました。
各グループに色々な分野のテーマを与えられて、それについて話し合った上で、ステージ上で発表する形式となりました。
それぞれのグループの内容をまとめるとかなり長くなってしまいますので、そちらもTogetterの方を参照してください。
最後になりますが、今回開催するにあたって活動していただいた各勉強会の幹事様、開催するために色々と奔走していただいた広島大学玉木先生、会場の提供や宣伝などの協力を積極的に行っていただいたMIRU実行委員会(PRMU・CVIM)の方々に深く感謝の意を述べます。
来年は開催されるかどうかは、まだ未定ですが、今回参加していただいた方にも沢山の良い感想をいただき、来年あったら発表してみたい。という方も多数いらっしゃたので是非開催できたらと思います。
ちなみに、MIRU2011本体の方ですが、自分の発表も無事に終わりました。
今回は、あまり良い結果が出ていなかったため、研究自体にはあまり自信がありませんでしたが。
あと、勉強会で色々と話したおかげか、色々な人に気をかけていただいたようでありがとうございます。

第9回 名古屋CV・PRML勉強会

今回は、コンピュータビジョンとパターン認識の国際会議CVPR2011で発表された論文の紹介をテーマに開催しました。
全部で以下の13件を紹介しました。
(発表資料は現在取りまとめ中で、後ほど公開する予定です。)
なお、全てではないですが、元の論文はこちらで見ることができます。
  • [Best Paper] Real-time Human Pose Recognition in Parts from Single Depth Images, Jamie Shotton, Andrew Fitzgibbon, Mat Cook, Andrew Blake
    • Kinectから得られる距離画像を用いて、自分物の姿勢を認識する研究。認識にはRandom Forestsを利用し、学習には人工的に生成した3次元データを利用。
  • Single Image Super-Resolution using Gaussian Process Regression, He He, Wan-Chi Siu.
    • 1枚のみの画像を用いた超解像。元の画像をダウンサンプリングした画像間との関係を回帰し、それを超解像に利用。
  • Space-Time Super-Resolution from a Single Video, Oded Shahar, Alon Faktor, Michal Irani.
    • 空間方向・時間方向の両方への超解像。動画像から時空間のパッチを探索して、ダウンサンプリングしたパッチとの関係を用いて超解像。時間方向の超解像を用いることでフレームレートを2倍にするなども可能。
  • Enforcing topological constraints in random field image segmentation, Chao Chen, Daniel Freedman, Christoph Lampert
    •  画像中の物体のトポロジーを用いることによって、単純なGraphCutなどに比べて、より精度よいセグメンテーションを達成。
  • Natural Image Denoising: Optimality and Inherent Bounds, Anat Levin, Boaz Nadler.
    • ノイズ除去が理論的にどこまでできるのかを調査する研究。
  • Glare Encoding of High Dynamic Range Images, Mushfiqur Rouf, Rafal Mantiuk, Wolfgang Heidrich, Matthew Trentacoste, Cheryl Lau
    •  撮影するときにクロスフィルターを用いることによって、画像にパターンを埋め込み、その情報を利用することで1枚の画像からHDR画像を生成。
  • A Coarse-to-fine approach for fast deformable object detection, Marco Pedersoli, Andrea Vedaldi, Jordi Gonzàlez
    • Deformable Parts Modelを用いることによって、変形する対象の検出を高精度化。識別関数が非凸関数になるためLatent SVMを利用。高速に検出するためにCorase-to-fineな探索を工夫。
  • 2D Nonrigid Partial Shape Matching Using MCMC and Contour Subdivision, Yu Cao, Zhiqi Zhang, Irina Czogiel, Ian Dryden, Song Wang
    •  輪郭が自己遮蔽などで一部が欠けている物体とテンプレートをうまくマッチングする研究。
  • Monocular 3D Scene Understanding with Explicit Occlusion Reasoning, Christian Wojek, Stefan Walk, Stefan Roth, Bernt Schiele
    • 単一画像から人物などを検出する際に3次元情報を利用することで、検出率を向上させる研究。検出枠の重なりから信頼度を求めることで、人同士が重なっているような状況に対処。群衆シーンにおける人物検出問題などに適用。
  • [Best Student Paper] Recognition Using Visual Phrases, Ali Farhadi, Mohammad Amin Sadegh
    •  Bag of Visual Wordsを発展させたBag of Visual Bilingual Wordsを利用することで、対象とする枠内に人+馬などの複数の物体が含まれる場合にでも適切に認識が可能。
  • Cross-View Action Recognition via View Knowledge Transfer, Jingen Liu
    • 転移学習を利用することによって、異なる視点の画像群を用いた行動の認識を行う研究。
  • [Best Paper Honorable Mention] Discrete-Continuous Optimization for Large-scale Structure from Motion, David Crandall, Andrew Owens, Noah Snavely, Daniel Huttenlocher
    • インターネットに存在する同一地点の画像を収集し、それらの画像を用いることによって3次元復元を行う研究。計算量を大幅に削減しつつ、高精度に復元が可能。
  • Markerless Motion Capture of Interacting Characters Using Multi-view Image Segmentation, Yebin Liu, Carsten Stoll, Juergen Gall, Hans-Peter Seidel, Christian Theobalt
    • 人物の形状の事前確率と色情報を組み合わせることによって、セグメンテーションの精度を向上し、それをマーカなしのモーションキャプチャに利用する研究。
数も多く、時間もいっぱいいっぱいまで使ったので、全部を理解することは難しかったですが、興味を持たせる目的としては良かったです。
とりあえず今回で特に気になったキーワードとしては、
  • Latent SVM
  • Deformable Parts Model
  • Knowledge Transfer
です。
このあたりは考え方も面白く、色々なことに応用でき、これからも流行りそうな手法なので、きちんと勉強したいと思います。
次回は、8月はお休みして9月に行う予定です。
いつも通り、何をするかは未定なので、8月中にまた面白そうなことを考えましょう。

Google+で遊んでみた

Qt勉強会で「まだ招待されていません( ー`дー´)キリッ」と言っていたら、その日のうちに招待されたので、色々と遊んでいました。
とは言ってもまだやれることは少ないのですが。とりあえず、まわりの人達に紹介状を送りつけて、50人くらいのサークルを作成してみました。短縮アドレスを取得したので、私のページにはhttp://gplus.to/miyabiarts/で飛べます。

現状でどんなものかというとTwitterとFacebookの中間くらいのもので、ストリームと呼ばれるTwitterのタイムライン相当のものが画面の中心に大きくあり、サークルと呼ばれるこれまたTwitterのリスト相当のもので、スクリーンに表示するユーザを振り分けます。サークルごとにスクリーンが切り替えられるので、特定の人たちのグループを作って、そのポストを閲覧できるという仕組みです。

Twitterのリストだと、つぶやきを見たい人のタイムラインを作りますが、Google+だと誰に発信したいかということも制御することができるため、うまく機能すれば特定のグループとの情報共有により、議論を活発に行えるかもしれません。あくまでうまく機能すればですが。

使っていて思ったことをいくつか羅列しておきます。

  • UIが見やすい
  • 画像アップロードやGPSに基づくタグ付けなどが便利
  • iGoogleのように情報集約できるようになると嬉しい
  • UIのカスタマイズを色々したい
  • 個人のプロフィールページのカスタマイズ(GoogleSiteの機能を利用)
  • 外部アプリとの連携
  • Webアプリの作成(GoogleAppsと統合)
  • 特定のサークルごとに色を割り当てて、選択しているサークルの色でストリームを表示

どのくらいの頻度で更新されていくかは分かりませんが、気がついたことがあったら意見・要望としてフィードバックにガンガン投げるようにしています。

現状での自分の使い方としては、ブログほどまとめるほどのものでもないけど、Twitterだと収めきれない自分の意見を述べるようにしたいと思います。こちらのブログは基本としては技術ブログという立ち位置で。

最後に、招待して欲しいという方がいれば、ご連絡ください。

Qt名古屋勉強会

関西ゲームプログラミング勉強会の時に補足されたようで、そこからお話があって、発表させていただくことになりました。
名古屋ではQt勉強会は初ということで、結構注目されていたようです。

  • 日付:2011年7月9日(土) 13:00 – 17:30
  • 場所: 株式会社 エイチーム セミナールーム1 (名古屋市西区牛島町6番1号 名古屋ルーセントタワー32F)
  • イベントページ:http://atnd.org/events/16926

元々は物理エンジンBulletについて話すことでしたが、そのままだとQt全く関係なかったりしますし、普段3Dを触ってない方には分からない点も多かろうと、丁度良く出ていたQtの3D周りを扱うQt/3Dとともに紹介することにしました。
Qt/3Dのインストール方法などは前の記事で書いています。

発表資料はこちらに置いておきます。
内容としては、前半はQt/3Dで、後半はBulletについて話しました。
前半については自分もQt/3Dは初めてだったのでなるべく分かりやすい資料を作っていたのですが、後半のBulletは関西ゲームプログラミング勉強会のものをほとんどそのまま使っていたら、自分で話していて、あぁコード量多くて、普段やっていない人には分かりづらいな。と感じてしまい、その点では反省しているところです。
ただ、一応デモとして見えるものは作っていたので、なんとなくでも理解していただけたようなので、それは良かったです。
あと、最初にQtで作っていたものとして、3Dモデラをちょっと紹介していましたが、言葉足らずでメタセコイアの開発者と間違えられたようで、どうもすみません。
ちなみに3Dモデラの方は現在再開発中で、ひと通りできたらシェアウェアとして公開しようかと考えております。

他の方の発表では、Qt5の紹介、QMLのライブコーディング、MeeGoの紹介と名前は知っているけど、実際はあまり理解していなかったものを詳しく聴けたため、とても面白かったです。
特にQMLは手軽にアニメーションできるUIを作れるので楽で良いなと思いました。

懇親会は、名古屋に結構長く居るのに行ったことがなかった世界の山ちゃんでした。
他の勉強会とはまた違った方向性の面白さがあり、懇親会中ずっと話しておりました。
それと、とにかく言われていたことは「英語を勉強しろ」でした。
英語を勉強して、海外に行きましょうかな。本気で。

二次会として立ち飲み居酒屋に行って、また色々話させて頂き、最後まで楽しい時間を過ごせました。
次回があれば、またなんだか発表しそうな雰囲気が漂っていましたが、時間がある限り、いくらでも発表しますので是非お願いいたします。

最後にですが、本当に暑い日でした。
名古屋駅前は40度近くの外気温があり、汗が止めどなく出る状態でした。

FBO

今回はFBO(Frame Buffer Object)を扱います。
FBOが何かと一言で言ってしまえば、ディスプレイではなくテクスチャ上にレンダリング結果を書き出すためのものです。
ハードウェアの拡張機能の一つに入るため、グラフィックボードによっては使えない場合がありますが、最近の環境ではまず間違いなく動くでしょうから、それほど心配する必要はないはずです。

今回、サンプルとして一度FBOにテクスチャ付きのキューブをレンダリングし、そのレンダリング結果をテクスチャとして再度キューブに貼りつけたものをディスプレイ上に表示します。

FBOはFBOハンドルに対して、RGBテクスチャおよび深度テクスチャを関連付けることによって有効にします。

テクスチャの作成

各テクスチャの作り方は以下のとおりです。

RGBテクスチャ

RGBテクスチャですが、こちらは前回と全く同じように作成して大丈夫です。
ここで、TexSizeはテクスチャのサイズを示す定数で、今回はテクスチャは正方形になるように作成しています。

GL.GenTextures(1, out colorTex);
GL.BindTexture(TextureTarget.Texture2D, colorTex);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, TexSize, TexSize, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);

深度テクスチャ

続いて、深度テクスチャですが、作り方の流れはRGBテクスチャと全く一緒ですが、GL.TexImage2Dに指定するパラメータが多少違います。

GL.GenTextures(1, out depthTex);
GL.BindTexture(TextureTarget.Texture2D, depthTex);
GL.TexImage2D(TextureTarget.Texture2D, 0, (PixelInternalFormat)All.DepthComponent32, TexSize, TexSize, 0, OpenTK.Graphics.OpenGL.PixelFormat.DepthComponent, PixelType.UnsignedInt, IntPtr.Zero);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);

FBOの作成

FBOハンドルはGL.Ext.GetFramebuffersを用いて、他のハンドラと同じように作成できます。
そして、GL.Ext.BindFramebufferに作成したハンドラを設定し、操作対象とします。
続いて、先ほど作成したRGBテクスチャ・深度テクスチャをFBOに関連付けます。
以上で、FBOの準備は整いました。
ここで気をつけることは、GL.Ext.BindFramebufferで指定したFBOをそれ以降のレンダリング対象となるため、初期化の後にFBOを0と設定することで、ディスプレイをレンダリング対象としておきましょう。
これによって、何も表示されないということを防ぐことができます。

GL.Ext.GenFramebuffers(1, out fbo);
GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, fbo);
GL.Ext.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0Ext, TextureTarget.Texture2D, colorTex, 0);
GL.Ext.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.DepthAttachmentExt, TextureTarget.Texture2D, depthTex, 0);
GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, 0);

レンダリング

GL.Ext.BindFramebufferでレンダリング対象とするFBOを指定することで、描画先を切り替えることができます。
今回は、まず作成したFBOに対して、テクスチャ付きのキューブをレンダリングします。
用いたシェーダは前回と全く同じものです。

GL.Ext.BindFramebufferでFBOを指定した後、気をつける点としては、クリアする領域をFBOに関連付けたテクスチャのサイズとするため、GL.Viewportを正しく設定してやることです。
その他の点に関して、通常のレンダリングと何も変わりません。

GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, fbo);
GL.Viewport(0, 0, TexSize, TexSize);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

...

GL.UseProgram(program);

GL.UniformMatrix4(GL.GetUniformLocation(program, "viewProjection"), false, ref viewProjectionMatrix);
GL.UniformMatrix4(GL.GetUniformLocation(program, "world"), false, ref worldMatrix);
			
GL.ActiveTexture(TextureUnit.Texture0);
GL.BindTexture(TextureTarget.Texture2D, tex);
GL.Uniform1(GL.GetUniformLocation(program, "tex"), 0);
			
cube.Render();

今度は、FBOにレンダリングした結果をテクスチャとして貼りつけたキューブをディスプレイ上に表示します。
ディスプレイ上に表示するため、GL.Ext.BindFramebufferに0を与えます。
そして、今度はクリアする領域をディスプレイ(コントロール)のサイズとするようにGL.Viewportを正しく設定します。
最後に、FBOに関連付けていたテクスチャハンドラを貼り付けるように設定し、キューブを表示します。

GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, 0);
GL.Viewport(0, 0, glControl1.Width, glControl1.Height);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

...

GL.UniformMatrix4(GL.GetUniformLocation(program, "viewProjection"), false, ref viewProjectionMatrix);
GL.UniformMatrix4(GL.GetUniformLocation(program, "world"), false, ref worldMatrix);

GL.ActiveTexture(TextureUnit.Texture0);
GL.BindTexture(TextureTarget.Texture2D, colorTex);
GL.Uniform1(GL.GetUniformLocation(program, "tex"), 0);

cube.Render();

後片付け

後片付けでは、各ハンドラを削除します。

GL.DeleteTexture(tex);
GL.DeleteTexture(colorTex);
GL.DeleteTexture(tex);

GL.DeleteFramebuffers(1, ref fbo);

まとめ

以上が、OpenTKでFBOを扱うサンプルコードとなります。
今回のサンプルでは実際に何に使うかはイマイチ分かりづらいですが、環境マップやシャドウマップなどの応用は様々です。
そのうち、このあたりの応用も扱いたいと思います。