平面ポリゴンを 3D 空間の平面に投影する方法
-
21-09-2019 - |
質問
ポリゴンをベクトルに沿って 3D 空間の平面に投影したいと考えています。これを行うには単一の変換行列を使用するのが望ましいのですが、この種の行列を構築する方法がわかりません。
与えられた
- 飛行機のパラメータ (ax+by+cz+d)、
- 私のポリゴンの世界座標。見出しで述べたように、ポリゴンのすべての頂点は別の平面内にあります。
- ポリゴンを投影する方向ベクトル (現在のポリゴン平面の法線ベクトル)
ゴール- 必要な投影を実行する 4x4 変換行列、
または
- 自分で構築する方法についての洞察
アップデート
ご回答ありがとうございます。意図したとおりに動作します。
これを見つけた人たちに警告します。投影面の法線が投影ベクトルに平行な場合、分母 D は (ほぼ) 0 になるため、奇妙なことが起こらないようにするために、この特殊な場合に対する何らかの処理が必要です。D < 1e-5 かどうかを確認することで問題を解決しました。そうであれば、押し出しベクトルに沿ってポリゴンを平行移動するだけです。
解決
ポリゴンの頂点と仮定一方が(x0, y0, z0)
であり、方向ベクトルは(dx,dy,dz)
である。
投影線上の点である:。(x,y,z) = (x0 + t*dx, y0 + t*dy, z0 + t*dz)
あなたは平面で、このラインの交点を見つけたいので、平面方程式ax+by+cz+d = 0
にそれをプラグインし、tについて解くます:
t = (-a*x0 - b*y0 - c*z0 - d) / (a*dx + b*dy + c*dz)
そして、あなたのターゲットの頂点を持っている:。x = x0+dx*t
など
は、それは、4×4行列によって行うことができます。もしX0、Y0、Z0の関数としてX、Y、Zのための3つの方程式を書き込み、係数を取ることによって、行列要素を決定することができる必要があります。
たとえば、xの
x = x0 - (a*dx*x0 + b*dx*y0 + c*dx*z0 + d*dx) / D
x = (1 - a*dx/D)*x0 - (b*dx/D)*y0 - (c*dx/D)*z0 - d*dx/D
D = a*dx + b*dy + c*dz
は上から分母です。同様にy及びzワーク
結果行列ます:
1-a*dx/D -b*dx/D -c*dx/D -d*dx/D
-a*dy/D 1-b*dy/D -c*dy/D -d*dy/D
-a*dz/D -b*dz/D 1-c*dz/D -d*dz/D
0 0 0 1
(注:上のDirect3Dではなく列ベクトルの列ベクトルを使用しているため、この行列は、転置されなければならない)。