[英]Project 3D coordinates to a 2D plane
我有一個在3D空間中均由法向矢量和另一個沿該平面移動的法向方向矢量定義的平面。
我試圖弄清楚如何將法線3D向量投影到平面上,使其最終成為具有x / y坐標的2D向量。
聽起來您需要找到方向向量和平面之間的角度。 投影的大小將與該角度的余弦成比例。 由於平面的法線向量是垂直的,所以我認為您可以在法線向量和方向向量之間找到正弦值。
兩個向量之間的角度由向量的點積乘以相乘的幅度給出。 這給了我們theta。 拿theta的罪孽,我們有比例因子(我稱它為s)
接下來,您需要在要投影到的平面上定義單位尺寸矢量。 通過在投影方向上設置單位向量之一向前移動,可能最容易做到這一點...
如果沿投影方向設置單位矢量,則可以通過使用比例因子並乘以矢量的長度來知道該單位空間中投影的長度。
之后,使用單位向量乘以長度,然后找到相對於通常定義的xyz軸的向量。
我希望這有幫助。
嘗試這樣的事情。 不久前,我就這種確切的方法寫了一篇論文,如果願意,可以為您提供一份副本。
PointF Transform32(Point3 P)
{
float pX = (float)(((V.J * sxy) - V.I * cxy) * zoom);
float pY = (float)(((V.K * cz) - (V.I * sxy * sz) - (V.J * sz * cxy)));
return new PointF(Origin.X + pX, Origin.Y - pY);
}
cxy是xy攝影機角度的余弦,以從xy平面上的正x軸開始的弧度表示。 sxy是xy攝像機角度的正弦值。 cz是z相機角度的余弦,以距xy平面的弧度為單位(因此,如果相機放置在該平面上,則角度為零)。 sz是z攝像機角度的正弦。
或者:
Vector3 V = new Vector3(P.X, P.Y, P.Z);
Vector3 R = Operator.Project(V, View);
Vector3 Q = V - R;
Vector3 A = Operator.Cross(View, zA);
Vector3 B = Operator.Cross(A, View);
int pY = (int)(Operator.Dot(Q, B) / B.GetMagnitude());
int pX = (int)(Operator.Dot(Q, A) / A.GetMagnitude());
pY和pX應該是您的坐標。 在這里,向量V是所討論點的位置向量,R是該向量在您的觀看向量上的投影,Q是V與觀看向量正交的分量,A是由交叉點形成的人工X軸觀看向量與向量(0,0,1)的乘積,B是由A與(0,0,1)的叉積形成的人工Y軸。
聽起來您正在尋找的是一個類似於簡單的渲染引擎的東西,類似於此,它使用上面的公式:
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.