所以,我有這個算法來計算3D平面與法向矢量給出的平面的截面。從法向矢量給出的平面到XY平面的座標映射
但是,我目前的問題是,橫截面是由三維點組成(全部位於給定平面上)並顯示它,我需要將此座標映射到XY平面。
如果平面法線類似於(0,0,c) - 這就完美了 - 我只是複製x和y座標而丟棄z。
這裏是我的問題:由於我不知道如何轉換任何其他平原,任何人都可以給我任何暗示,我現在該怎麼辦?
所以,我有這個算法來計算3D平面與法向矢量給出的平面的截面。從法向矢量給出的平面到XY平面的座標映射
但是,我目前的問題是,橫截面是由三維點組成(全部位於給定平面上)並顯示它,我需要將此座標映射到XY平面。
如果平面法線類似於(0,0,c) - 這就完美了 - 我只是複製x和y座標而丟棄z。
這裏是我的問題:由於我不知道如何轉換任何其他平原,任何人都可以給我任何暗示,我現在該怎麼辦?
你窗格可通過正常的矢量
n=(xn,yn,zn)
對於座標變換定義,我們需要2個基向量和零點窗格
基向量
我們選擇那些「自然地「裝配到x/y窗格(稍後參見邊緣情況):
b1=(1,0,zb1)
b2=(0,1,zb2)
我們想
(C const的標量)
,以確保這兩個是真正立足
現在解決這個問題:
b1 x b2= (0*zb2-zb1*1,zb1*0-1*zb2,1*1-0*0) = (zb1,zb2,1)
zb1*c=xn
zb2*c=yn
1*c=zn
c=zn,
zb2=yn/c=yn/zn
zb1=xn/c=xn/zn
b1=(1,0,yn/zn)
b2=(0,1,xn/zn)
和規範它
bv1=(1,0,yn/zn)*sqrt(1+(yn/zn*yn/zn))
bv2=(0,1,yn/zn)*sqrt(1+(xn/zn*xn/zn))
An邊緣情況是,當zn = 0時:在這種情況下,法向矢量平行於x/y窗格,並且不存在自然基矢量。在這種情況下,您必須通過美觀POV選擇基底b1和b2矢量,並通過相同的解決方案流程或只選擇bv1和bv2。
零點
你不會說錨點在OQ的窗格,但它需要從平行窗格的無限族區分你的窗格。
如果你的定位點(0,0,0),這是爲座標變換一個完美的錨點和您的面板上有
x*xn+y*yn+z*zn=0,
(y0,y0,z0)=(0,0,0)
如果沒有,我假設你有(XA的錨點,ya,za)並且您的窗格有
x*xn+y*yn+z*zn=d
with d const標量。自然地適合將是窗格的點,即由原始零點的正常投影所限定到窗格:
P0=(x0,y0,z0)
與
(x0, y0, z0) = c * (xn,yn,zn)
解決這個反對
x*xn+y*yn+z*zn=d
給出
c*xn*xn+c*yn*yn+c*zn*zn=d
和
c=d/(xn*xn+yn*yn+zn*zn)
從而
P0=(x0,y0,z0)=c*(xn,yn,zn)
被發現。
最終轉化
由代表你的窗格的每一個點(即你想顯示這些點)作爲
P0+x'*bv1+y'*bv2
具有x「和y」是新的座標來實現的。既然我們知道P0,bv1和bv2,這是相當微不足道的。如果我們不在邊緣情況下,我們在bv1.y和bv2.x中有零點,進一步減少了問題。
x'和y'是您想要的新座標。
非常好的解釋!我面臨同樣的問題,並在計算出的基向量上表示三維點,我使用點積將它們投影到基向量上。 'x'= pt3d.dot(bv1) y'= pt3d.dot(bv2)' 它是正確的嗎? – Dexter 2012-02-15 15:34:58
嗨,我想這裏有一個小錯誤: 'b1 =(1,0,yn/zn) b2 =(0,1,xn/zn)' 實際上b1 * n〜= 0,減去。 (1,0,-n/zn) b2 =(0,1,-xn/zn)' – 2017-09-12 21:50:43
我懷疑你想要做的是投影從窗格(你的橫截面)到另一個(x,y)或從一個到另一個座標轉換 - 哪一個? – 2012-01-08 19:51:05
目前,我在3D座標系中設置了三維點(x,y,z)(實際上(x,y,z,1))。我想要的是在XY平面匹配(x,y,z)的二維點(x',y')(例如x',y',1) )在由法向量給出的3D平面中。到目前爲止,我認爲如果我可以旋轉矢量給出的平面,我可以用這種方式來設計點:(x,y,z,1) - >(x,y,1) – stollgrin 2012-01-08 19:59:15
@EugenRieck Hey Eugen,你會怎麼說是「從窗格(你的橫截面)到另一個(x,y)的投影或者從一個到另一個的座標變換」 – user1084113 2013-03-04 16:36:50