でも、新しい効果とかを出すには必須。
ゲーム機の寿命は短い。
比較的特殊なCPUや、デバイス(GPU)を取り扱う
従って、常に新しいもの勉強する必要がある。
自分で道具を作っていく。
線形代数は、もっとも役に立つ数学。
フーリエ変換とかも、線形代数の一部。
登場のさせかた
見せる順序
これも、プログラミングとは関係ない。
複雑な実際のプログラミングを体験する
チームプログラミングを体験する
その中で、出てきたプログラミングの問題を解決する
ドットで書いていっても良い
でも、今は結構大きいので大きな絵を書く必要がある。
是非使ってみよう。
三つの点があるので、
(x_1, y_1, z_1) (x_2, y_2, z_2) (x_3, y_3, z_3)の9つのデータが必要。
なくても良いが...
Cerium Engine は、これを表示する。
move() シーングラフの各ノードの動作 collsion() シーングラフの相互作用
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(); }
シーングラフを画面上に表示する
普通、Open/GL とか GPU とか使うんだけど、
うちでは、
Cell を使って、ソフトウェアで1dotずつ書く(一つは教育的配慮。一つはCeriumの例題として)
光の方向と、Polygon の向き (法線)の情報が必要。
置くにあるものは描画しない
Java 3D を使っても良い。
OpenSceneGraph と言うのが便利。
Open/GL を使って Rendering を行う。
しかし、PS3 では使いにくい。
SceneGraph *scene_graph = make_scene_graph(); while(running) { get_input(); scene_graph->move(); scene_graph->collision(); scene_graph->rendering(display); }
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
かなりめんどくさいです。
128bit register が128個もある。
斉次行列と呼ばれる。
| | 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 x + A y * B y + A z * B z
距離を使っても良い。
回転行列以外の逆行列の計算は繁雑。なるべく使わない。
名前 _______________ 学籍番号 ___________車がコースを走っている。コースの道と、壁を法線ベクトルと、位置ベクトルで表す。車は位置 Cp と速度 Cv を持っている。車の方向は速度と同じ方向だとしよう。
壁 | Wn | Wp |
道 | Rn | Rp |
車 | Cv | Cp |
Cv = (2,2,1,1)
Cp = (1,1,1,1)
1 clock で、これだけの位置を動くとする。
車をを動かす斉次行列を書き、それを用いて、次の車の位置を計算せよ。
Rn = (0,0,1,1)
sin(45度) = 0.7, cos(45度) = 0.7 として計算することにする。
車の車輪は、1 clock の間にCvと直行した方向に45度回転するとする。
車の車輪の回転を表す行列を前の計算結果を利用して求めよ。
Cp+Cv
を計算し、それが壁の向うにあるかどうかを調べる。
法線ベクトルWn = (1,1,0,1)
として、今は衝突してなくて、次のclockで 車が衝突する
Wp
の例を示せ。