外積、内積とは「2つの線と線の平行具合」である。内積の場合、線と線の関係が平行に近いほど0になり、垂直に近いほど1に近づく。外積の場合はその逆で「直交具合」と言える。
レースゲームなら車が壁にぶつかった時の車体のベクトル(線1)と壁のベクトル(線2)で内積をとって1に近いほど速度を落とす。1っていうことは壁に真正面からぶつかったことになるし、ゼロだとほぼ平行にあたって「擦っただけ」といえる。ちなみに英語では、外積とはcross Product、内積とはdot Productという。自分で外積、内積を取るプログラムもシンプルなので使っているうちに覚えられる。
typedef struct Vector2D { Float32 x; Float32 y; } Vector2D; //ベクトル内積 Float32 DotProduct(Vector2D *vecL, Vector2D *vecR) { return vecL->x * vecR->x + vecL->y * vecR->y; } //ベクトル外積 Float32 CrossProduct(Vector2D *vecL, Vector2D *vecR) { return vecL->x * vecR->y - vecL->y * vecR->x; }
内積は2つのベクトルのなす角度を求めることができるし、平面上に点があるかどうかも判定可能。外積はポリゴンの向き(法線ベクトル)や平面上の三角形と点の内外判定に利用できる。