質問

ポリゴンをベクトルに沿って 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ではなく列ベクトルの列ベクトルを使用しているため、この行列は、転置されなければならない)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top