座標・ベクトル・行列・運動・衝突・追跡―今や、数学がわからないと、コンピュータゲームを作ることはできない。しかし、ゲーム開発者は、学問として数学を学ぶわけではない。3Dゲームの開発に必要な数学を必要なだけ解説する一冊。
第1章 なんのための数学
第2章 座標系
第3章 ベクトル
第4章 行列
第5章 三次元オブジェクト
第6章 プログラムの前提
第7章 座標変換
第8章 運動計算
第9章 衝突
最後の最後になって、ソースの変数名の命名規則を統一して読みやすくしようとしたことが仇になりました。一部、修正漏れが発見されています。
エラータ
現在、以下の誤りが発見されています。 88ページ 17行目以下
構造体定義が、このままでは動きません。赤字の部分を追加してください。 struct _POLYGON3D; typedef struct _POLYGON3D { VECTOR3D a, b, c; // ポリゴンの3頂点 VECTOR3D normal; // ポリゴンの法線単位ベクトル _POLYGON3D *p1, *p2, *p3; // 隣接するポリゴンへのポインタ } POLYGON3D; 120ページ 14-15行目
変数定義の後ろのセミコロンが抜けている場所がありました。赤字の部分のセミコロンを追加してください。 VECTOR3D forward; // 前方ベクトル VECTOR3D up; // 上方ベクトル VECTOR3D right; // 右方ベクトル VECTOR3D volocity; // 速度ベクトル(1フレームあたりの速度) 137ページ 8行目
式の後ろのセミコロンが抜けている場所がありました。赤字の部分のセミコロンを追加してください。 for(i = 0; i < mesh_count[x_id][y_id]; i++){ newpl = mesh[x_id][y_id][i]; if(in_polygonXY(p, newpl) == YES){ 192ページ 下から7行目
変数名に誤りがあります。赤字の部分を追加してください。 vdash_vdash = vdash.x * vdash.x + vdash.y * vdash.y + vdash.z * vdash.z; if(vdash_vdash == 0.0d){ 193ページ 18-20行目
変数名を直していませんでした。赤字の部分を追加してください。 // ボールと円柱の最短距離がr以下なのは何時から何時までかを計算する a = vdash_vdash; inroot = bdash_vdash * bdash_vdash - a * c; 194ページ 13-15行目
変数名を直していませんでした。赤字の部分を追加してください。 // ボールの終了位置はlより外側なので、lより外に出る時刻 t4 = -b_lm / v_lm; } 197ページ 下から4行目の上
以下のパートを挿入してください。変数を一つ求めていませんでした。 198ページ 3行目
変数にダッシュが付いていませんでした。 202ページ 5行目以下
変数定義の後ろのセミコロンが抜けている場所が多数ありました。赤字の部分のセミコロンを追加してください。また、変数を2つ定義し忘れています。 VECTOR3D m; // M1M2ベクトル VECTOR3D cdash; // cベクトルを平面投影したもの VECTOR3D vdash; // vベクトルを平面投影したもの VECTOR3D mdash; // mベクトルを平面投影したもの VECTOR3D alpha; // VECTOR3D beta; // double c_l; // cとlの内積 double m_l; // mとlの内積 double v_l; // vとlの内積 double l_l; // lの長さの二乗 double c_m; // cとmの内積 double v_m; // vとmの内積 double m_m; // mの長さの二乗 double mdash_mdash; // mdashの長さの二乗 double c1, c2, c3, c4;// double work; // 平面投影用ワーク変数 202ページ 下から3行目
以下のように修正してください。 c3 = c_l + v_l; c4 = c2 + v_l; // 円柱Mが円柱LのL1側外にずっとあるかどうか 203ページ 下から10行目の上
赤字の部分のプログラムを挿入してください。また、変数名を赤字に修正してください。 vdash.y = v.y - work * l.y; vdash.z = v.z - work * l.z; // mベクトルの円柱Lに垂直な平面への投影 work = m_l / l_l; mdash.x = m.x - work * l.x; mdash.y = m.y - work * l.y; mdash.z = m.z - work * l.z; // cdashベクトル、vdashベクトルの円柱Mに垂直な平面への投影 mdash_mdash = mdash.x * mdash.x + mdash.y * mdash.y + mdash.z * mdash.z; work = (cdash.x * mdash.x + cdash.y * mdash.y + cdash.z * mdash.z) / mdash_mdash; alpha.x = cdash.x - work * mdash.x; alpha.y = cdash.y - work * mdash.y; alpha.z = cdash.z - work * mdash.z; work = (vdash.x * mdash.x + vdash.y * mdash.y + vdash.z * mdash.z) / mdash_mdash; beta.x = vdash.x - work * mdash.x; beta.y = vdash.y - work * mdash.y; beta.z = vdash.z - work * mdash.z; 211ページ 18-19行目
関数の型宣言がおかしくなっています。以下のように修正してください。 double bullet_box_collision(VECTOR3D *b, VECTOR3D *v1, VECTOR3D *b1, VECTOR3D *b2, VECTOR3D *v2) 215ページ 11-12行目
関数の型宣言がおかしくなっています。以下のように修正してください。 double sphere_box_collision(VECTOR3D *s, VECTOR3D *v1, double r, VECTOR3D *b1, VECTOR3D *b2, VECTOR3D *v2) 218ページ 下から3-1行目
変数名を直していませんでした。赤字の部分を修正してください。 if(wtime <= 1.0d){ h.z = v.z * wtime + s->z; if((wtime < time) && (h.z >= b1->z) && 231ページ 7行目
使用していないローカル変数 w がありました。赤字の部分を削除してください。 VECTOR3D pb, w; 232ページ 6-8行目
植字のミスで、 YES が yES と小文字になってしまいました。赤字の部分を修正してください。 if(d <= (r * r)){ return(YES); } else { 248ページ 問題3
計算ミスをしていました。式を、以下の赤の四角で囲まれた部分のように訂正してください。 256ページ 問題13
計算ミスをしていました。式を、以下の赤の四角で囲まれた部分のように訂正してください。 261ページ 問題19
計算ミスをしていました。式を、以下の赤字のように訂正してください。 |