7

ベクトルに沿ってポリゴンを3D空間の平面に投影したいと思います。これを行うには、単一の変換行列を使用することが望ましいですが、この種の行列を作成する方法がわかりません。

与えられた

  • 平面のパラメーター(ax + by + cz + d)、
  • 私のポリゴンの世界座標。見出しで述べたように、私のポリゴンのすべての頂点は別の平面にあります。
  • ポリゴンを投影する方向ベクトル(現在はポリゴンの平面の法線ベクトル)

目標 -必要な射影を実行する4x4変換行列、

また

  • 自分で構築する方法についての洞察

アップデート

答えてくれてありがとう、それは意図したように動作します。

これを見つけた人への注意:射影の法線の平面が射影ベクトルに平行である場合、分母Dは(ほぼ)0になるので、奇妙なことが起こらないようにするために、この特殊なケースのある種の処理が必要です。D <1e-5かどうかを確認して解決しました。その場合は、ポリゴンを押し出しベクトルに沿って移動します。

4

1 に答える 1

14

ポリゴンの頂点の1つが(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など。

これはアフィン変換であるため、4x4行列で実行できます。x、y、zの3つの方程式をx0、y0、z0の関数として記述し、係数を取得することで、行列要素を決定できるはずです。

たとえば、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では、列ベクトルの代わりに行ベクトルを使用するため、この行列を転置する必要があります)。

于 2010-03-23T14:35:12.177 に答える