p(1, 2, 3, w=1)
ベクトルv(a, b, c, w=0)
を持つ点を新しい点に変換したいとしますp'
注:OpenGLでw=0
ベクトルをw=1
表し、点を表します。間違っている場合は修正してください。
アフィン変換の定義には、次のものがあります。
p + v = p'
=> p(1, 2, 3, 1) + v(a, b, c, 0) = p(1 + a, 2 + b, 3 + c, 1)
=> point + vector = point (everything works as expected)
OpenGLでは、変換行列は次のとおりです。
1 0 0 a
0 1 0 b
0 0 1 c
0 0 0 1
私は仮定し(a, b, c, 1)
、我々が持っている理由アフィン変換定義からベクトルでw=1
はなく、w=0
このような
1 0 0 a
0 1 0 b
0 0 1 c
0 0 0 0
注:OpenGLで
w=0
ベクトルをw=1
表し、点を表します。間違っている場合は修正してください。
あなたは間違っている。まず第一に、これは実際にはOpenGLとは何の関係もありません。これは、純粋に数学的な概念である同次座標に関するものです。これは、n次元のベクトル空間をn +1次元のベクトル空間に埋め込むことによって機能します。3Dの場合、同次ベクトルがデカルト座標の(x, y, z, w)
3D点(x/w, y/w, z/w)
を表すという定義で、4D同次座標を使用します。
その結果、の場合w != 0
、特定の有限点を取得しw = 0
、の場合、特定の方向に無限に遠い点を記述します。これは、同次座標が実際に有限座標で無限遠点を記述できるという点でより強力であることを意味します(これは、無限遠点が有限点にマッピングされる、またはその逆のパースペクティブ変換に非常に便利です。 )。
ショートカット(x,y,z,0)
として、方向ベクトルとして想像することができます。ただし、ある点については、それだけw=1
でなく、 w
0に等しくない値もあります。概念的には、これは、デカルト3D点が等質空間の線で表されることを意味します(1次元上に行ったので、これは実際には理にかなっています)。
(a、b、c、1)がアフィン変換定義からのベクトルであると仮定します。なぜw = 1であるのに、w = 0ではないのですか?
あなたの仮定は間違っています。同次座標についての1つのことは、4D空間で平行移動を適用しないことです。実際に4D空間でせん断操作を行うことにより、3D空間での平行移動の効果が得られます。
ですから、私たちが本当に等質空間でやりたいのは
(x + w *a, y + w*b, z+ w*c, w)
結果のベクトルの3D解釈は、
(x + w*a) / w == x/w + a
(y + w*b) / w == y/w + b
(z + w*c) / w == z/w + c
これは私たちが求めていた翻訳を表しています。
したがって、これをさらに明確にするために:
あなたがあなたの質問に書いたこと:
p(1, 2, 3, 1) + v(a, b, c, 0) = p(1 + a, 2 + b, 3 + c, 1)
明示的ではない、我々が何をしたいのか。あなたが説明するのは、4Dベクトル空間に関するアフィン変換です。
しかし、実際に必要なのは3Dデカルト座標での平行移動です。
(1, 2, 3) + (a, b, c) = (1 + a, 2 + b, 3 + c)
数式を適用するということは、実際には等質空間で平行移動を行うことを意味します。これは、w
座標によってスケーリングされる平行移動を行う効果がありますが、私が与えた数式は、ポイントに(a,b,c)
何w
を選択したかに関係なく、常にポイントを平行移動します。 。
もちろん、を選択しw=0
た場合、これは当てはまりません。その後、変更はまったく行われません。これは、平行移動によって方向が変更されることはないため、正しいことです。数式によって方向が変更されます。あなたの公式はw=1
、特別な場合にのみ正しいです。しかし、ここで重要なのは、結局のところ、ベクトルの加算ではなく、行列*ベクトルの乗算を行うということです。そして、同次座標は、(とりわけ、より強力なものの中で)行列乗算を介して平行移動を表すことを可能にします。しかし、これは、ベクトルの加算を行ったかのように、最後の列を平行移動ベクトルとして解釈できることを意味するものではありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加