作りたいゲームの種類を話しました。ゲーム班の実験日は木曜日に決定。班分けがまだなのと、最初の課題がBlenderによる3次元モデルの作成PS2で3次元モデルの表示なのでしばらくはここにログを書くことにします。†Blenderをダウンロードし、自分のiBookにインストール。チュートリアルはここを参照。†SubversionをiBookにインストール。X用バイナリはここからダウンロード。実行とりあえず、example/simple/tags/second/simpleBall.xmlexample/simple/tags/second/cube.xmlexample/simple/tags/second/red_car.xmlを動かしてみました。†blenderで作成したものとx3d2xmlで変換したものに違いがでる原因はどうやら親オブジェクトの宣言にあるようです。j』で全体を一つのオブジェクトにして、頂点の数が2700を超えると表示できなくなってしまうことがわかりました。†こまめにメモしていくのを忘れてしまったので、思い出しながらやってきたことをまとめていきます。四角の範囲内にあるオブジェクトや頂点を選択。Bを2回押すと円形の選択範囲になる。選択したオブジェクトや頂点の移動。Gを押した後にx,y,zを押すことでその軸に平行して移動ができる。選択したオブジェクトや頂点の回転。controlを押しながら回転させると5度ずつ回転できる。一度Rを押すと回転方向が90度変わる。選択した頂点や辺、面を複製して引き延ばす。中心点をカーソルに合わせて移動オブジェクトモードでオブジェクト全体を移動させると中心点は一緒に移動する。オブジェクトを追加するときはカーソルを中心点としてオブジェクトが置かれる。色を変えたい部分をエディットモードで選択する。Materialsの『New』を押す。2』になったら『Assign』を押す。これで色が変更できる。編集画面を2つ以上用意する。Select」に変更する。使用できるオブジェクトはMeshで宣言したものだけ。Surface等は使えない。x3dとlwoでの違いx3dからxmlに変換した場合テクスチャーが貼れる。blenderでのオブジェクトの中心を全てblender上の中心に揃えないとPS2での表示がずれてしまう。lwoからxmlに変更した場合オブジェクトごとの中心点は関係ない。blenderの中心との位置関係がそのまま反映される。blenderでの色の変更がそのまま反映される。テクスチャーは貼れない。†blenderで作成したオブジェクトの表示の次の課題はベクターユニットを用いてレースゲームで車のタイヤを回すこと。ベクターユニットは行列の乗算やコピー、内積等を計算する関数です。オブジェクトが向いた方向に移動したり、オブジェクトにカメラが付いていくような処理をするときに使います。主なベクターユニット関数を以下に示します。回転角rxよりX軸を中心とした回転行列を求め、マトリックスm1に左側から乗算して、その結果をマトリックスm0に与える。X軸だけでなくY軸、Z軸を中心とした関数もある。3ついっぺんに回転させる関数もある。その他にも多く存在するので詳しくはlibvu0.cを参照のこと。関数を知ることよりも、ベクトルの乗算や内積で何ができるかを把握することが重要になります。カメラや光源などの設定にもベクターユニットを用います。オブジェクトの移動とカメラの設定の勉強として作ったものをgame/ps2/awinに置いておきます。†ネットワーク型のゲームを作成するために使用したLindaについてまとめる。Lindaとは、タプルと呼ばれるIDとDATAがセットになったものを、各クライアントがLindaサーバに対して書き込み、読み込み等を行うことでデータの交換、共有を行い、通信をしているシステムである。以下にLindaのAPIを示す。byteのデータを書き込むコマンドである。id);指定したIDのタプルを読み込みsequence番号を取得する。指定したIDのタプルはデータを読み込んだ後サーバ上から削除される。id);指定したIDのタプルを読み込みsequence番号を取得する。指定したIDのタプルはデータを読み込んだ後もサーバ上に残る。psx_sync_n();psx_out(),psx_in(),psx_rd()等のタプル送受信のAPIを実行した段階ですぐに通信が行われるのではなく、送信タプルはCOMMANDキューに、受信タプルはREPLYキューにためられる。このpsx_sync_n()はそれをプログラマの好きなタイミングで一気に送受信するためのAPIである。seq);psx_in()かpsx_rd()で取得したシークエンス番号を引数として渡すと、要求したデータがREPLYキューにあればタプルへのポインタを返す。そのポインタには、先頭にタプルのヘッダ情報12byteが格納されていて、その後にデータが格納されている。reply)psx_reply()で取得したタプルを消去する。これをしないとREPLYキューにデータが溜まってしまう。Lindaでの通信の流れを下の図で示す。図からも分かるように実際にLindaにアクセスするのはpsx_sync_n()を実行したときだけである。Lindaは非同期である。psx_sync_n()が実行されるまで通信は行われないので、相手との同期はとれません。この方式なのでプロセッサは待ち状態のときに余分な情報を処理する必要がなくなる。実際には図のように送信側と受信側がきっちり分かれるのではなく、全てのクライアントが送受信することになる。†Lindaは非同期なので送信元は受信先が受信したのを確認してからpsx_out()を行う必要がある。しなければLindaサーバにタプルが溜まってしまい処理が重くなってしまう。受信側も受信したことを示す為のタプルを送り、送信側はそのタプルをpsx_in()かpsx_rd()で受け取ってから、次のpsx_out()をしなければならない。データが更新されていないのにpsx_out()を繰り返してしまうことでもLindaサーバに負荷がかかってしまう。以下のようにしてデータが更新されたときだけpsx_out()をする必要がある。}また、psx_reply()が完了したら、psx_free()を実行してREPLYキューにデータが溜まるのを防ぐ必要がある。こんな感じってことになってます。レースゲームの改良では、y03/後期のゲーム班が作成した「五木さんレーシング」に主に以下の改良を加えました。コースが崩れるのを軽減し、コースの見た目をUPカーブ時に車体の横が見えるようにしたタイムの表示タイトル画面や文字等に使用するpngファイルをよりきれいにプログラムでもちょくちょく細かいところの改良はしましたが、見た目重視の改良を加えました。以下に詳しく載せます。†コースの改良はblender上での工夫が大きな鍵になりました。コースが崩れる原因は、処理を軽くする為にカメラの後ろにいったオブジェクトの頂点の削除をする行う処理の設定が悪いせいらしいです。本当はそこを直すべきなのですが、かなりしんどそうなのでblender上で調整しました。コースのオブジェクトを大きな長方形一枚にするのではなく、blenderのMeshの中にあるGridのように細かくオブジェクトを分割することで、コースが崩れるのを軽減しました。この方法ではオブジェクトの頂点の数がかなり増えるので、コースを細かく分けて読み込まなくてはならなくなりました。カメラをコースから少し離れたところに設置することでもコースが崩れるのを軽減させました。それでもまだ少し崩れるところが確認できるので、やはり元を絶たないとダメみたいです。前のレースゲームではカーブの時もカメラが車の真後ろを移していて、カーブを曲がったという感じがしなかったのでそこを改良しました。具体的には十字キーの左右が押されたとき、カメラのアングルを少し傾けるようにしました。†タイムはclock()を使って実時間に近い値を得て、フォントを表示するスプライトを使って表現しています。この方法だとlindaでの通信時など処理が重くなるとタイムの表示も遅くなってしまいます。PS2本体の内部時計を用いてタイムの計測をする方が望ましいやり方ですが、その実装まではできませんでした。†まさに見た目の改良になる部分です。PS2上でpngを表示をするとかなり明るく映るのでそれをふまえてpngの作成をしなくてはなりません。黒は透過処理されるように設定されていることも注意しなければなりません。pngのファイルは縦横の大きさが2^nである必要があります。nが0<n<10の整数でなくてはなりません。n=10の1024の大きさのpngを使うと表示がバグってしまいます。元のpngが小さくてそれを拡大表示すると、かなりPS2上での表示がぼやけてしまします。タイトル画面等のように表示だけの処理ですむ場面では極力大きなpngを使いました。後はきれいな絵を描いてpngに出力するだけです。僕たちが改良を加えて出来上がった『孫六レーシング』はsvnのgame/ps2/magoroku_racingに置いてあります。ついでにベクターユニットとカメラの勉強の為に作った『スターフォックスもどき』もgame/ps2/awinに置いておきます。『孫六レーシング』の名前の由来を書きます。『五木さんレーシング』を改良して作ったので「五の次は六だろ」と思って六のつく名前にしました。この孫六レーシングが改良されて、あるいはまた新たにレースゲームを作る人がいたら是非次のレースゲームの名前には『七』を入れてください。いうのがあった方が「代々続いてるんだなぁ」って感じがでるような気がするもんでさ。