質問: 3次元空間内での線分の交差判定について はじめまして。 3d関係のプログラムを組む上で、線分同士の判定を行う必要があるのですが 数学の知識が乏しく困っています。 3次元空間内の線分abとcdが交差しているか判定し、 交差していればその交点を求めたいのです。 2次元の場合はできたのですが、3次元になるとどうやって計算すればよいのか わかりません。(交差以外に、ねじれの位置関係があるんですよね?) どなたか教えていただけると助かります。
回答: 1)一般に「捩れの位置」になりますから、互いに最短の位置を求める問題に帰着します。a-kumaさんの言われるような連立一次方程式では未知数が2つ、式がx,y,z3つとなるので解けません。2次元ならyosizoさんの言われるように未知数と式の数が2つで簡単に解けます。 2)線分ab、cdの何れかの長さが<ε以下、または、線分ab、cdはほぼ平行ならゼロ割を起こすか答えが求まっても答えの精度が著しく低下します。このチェックも実際のプログラムでは絶対に必要です。 3)で、以下、2)のチェック済みであると仮定して.....。 4)たまたま最近3d-cad用に作ったもので数式の求めた方を忘れてしまったが、 // t0:ab方向単位ベクトル、t1:cd方向単位ベクトル、として、 // float spd = 即ち、ベクトルt0とt1の内積 float det = spd*spd - 1.0f; // spd:ab方向単位ベクトル v01 = c - a; //3dベクトル (c-a) u0 = (spd* - ) / det; u1 = ( - spd*) / det; として、パラメータ、u0,u1が求まります。ここに、 u0:ab方向パラメータ、u0=0の時、q0(u0)=aで、u0はaからの距離を表わす。 ■q0(u0)=a+u0*t0...............equ.1) u1:cd方向パラメータ、u1=0の時、q1(u1)=cで、u1はcからの距離を表わす。 ■q1(u1)=c+u1*t1...............equ.2) これで、捩れの位置に2点求まるのですが、 ・2点が距離の許容誤差よりも離れていたら、エラーとする。 ・2点が距離の許容誤差以内なら、2点の中点を取る。 ・中点がいやなら、重みを掛ける(場合もある)。 この説明で不十分ならあとで補足します。