16

私は、スケール、回転、平行移動を使用して、世界空間のどこかに配置されたいくつかの三角形で構成された形状を持っています。形状を(直交して)投影したい平面もあります。

形状内のすべての三角形のすべての頂点にオブジェクト変換行列を掛けて、それがワールド座標のどこにあるかを見つけ、この点を平面に投影することができます。

ただし、投影を描画する必要はありません。代わりに、形状の逆変換行列を使用して平面を変換してから、すべての頂点を(逆変換された)平面に投影します。すべての頂点ではなく、平面を1回だけ変換する必要があるためです。

私の飛行機には法線(xyz)と距離(d)があります。それを4x4変換行列で乗算して、問題がないようにするにはどうすればよいですか?

xyzdとしてvec4を作成し、それを乗算できますか?または、ベクトルxyz1を作成してから、dをどうするか。

4

3 に答える 3

26

飛行機を別の表現に変換する必要があります。Nが法線で、Oが平面上の任意の点であるもの。あなたがすでに知っている普通のこと、それはあなたの(xyz)です。平面上の点も簡単です。これは通常のN倍の距離dです。

通常の方法でOを4x4行列で変換すると、これが新しいOになります。4x4行列で乗算するには、Vector4が必要です。Wコンポーネントを1(x、y、z、1)に設定します。

また、 Nを4x4行列で変換しますが、Wコンポーネントを0(x、y、z、0)に設定します。Wコンポーネントを0に設定すると、法線が変換されなくなります。マトリックスが平行移動と回転だけで構成されている場合、この手順はそれほど単純ではありません。変換行列を乗算する代わりに、行列の逆行列の転置行列を乗算する必要があります。つまり、ここに理由についての適切な説明があります。Matrix4.Transpose(Matrix4.Invert(Transform))

これで、新しい法線ベクトルNと新しい位置ベクトルOができました。しかし、xyzd形式でもう一度欲しいと思いますか?問題ない。前と同じように、xyzは通常のNであり、残っているのはdを計算することだけです。dは、法線ベクトルに沿った、原点からの平面の距離です。したがって、これは単にONの内積です。

あります!これを行っている言語を教えていただければ、コードにも喜んで入力します。

編集、擬似コード:

平面はvector3 xyznumber d、行列はmatrix4x4 M

vector4 O = (xyz * d, 1)
vector4 N = (xyz, 0)
O = M * O
N = transpose(invert(M)) * N
xyz = N.xyz
d = dot(O.xyz, N.xyz)

xyzd新しい飛行機を表します

于 2011-10-09T22:02:36.100 に答える
9

この質問は少し古いですが、受け入れられた答えを訂正したいと思います。
平面表現を変換する必要はありません。

内積として記述できる場合は、任意の点v =(x、y、z、1)が平面上にあります。p =(a、b、c、d)ax + by + cz + d
pt v = 0

p '4x4行列によって変換された平面を探していますM
同じ理由で、あなたは持っている必要がありますp't Mv = 0

だからp't Mv = pt vそしていくつかの取り決めでp'= M ^ T p


TLDR:if p=(a,b,c,d)p' = transpose(inverse(M))*p

于 2018-01-23T18:14:44.847 に答える
2

表記

  • n(1x3)行ベクトルとして表される法線です
  • n'は、変換行列に従ってnの変換された法線ですT
  • (n|d)(1x4)行ベクトルとして表される平面です(n平面の法線とd原点までの平面の距離を含む)
  • (n'|d')(n|d)は、変換行列に従っての変換平面です。T
  • Tは(4x4)(アフィン)列主変換行列です(つまり、列ベクトルtの変換はとして定義されますt' = T t)。

通常のnの変換

n' = n adj(T)

平面の変換(n | d)

(n'|d') = (n|d) adj(T)

ここで、adjは行列の余因子であり、行列の逆行列式に関して次のように定義されます。

T^-1 = adj(T)/det(T)

  • 余因子は一般に変換行列Tの逆行列に等しくありません。Tに反射が含まれている場合、det(T)= -1で、巻数の順序が逆になります。

  • スケーリングは行列式によって処理されるため、n'の再正規化は数学的には必要ありません(ただし、実装によっては数値的に異なります)。 エイドリアンレオンハルトに感謝します。

  • 最初に平面(法線と点)を分解および再構成することなく、平面を直接変換できます。
于 2017-08-07T18:01:19.167 に答える