Game Programming
Menu MenuGame を作るには...
結構、いろんな知識が必要。何を勉強すれば良いか?
でも、給料は安いです。
儲かるのはどこか?
プログラミング
ゲーム作成の中で、プログラミングは実は限られた一部。でも、新しい効果とかを出すには必須。
ゲーム機の寿命は短い。
比較的特殊なCPUや、デバイス(GPU)を取り扱う
従って、常に新しいもの勉強する必要がある。
ライブラリを作成する
自分で、いろんなツールを作成していく。自分で道具を作っていく。
もし、良いライブラリができたら、それを販売する。
線形代数
3D を取り扱うゲームでは必須。線形代数は、もっとも役に立つ数学。
フーリエ変換とかも、線形代数の一部。
ゲームの設計、企画
物語を作れる方が良い。これは、プログラミングとかの技術とは別物。
演出
かっこの良い動作登場のさせかた
見せる順序
これも、プログラミングとは関係ない。
大学で、なんでゲームプログラムを勉強するの?
Real-time Programming の例題として複雑な実際のプログラミングを体験する
チームプログラミングを体験する
その中で、出てきたプログラミングの問題を解決する
研究としては
時間を含む仕様を保証する作成したプログラムが正しいことを調べる
基本的には、あらゆる可能な状態を調べる
普通に調べていると調べる状態が増え過ぎる
うちの研究室では...
Cerium EnginePS3 上のゲームフレームワーク 並列実行 Rendering Engine SceneGraphContinuation 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
逆行列
回転行列は、θを-θにすれば良い。
回転行列以外の逆行列の計算は繁雑。なるべく使わない。
実際のプログラムは...
いろいろ繁雑。