2013-02-11 22 views
0

我的問題是我在世界空間中有一個表面(三個3D點),我想要旋轉以使得這三個點的結果法線相同作爲另一架飛機的法線,同時保持原始曲面的「三角形」。旋轉平面所以它的法線與另一個平面的正常方向相同

如果 「目的地」 平面具有正常的(0,0,1)和在該平面上的點是(0,0,0),並且 「源」 點是[-0.5,-0.5, -0.5] [-0.5,-0.5,0.5] [-0.5,0.5,0.5],我必須做些什麼計算來旋轉這些點,使表面法線變成(0,0,1)?

我曾嘗試使用下面的方法「projectPointToPlane」簡單的「突出」的「源」點到「目的地」飛機:

public static Vector3f projectPointToPlane(Vector3f point, Vector3f planePoint, Vector3f planeNormal) 
{ 
    float dot = EEngineUtils.getDotProduct(EEngineUtils.getProjectionVector(point, planePoint), planeNormal); 
    return new Vector3f(point.getX()+planeNormal.getX()*-dot, point.getY()+planeNormal.getY()*-dot, point.getZ()+planeNormal.getZ()*-dot); 
} 

public static Vector3f getProjectionVector(Vector3f to, Vector3f from) 
{ 
    return new Vector3f(to.getX()-from.getX(), to.getY()-from.getY(), to.getZ()-from.getZ()); 
} 

public static float getDotProduct(Vector3f v1, Vector3f v2) 
{ 
    return (v1.getX()*v2.getX())+(v1.getY()*v2.getY())+(v1.getZ()*v2.getZ()); 
} 

但是我沒有得到我所期待的結果。 例如,下面是源碼點:

Vector3f [-0.5,-0.5,-0.5] | Vector3f [-0.5,-0.5,0.5] | Vector3f [-0.5,0.5,0.5]

這裏所得的投影的點:

Vector3f [-0.5,-0.5,0.0] | Vector3f [-0.5,-0.5,0.0] | Vector3f [-0.5,0.5,0.0]

前兩個結果是相同的,這不是我想要的。我希望得到的'三角形'的形狀相同(在這種情況下,是一個直角三角形)。 我的假設是'投影'不是我所需要的,而我真正需要的是某種「旋轉」,但我不知道如何實現這一點。

我想過要找到兩個曲面法線之間的角度並以這個角度旋轉點,但我不知道用什麼'軸'向量來旋轉。 任何幫助,將不勝感激。如果我太模糊,請讓我知道。

注意我在Java中使用LWJGL API。

回答

0

這本質上是一個查看操作,但增加了一些複雜性,這兩個法線都不一定指向您的某個座標軸。因此,你可以形成兩個矩陣,它們將沿着一個公共軸定位兩個平面,然後再乘以另一個平面的倒數(在這種形式中,倒數就是轉置,所以這將是微不足道的)。

查看矩陣很容易計算,只使用一些交叉產品和一些規範化。 (如果您的'目的地'飛機是實際上是的方向,使得它的法線是一個軸,只是直接構建查看矩陣)。

1

使用交叉產品。當前三角形的法線是構建在其頂點上的矢量的叉積(歸一化後)。旋轉軸是法線到平面(0,0,1)和三角形法線的叉積。旋轉角的正弦是最後一個叉積的長度(假定法線被歸一化,即法線是單位矢量)。

您的情況: 三角形A:[ - 。5, - 5, - 5] B:[ - 。5, - 5,5] C:[ - 。5,.5 ,.5]

載體,其形成這個三角形

AB:。。[-.5, - 5,0.5] - [ - 5, - 5, - 5] = [0,0,1 ]

AC:[-.5,0.5,0.5] - [ - 5, - 5, - 5] = [0,1,1]

交叉產物:。AB X AC = [ - 1,0,0],這已經歸一化,這是ABC三角形的法線。

旋轉軸:[-1,0,0] x [0,0,1] = [0,1, 0]

旋轉竇ngle是1,即角度是90度。

旋轉角餘弦是法線向量的標量乘積 [-1,0,0]。 [0,0,1] = 0,這也給了90度。