クリエーターズクラブオンライン更新 07年9月号
クリエーターズクラブオンラインのサイトが更新されました。先月はGameFestの開催と重なったので数が少なかったのですが、今月は4つのサンプル、3つのユーティリティ、そして1つのアーティクルが追加されました。そんな訳で例によって例の如く私なりに紹介させて頂きます。
Collision Series 4: Collision with a Heightmap
このサンプルはコンテントパイプライン上でビットマップイメージから生成されたハイトマップ上での衝突判定をするサンプルコードです。コリジョン判定自体は単に指定した座標の高さを取得するシンプルなものですが、カメラも衝突判定を使っているのでカメラが地面にめり込んでしまうという不具合を回避しています。
このサンプルでは、ランタイム時に独自フォーマットのモデルデータを扱う為に、コンテントパイプラインのDOMに格納されたモデルデータの取得、カスタムコンテントの作り方、そしてランタイム時のデータの読み込みとモデル描画のコードが含まれています。自分なりの独自フォーマットデータを作るときの雛形として有用なサンプルです。
通常、複数のモデルを描画するにはDrawPrimitive等のメソッドを複数回呼びますが、描画するモデルの数が大量に増えた場合、GPUが実際に描画するよりもDrawPrimitiveの呼び出し自体に掛かるオーバーヘッドの方が大きくなる場合があります。
この問題を解決する為にWindows上ではモデルインスタンスと呼ばれる手法が使われます。このサンプルでは同じモデルを複数の行列で示される位置に描画するようになっています。私のPC環境ではモデルインスタンス使用時と、インスタンス無しステートバッチング無しの状態と比較すると8倍程のフレームレート差がでています。
Xbox 360上ではvfetchと呼ばれるシェーダーのインラインアセンブラを使って実現しています。
このサンプルでは任意のモデルに使われている三角形ポリゴンをひとつずつアニメーションさせることで、モデルがバラバラになっていく視覚効果をだしています。
コンテントパイプライン内で指定されたモデルを独立した三角形ポリゴンのモデルデータに変換し、必要なパラメータを追加しています。ランタイム時は頂点シェーダー内で指定された時間によって三角形の位置や回転状態を計算しているので時間の逆再生などもできるようになっており、CPUリソースを使わないという利点もあります。
XNAフレームワークにはHermiteベースの一次曲線を使うためのCurveクラスがあります。このクラスの使い道として代表的なのはPosition値を時間として扱うアニメーションカーブで、モデルのアニメーションに使われるのはもちろん、例えばゲーム内の時間によって太陽の位置やフォグ等のパラメーターを変化させたりするときに使います。
簡単な曲線や直線の場合はプログラムで直接書くだけで済みますが、複雑になってくると欲しくなってくるのがエディタです。
このユーティリティには単体で動作するCurveEditorがあり、このエディタ内では以下の機能があります。
- 複数カーブの同時編集
- タンジェント値の自動計算
- タンジェント値の視覚的編集
- コンテントパイプラインでそのまま使えるXMLファイルへのCurveの読み書き
- 任意のキーのPositionとValueを直接編集できるテキストボックス
- Undo/Redoサポート
また、CurveEditorが使っているCurveControlは使い回しができるユーザーコントロールとして設計してあるので、自分で作ったゲームエディタ内で使ったり、デバッグビジュアライザーを作る時に便利です。
このユーティリティーではXbox 360コントローラーの入力情報をリアルタイムに見ることができます。振動モーターの有無や複数のコントローラーの接続状態も右上のアイコンで表示されるようになっています。
基本的にXbox 360用の入力機器は標準コントローラーとしても使えるようになっています。ですから、ダンスパッドやギターコントローラーを繋げた時に、標準コントローラーのどのボタンやキーに割り当てられているかを調べる時に便利なユーティリティではないでしょうか?
Xbox 360 Controller Button Glyphs
とか 等のXbox 360コントローラーのボタンのイメージがTGA形式で入っています。また、SpriteFont用にXboxControllerSpriteFont.tgaも予め用意されているので、ゲームの 「Aボタンを押してください」 等のメッセージテキスト中のAの部分を実際のコントローラーのイメージにしたりする時に便利です。
Ship Game Article - 3D Collision using the BoxCollider library
このアーティクルは、先月追加されたShip Gameで使っている衝突判定用のライブラリ「BoxColider」を自分で作ったゲームで使うための方法が書いてあります。このライブラリではOctreeベースの衝突判定、および衝突した場合にどこまで移動することができたかという情報も取得できるようになっているので、ゲームで使うときに便利です。
フィードバックを反映した更新
これらの更新の中には、クリエーターズクラブ内のフォーラムに寄せられた意見を元にしたものがあります。但し英語のみなので日本からのフィードバックはMSDNフォーラムに気軽に 「こんなサンプルが欲しい」 といった投稿をして貰えれば、できるだけクリエーターズクラブの更新の方にも反映するようにします。
Comments
Anonymous
September 28, 2007
PingBack from http://www.artofbam.com/wordpress/?p=3800Anonymous
November 13, 2007
クリエーターズクラブオンラインが "We are currently unable to serve your request We apologize, but an error occurred and your request could not be completed. This error has been logged. If you have additional information that you believe may have caused this error please report the problem here." と出て利用できないのですが・・・Anonymous
November 13, 2007
クリエーターズクラブオンラインが We are currently unable to serve your request We apologize, but an error occurred and your request could not be completed. This error has been logged. If you have additional information that you believe may have caused this error please report the problem here. と出て利用できないのですが・・・