/* ** 視野変換行列を求める */ void lookAt(float ex, float ey, float ez, float tx, float ty, float tz, float ux, float uy, float uz, GLfloat *matrix) { float l; /* ** 下の l は 0 になることがあるから, ** 必要ならエラー処理を追加して. */ /* z 軸 = e - t */ tx = ex - tx; ty = ey - ty; tz = ez - tz; l = sqrtf(tx * tx + ty * ty + tz * tz); /* この l と, */ matrix[ 2] = tx / l; matrix[ 6] = ty / l; matrix[10] = tz / l; /* x 軸 = u x z 軸 */ tx = uy * matrix[10] - uz * matrix[ 6]; ty = uz * matrix[ 2] - ux * matrix[10]; tz = ux * matrix[ 6] - uy * matrix[ 2]; l = sqrtf(tx * tx + ty * ty + tz * tz); /* この l. */ matrix[ 0] = tx / l; matrix[ 4] = ty / l; matrix[ 8] = tz / l; /* y 軸 = z 軸 x x 軸 */ matrix[ 1] = matrix[ 6] * matrix[ 8] - matrix[10] * matrix[ 4]; matrix[ 5] = matrix[10] * matrix[ 0] - matrix[ 2] * matrix[ 8]; matrix[ 9] = matrix[ 2] * matrix[ 4] - matrix[ 6] * matrix[ 0]; /* 平行移動 */ matrix[12] = -(ex * matrix[ 0] + ey * matrix[ 4] + ez * matrix[ 8]); matrix[13] = -(ex * matrix[ 1] + ey * matrix[ 5] + ez * matrix[ 9]); matrix[14] = -(ex * matrix[ 2] + ey * matrix[ 6] + ez * matrix[10]); /* 残り */ matrix[ 3] = matrix[ 7] = matrix[11] = 0.0f; matrix[15] = 1.0f; }