(C)yamaita 2005
■このごろ堂へ

コンピュータゲームの数学


コンピュータゲームの数学
 座標・ベクトル・行列・運動・衝突・追跡―今や、数学がわからないと、コンピュータゲームを作ることはできない。しかし、ゲーム開発者は、学問として数学を学ぶわけではない。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

 計算ミスをしていました。式を、以下の赤字のように訂正してください。




■このごろ堂へ