在二維空間中,利用兩個直線方程y = kx + b我們可以直接計算出交點,但是這種方法麻煩了些,並且套用到三維空間用公式就更麻煩了,接下來介紹的是如何利用向量叉乘求出直線交點。並且由於利用叉乘最後可以的到乙個比例值,這個值的大小還可以判斷四個點所得到的兩個線段是延長線相交還是線段相交。
向量叉乘的幾何意義是得到乙個三角形的有向面積,如下圖所示,向量oa和ob叉乘的到的向量大小的二分之一就等於三角形oab的面積
有了以上基礎,我們就可以開始計算三維空間中的直線交點了
下圖ce和ab是平行線且長度相等。
首先確定兩條直線是否平行,利用向量點乘結果是否等於0來判斷,等於0垂直,等於1則平行。
接著我們需要確定兩條直線在乙個平面內,否則無論如何也無法相交,這個用向量叉乘來判斷,即判斷向量ca和向量ab叉乘得到的向量是否垂直於向量cd。
然後明確乙個目標,在四個點abcd已知的情況下,求交點o我們只需要知道co/cd就可以了。通過觀察發現,三角形acd的面積比三角形cde的面積等於線段co和cd的比值,我們來證明一下,步驟很簡單。
證明 :s三角形acd/s三角形cde = ao比ab
三角形afo和三角形egc相似
af / eg = ao/ce;
ce = ab 所以等式成立
問題轉化成要計算兩個三角形的面積,那麼我們只需要 向量ab,cd和ca就可以了,開始寫**
利用叉乘求交點少了很多if else的判斷,並且可以做到二維和三維的通用,傳遞引數的時候只要將所有點和向量y軸的值設為0就可以當作二維來使用了。
利用**中得到的比例值num2的大小還可以判斷是延長線相交還是線段相交
注意下述方法所傳入的引數是兩個點和兩個方向,可以改寫成傳入四個點。
/// /// 判斷線與線之間的相交
///
/// 交點
/// 直線1上一點
/// 直線1方向
/// 直線2上一點
/// 直線2方向
/// 是否相交
public static bool linelineintersection(out vector3 intersection, vector3 p1, vector3 v1, vector3 p2, vector3 v2)
vector3 startpointseg = p2 - p1;
vector3 vecs1 = vector3.cross(v1, v2); // 有向面積1
vector3 vecs2 = vector3.cross(startpointseg, v2); // 有向面積2
float num = vector3.dot(startpointseg, vecs1);
// 開啟可以在場景中觀察向量
p1 + v1, color.white, 20000);
p2 + v2, color.black, 20000);
p1 + startpointseg, color.red, 20000);
p1 + vecs1, color.blue, 20000);
p1 + vecs2, color.yellow, 20000);
// 判斷兩這直線是否共面
if (num >= 1e-05f || num <= -1e-05f)
// 有向面積比值,利用點乘是因為結果可能是正數或者負數
float num2 = vector3.dot(vecs2, vecs1) / vecs1.sqrmagnitude;
intersection = p1 + v1 * num2;
return true;
}
三維空間中剛體的旋轉
從零開始一起學習slam 三維空間剛體的旋轉 剛體 本身不會在運動過程中產生形變的物體,運動過程中同乙個向量的長度和夾角都不會發生變化。剛體變換也稱歐式變換。1 是重點!2 旋轉矩陣不是一般矩陣,它有比較強的約束條件。旋轉矩陣r具有正交性,r和r的轉置的乘積是單位陣,且行列式值為1。3 旋轉矩陣r的...
三維空間中的旋轉變換
1 繞座標軸旋轉的公式 1 繞z軸旋轉 2 繞x軸旋轉 3 繞y軸旋轉 以上的矩陣變換公式為 p p mat 2 繞任意軸旋轉的公式 給定具有單位長的 oa軸旋轉變換的矩陣表示可確定如下 3 繞任意軸旋轉在ogre中實現 ogre matrix3 i ogre matrix3 identity og...
三維空間的兩條直線是否相交
今天偶然看到一道題目,如何程式設計來判斷,三維空間中的兩條線段是否相交?兩條直線是否相交?第一眼看到想到了二維座標系中的簡化版,在二維的空間中,判斷兩條線是否相交,可以分別對橫座標,縱座標投影,並判斷是否都有重合。投影的過程,其實就相當於維度的簡化。因此,對於三維座標系中的兩條線段,第乙個想法也是分...