Game Programming

Game Programming

Menu Menu

Game を作るには...

結構、いろんな知識が必要。

何を勉強すれば良いか?

でも、給料は安いです。

儲かるのはどこか?


プログラミング

ゲーム作成の中で、プログラミングは実は限られた一部。

でも、新しい効果とかを出すには必須。

ゲーム機の寿命は短い。

比較的特殊なCPUや、デバイス(GPU)を取り扱う

従って、常に新しいもの勉強する必要がある。


ライブラリを作成する

自分で、いろんなツールを作成していく。

自分で道具を作っていく。

もし、良いライブラリができたら、それを販売する。


線形代数

3D を取り扱うゲームでは必須。

線形代数は、もっとも役に立つ数学。

フーリエ変換とかも、線形代数の一部。


ゲームの設計、企画

物語を作れる方が良い。これは、プログラミングとかの技術とは別物。


演出

かっこの良い動作

登場のさせかた

見せる順序

これも、プログラミングとは関係ない。


大学で、なんでゲームプログラムを勉強するの?

Real-time Programming の例題として

複雑な実際のプログラミングを体験する

チームプログラミングを体験する

その中で、出てきたプログラミングの問題を解決する


研究としては

時間を含む仕様を保証する

作成したプログラムが正しいことを調べる

基本的には、あらゆる可能な状態を調べる

普通に調べていると調べる状態が増え過ぎる


うちの研究室では...

Cerium Engine
    PS3 上のゲームフレームワーク
    並列実行
    Rendering Engine
    SceneGraph

Continuation based C
    関数呼び出しのないC
    Code Segment / Data Segment の組合せ
    仕様記述からハードウェア記述とかも
    検証系を内蔵

Federated Linda
    分散ネットワークフレームワーク
    この上で、サーバのないネットワークゲームを作る
    スーケーラビリティ 


英語

ほとんどの資料は英語です。

プログラムでも英語の単語がたくさん出てくる。

英語の名前を付けるセンス。

自分で作ったものを世界中の人に使ってもらう。


英語の勉強の仕方

若い時の方が英語の勉強は絶対に楽。

2ヵ月、毎日2時間。(日曜日も)

英語の勉強は、体力作りと同じ。頭の中に回路を作る。

覚えようとする必要はない。

文法も必要ありません。

考えないで、英語が出てくる。英語で考えるようにならないとダメ。


とにかく量をこなす

読んで聞く。

書いて話す。

5000ページ程度を目標にする。

ペーパーバックで10-15冊ぐらい。

自分の好きなものを読んで良い。

興味があれば、技術書でも良い。

数学の教科書とかでも。

英語の方が良い教科書が多い。


テレビドラマ

日本語字幕はだめ。

英語を英語字幕で聞き取る。

日本だと、見れない場合が多い。DVDなら、必ず見れるはず。


500単語

君達は既に習ってます。これだけ知っていれば、後は、英語を使いながら覚えるので十分。

日本語でも知らない単語は日常的に出てきている。

英和辞書を引かない。

英英の辞書を使う。


アクセント

発音は悪くても通じる。

アクセントが間違っていると通じません。

なので、アクセントだけは覚える。

でも、だいたい決まったルールがある。

しばらく覚えれば、あとは自然にわかるようになる。


2Dモデリング

色彩

ドットで書いていっても良い

でも、今は結構大きいので大きな絵を書く必要がある。


3Dモデリング

Blender というフリーのツールがあります。

是非使ってみよう。


ポリゴン

三角形を集めて、3Dの物体を作る。

三つの点があるので、

    (x_1, y_1, z_1)
    (x_2, y_2, z_2)
    (x_3, y_3, z_3)

の9つのデータが必要。


Texture

ポリゴンに貼られた 2D の画像

なくても良いが...


3D Object

ポリゴンが集まってできた一つのオブジェクト


XML

Blender からの出力を、XML にして書き出す。

Cerium Engine は、これを表示する。


シーングラフ

3D Object の集合が作る木構造

   move()       シーングラフの各ノードの動作
   collsion()   シーングラフの相互作用


