[数学]捻じれて縺れてこんがらかるの続き、計算編です。
まず、お互いの直線をベクトルと見なし、その外積を求めます。
この外積は何を意味するかというと、前回の平行な面における法線となっています。
この法線がわかれば、平行な面どうしの距離を計算する事が出ケイます。
それぞれの面から適当な点を1つづつ取り、bの面からaの面へ向かうベクトルを作ります。
この時、cと法線ベクトルの内積を求めれば、お互いの面の距離がわかります。
内積は、あるベクトル成分をどれだけ持っているか、という計算にも使えるわけです。
この辺のからくりがわからなくても、cと法線ベクトルが直角ならば、
aの面とbの面がぴったりくっついている、というのがわかればいいです。
ということで、こんな感じのソースになります。
int LineHitCheck(const Vec3 &a1, const Vec3 &a2, const Vec3 &b1, const Vec3 &b2){
Vec3 va = a1 - a2;
Vec3 vb = b1 - b2;
Vec3 nv = outer(va, vb);
Vec3 vc = a1 - b1;
if (nv.x == 0 && nv.y == 0 && nv.z == 0){
// 平行or同一の場合
Vec3 nv2 = outer(va, vc);
if (nv2.x == 0 && nv2.y == 0 && nv2.z == 0){
return 同一;
}else{
return 平行;
}
}else{
// 交差orねじれの場合
if (inner(vc, nv) == 0){
return 交差;
}else{
return ねじれ;
}
}
}
平行だったときの場合は飛ばしましたが、直線Aと直線Bが同一ということは、
直線B上にあるすべての点が直線A上にあるということです。
ですから、直線Aの一点と直線Bの一点を結ぶベクトルは、常に直線Aベクトルと0度or180度であり、
外積を求めると必ず零ベクトルになります。
ねじれの直線の距離は、法線ベクトルを正規化してcベクトルとの内積を求めると出ます。
カプセルの当たり判定で求める事があるかもしれません。