2016-06-29 19 views
1

私は、法線ベクトルとその平面に沿って移動するもう一つの正規化された方向ベクトル(両方とも3D空間)を定義しています。2D平面に3D座標を投影する

私は法線方向の3Dベクトルを平面上に投影して、x/y座標を持つ2次元ベクトルになるようにする方法を見つけようとしています。

+0

[このウィキペディアのページ](https://en.wikipedia.org/wiki/3D_projection)は、それを行う数学をすべて持っています。それは、いくつかの行列の数学に沸騰し、 3Dオブジェクトを「見て」いるということです。 –

+0

http://stackoverflow.com/questions/23472048/projecting-3d-points-to-2d-planeがんばろう! – Olian04

+0

x/y座標の2Dベクトル?どの軸に関連していますか? – Beta

答えて

1

方向ベクトルと平面の間の角度を見つける必要があるように思えます。投影のサイズは、その角度の余弦でスケーリングされます。平面の法線ベクトルは垂直なので、法線ベクトルとあなたの方向ベクトルの間にサインがあると思います。

2つのベクトルの間の角度は、大きさを掛け合わせたベクトルの内積によって与えられます。それが私たちのシータを与えます。シータの罪を取り、スケーリングファクターを持っています(私はそれをsと呼ぶでしょう)

次に、投影する平面に単位サイズベクトルを定義する必要があります。これは、投影方向の単位ベクトルの1つを前方に移動することでこれを行うのが最も簡単です...

投影方向に単位ベクトルを設定すると、投影の長さが分かりますスケーリング係数を使用してベクトルの長さを掛けることによって、その単位空間内にある。

その後、単位ベクトルで長さを掛け、通常定義されているxyz軸を基準にしてベクトルを見つけます。

こちらがお役に立てば幸いです。

+0

それが明確でない場合は、教えてください。私はC#では巨大ではありませんが、あなたがこれまで行ってきたことを私に見せることができるなら、おそらく例を挙げることができます。 –

1

このようなものを試してみてください。しばらく前に、私はこの正確な方法に関する論文を書いて、あなたが望むならコピーを提供することができます。

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平面上の正のx軸からのラジアンで測ったxyカメラ角度の余弦です。 sxyは、x-yカメラアングルの正弦です。 czはzカメラ角度のコサインで、x-y平面からのラジアンで計測されます(カメラがその平面上にある場合、角度はゼロです)。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軸である。

あなたが探していることは上記の式を使用これに似たシンプルなレンダリングエンジン、のようなものであるように聞こえる:Mathematical surface

は、この情報がお役に立てば幸いですが。

関連する問題