move の例

    void
    ball_move(SceneGraphPtr node, int w, int h)
    {
	node->xyz[0] += 4;
    }
    void
    ball_coll(SceneGraphPtr node, int w, int h, SceneGraphPtr tree)
    {
	if (node->xyz[0] > 600) node->remove();
    }


Rendering

シーングラフを画面上に表示する

普通、Open/GL とか GPU とか使うんだけど、

うちでは、

    Cell を使って、ソフトウェアで1dotずつ書く

(一つは教育的配慮。一つはCeriumの例題として)


Polygon の座標の計算

まず、シーングラフから、ポリゴンの座標を計算する


Span

同じ y 座標の直線を取り出す。

光の方向と、Polygon の向き (法線)の情報が必要。


Z Buffer

描画した z 座標を覚えておく

置くにあるものは描画しない


プログラミング

C とか C++ が多いです。

Java 3D を使っても良い。

OpenSceneGraph と言うのが便利。

Open/GL を使って Rendering を行う。

しかし、PS3 では使いにくい。


Real-time Programming

だいたい、メインループがある。

   SceneGraph *scene_graph = make_scene_graph();
   while(running) {
       get_input();
       scene_graph->move();
       scene_graph->collision();
       scene_graph->rendering(display);
   }


PS3 のアーキテクチャ

PS3 には、6個のSPUと、2個のPPUがある。恒常的にSPUを使わないと速くならない。

100%並列化では、実行時間は 1/6

50%並列化すると、1/6*0.5 + 0.5 = 0.58

80%では、 1/6*(0.8)+0.2 = 0.33


動作をタスクに分解する

コピーをパイプラインで隠しながらTaskを実行する。

かなりめんどくさいです。


SIMD 演算

SPU 上では、4 float (4byte x 4) の演算が高速

128bit register が128個もある。


4 x 4 行列

座標は三次元で十分なんだが、平行移動を含むには、4 x 4 行列が便利

斉次行列と呼ばれる。


平行移動


拡大縮小

省略


回転


回転の合成


ポリゴンの頂点と法線ベクトル

ポリゴンは三角形。法線ベクトルは、その三角形に垂直なベクトル。


外積

垂直なベクトルは、外積で計算する。

| ex ey ez |
| Ax Ay Az |
| Bx By Bz |

(A x, Ay, Az)

と、

(B x, By, Bz)

の外積を取ると、

(A y * B z - A z * B y , A z * B x - A x * B z , A x * B y - A x * B y )

となります。大きさが|A|*|B|で、AとBに直交したベクトルになります。

A との内積を取ってみて、直交していることを確認しよう。

    A X B = - B X A
    kA X B =  k(A X B)
    A X kB =  k(A X B)
    (A+B) X C =  A X C + B X C
    A X (B+C) =  A X B + A X C
    e_x X e_y = e_z 
    e_x X e_z = e_y 
    e_y X e_z = e_x 
    e_x X e_x = e_y X e_y = e_z X e_z = 0

という性質を満たすベクトルの積は外積となる。


内積

ベクトルへの射影を計算します。

A x * B x + A y * B y + A z * B z

    |A|*|B|cosΘ
    A * B =  B * A
    kA * B =  k(A * B)
    A * kB =  k(A * B)
    (A+B) * C =  A * C + B * C
    A * (B+C) =  A * B + A * C
    e_x * e_y = 0
    e_x * e_z = 0
    e_y * e_z = 0
    e_x X e_x = e_y X e_y = e_z X e_z  = 1

という性質を満たすベクトルの積は内積となる。


衝突判定

法線ベクトルとの射影を取ることによって計算するのが簡単。

距離を使っても良い。


パラメータ表示

t clock 後の速度ベクトル V で移動している物体Pの位置。

    P + t V


逆行列

回転行列は、θを-θにすれば良い。

回転行列以外の逆行列の計算は繁雑。なるべく使わない。


実際のプログラムは...

いろいろ繁雑。


問題

課題を解いて下さい。

Shinji KONO / Fri Nov 20 09:18:25 2009