在我看來,以檢查這個正在改變整個面和點的座標系的原點的最佳方式:翻譯每一點這樣的左下角點將在座標系的中心,和旋轉都這樣法向矢量將與其中一個軸平行指向。這意味着每個點的矩陣乘法,但在此之後,您可以輕鬆檢查矩形中的哪些點。這是一個XNA C#實現,但邏輯是到處都是一樣的:(我試圖使用你的草圖輸入)
// Inputs - Right handed coordinate system
Vector3 p1 = new Vector3(-1.0f, 1.0f, 1.0f); // left top
Vector3 p2 = new Vector3(1.0f, -1.0f, 0.0f); // right bottom
Vector3 p3 = new Vector3(1.0f, 1.0f, 1.0f); // right top, redundant if this is a rectangle
Vector3 p4 = new Vector3(-1.0f, -1.0f, 0.0f); // left bottom
Vector3 a = new Vector3(-0.5f, 0.0f, 0.5f);
// Calculating transformation matrix
Vector3 right = Vector3.Normalize(p2 - p4);
Vector3 forward = Vector3.Normalize(p1 - p4);
Vector3 up = Vector3.Cross(right, forward);
Matrix transform = new Matrix();
transform.M11 = right.X;
transform.M12 = right.Y;
transform.M13 = right.Z;
transform.M14 = 0.0f;
transform.M21 = forward.X;
transform.M22 = forward.Y;
transform.M23 = forward.Z;
transform.M24 = 0.0f;
transform.M31 = up.X;
transform.M32 = up.Y;
transform.M33 = up.Z;
transform.M34 = 0.0f;
transform.M41 = p4.X;
transform.M42 = p4.Y;
transform.M43 = p4.Z;
transform.M44 = 1.0f;
transform = Matrix.Invert(transform);
// Transforming
Vector3 tp1 = Vector3.Transform(p1, transform);
Vector3 tp2 = Vector3.Transform(p2, transform);
Vector3 tp3 = Vector3.Transform(p3, transform);
Vector3 tp4 = Vector3.Transform(p4, transform);
Vector3 ta = Vector3.Transform(a, transform);
ta.X /= tp2.X; // divide with rectangle width
ta.Y /= tp1.Y; // divide with rectangle height
// Now everything is on the XY plane
// P1: {X:0 Y:2.236068 Z:0}
// P2: {X:2 Y:0 Z:0}
// P3: {X:2 Y:2.236068 Z:0}
// P4: {X:0 Y:0 Z:0}
// A: {X:0.25 Y:0.5 Z:0}
這適用於任意四個點。
這不是最快的解決方案,但我敢肯定它是最乾淨和最簡單的一種,如果你知道矩陣變換。如果您發現我也有興趣的更快,但簡單的解決方案,但可能不會有性能問題。在我的英特爾2.4GHz處理器上,這種計算在1秒內發生超過100萬次而沒有任何問題。希望這有幫助,祝你好運!
什麼Vector3.Transform辦?我只有矩陣*矢量功能 ,我猜測是不一樣的 – mikbal 2012-03-09 19:42:13
我遇到的一個問題是,飛機段的點不是有序的。所以我不能說這是左上角左右。我有4點是飛機角落。在一個側面節點上,我也有飛機的法線和距離原點。如; ax + by + cz + d。 x,y,z,d是已知的。如果有幫助。 – mikbal 2012-03-09 20:09:46
Vector3變換隻是將矩陣與矢量相乘,因此它們是相同的。 – 2012-03-09 20:10:51