2010年11月24日水曜日

サンプルを動かす

XNA で Wiiリモコン使ったサンプルが
KOSAKA Laboratory Tips にありましたので、早速ためしました。

コンパイルして動かすのは問題なし。ソースコードのお勉強です。

プログラムのキモは二つあって、XNA/DirectX 関連の部分と、リモコンから取得した値の意味の部分。

XNA


  public class Game1 : Microsoft.Xna.Framework.Game {
    protected override void Initialize() {
    protected override void LoadContent() {
    protected override void UnloadContent() {
    protected override void Update(GameTime gameTime) {
    protected override void Draw(GameTime gameTime) {
ゲームメインのクラスは Microsoft.Xna.Framework.Game のサブクラスとして作り、各種関数をオーバーロードするようです。

Update/Draw がフレーム毎に呼ばれ、それぞれゲーム内部処理と描画処理を記述。

3Dモデルや音楽などは Content という機能で扱うようです。
コンテントプロジェクトというものを作り(XNAプロジェクト作ると自動的にできる)、そこにコンテンツファイルを追加。
すると扱いやすいよう変換して実行バイナリに埋め込まれるそうです。
標準的なデータタイプはそのまま扱えるし、独自形式なら解釈する部分を書けば拡張できる、と。
なかなか良い仕組みですね。

コンテントのロードは

    protected override void LoadContent() {
      this.xfile = Content.Load("wiimodoki");  //Xファイルの読み込み
      foreach (ModelMesh mesh in this.xfile.Meshes)  //メッシュごと
      {
        foreach (BasicEffect effect in mesh.Effects) {
          effect.View = Matrix.CreateLookAt(...);
          effect.Projection = Matrix.CreatePerspectiveFieldOfView(...);
        }
      }
Content.Load でできる、と。Xファイルからモデルを読み込んでいるのでしょう。

コードによると、Xファイルには複数の Mesh があり、メッシュはさらに複数の Effect を持ち、Effect には方向などを指定できるらしい。
ここはちゃんと調べましょう。

メッシュ(ModelMesh)はひとかたまりの3Dオブジェクト、と言ってしまっていいのかな。
独立して動かすことの出来る単位だそうです。
人体で言えば頭とか上腕とか、そのくらいの分割単位になるんじゃないでしょうかたぶん。
結び付けられる親ボーンも一つ参照しています。

メッシュはさらにパーツ(ModelMeshPart)に分かれます。
これはマテリアル情位で分割するものらしい。
デバイスに送る頂点情報やジオメトリ情報を持っているそうで、ここが最小単位ですかね。
他にもいくつかの情報を持っていて、その一つにエフェクトがあります。

エフェクトが何なのかはちとすぐには見つからないので保留。
シェーダ関連の情報が入るみたいです。
描画処理の肝の部分でしょう。
そういうわけで、向きのデータなどはエフェクトに入れるわけですね。

また bluetooth

ところで上のテストやっている間、何度も何度もリモコンの接続やり直したわけですが、やっぱ耐え難いものがあります。

もうちょっと調べて見ると
kako.com
flatlib.jp
と、スタックを叩いて自動的に接続するような手法を採っているようです。

Broadcom スタック叩いた経験から、大体やることはわかりますので、ちゃんと作った方が後々効率よさそうです。
形態はアプリ内蔵か常駐プログラムですかね。XBOX化を考えるんなら内蔵形式がいいのかな。

0 件のコメント:

コメントを投稿