斜め錐台。 芖界の面取りピラミッドの内偎

以䞋の資料は、おそらくOpenGLの経隓があるプログラマヌによく知られおいるか、よく知られおいたすが、䞀方、 斜め錐台モデルを思い出し、 Habr読者のOpenGLの問題ず䞀般的な3次元モデリングぞの関心を郚分的に芳察および共有するこずが適切であるこずがわかりたした。䞀郚は、 「...䜿甚するために、投圱マトリックスがどのように機胜するかを理解する必芁はありたせん」など、䞀郚の開発者の䜍眮に䞍䞀臎があるためです。䞀郚は、Eric Lengelぞの敬意ず感謝からです。 Eric Lengyelは 、その独創的な考えがOpenGL環境での䜜業方法を豊かにしたした。



シミュレヌトしたシヌンに鏡面反射があり、「斜め錐台」を忘れた、たたは聞いおいない堎合、この蚘事は圹に立たない可胜性がありたす。



Eric Lengelに埓い、私はOpenGL衚珟の衚珟をより厳守したしたが、以䞋の考慮事項はすべお他の3次元モデリングシステムに容易に拡匵できたす。



反射



3D反射



3Dシヌンに反射面が存圚する堎合、それ自䜓が反射面の平面によるメむンビュヌカメラの反射である補助ビュヌカメラを䜿甚しおシヌンをレンダリングするこずにより、反射を取埗するのが䞀般的です。



任意のカメラ








図 1.䞊郚カメラは、反射面を含むシヌンがレンダリングされるメむンカメラです。 䞋のカメラは、反射をレンダリングするために蚭蚈された補助カメラです。 X軞は、䞡方の可芖性のピラミッド OpenGLに採甚されたビュヌ の芳枬者に向けられおおり、反射をレンダリングするカメラの座暙系が巊手であるこずは明らかです。



補助カメラ反射カメラで反射をレンダリングするず、芳察者ず反射面の間にあるオブゞェクトの䞀郚が結果のレンダリングに衚瀺され、画像に䞍芁なアヌティファクトが圢成されるこずがありたす。 最終レンダリングから反射シヌンの䞍芁な郚分を切り取るために、プログラマヌは、反射カメラから芳察される3次元シヌンのボリュヌムの䞀郚を仮想サヌフェスに制限し、さたざたな手法を䜿甚しお、このサヌフェスの境界を超えるシヌンの芖芚化を䞭断したす。



3Dモデリングの䞀般的なむデオロギヌにおける個々のレンダリング実装に固有のフラグメントシェヌダヌなどに「砎棄」呜什を䜿甚できたすたずえば、AGALMiniAssemblerの「kill」。ただし、 どのプロセッサでも同等に機胜するナニバヌサル゜リュヌションが必芁な堎合は、䟡倀がありたす。゚リックレンゲルが提案した手法に泚意しおください。



゚リックランゲルのアむデアは、芖界のピラミッドの近くの蚈画が䞀皮の割線平面になり、最終レンダリングで望たしくないメむンシヌンのボリュヌムを分離するように投圱行列を修正するこずでした。



以䞋では、 分析ゞオメトリの基本衚珟を思い出しおください。



宇宙の平面



䟿宜䞊、次の衚蚘法に埓いたす。



\ begin {center} \ begin {array} {| rlc} \ textbf {点ずベクトルの堎合}amp; \ vec {A}、\ vec {P} \\ \ multicolumn {2} {| l} {\ textit {それらを区別する} \ mathit {w} \ textit {統䞀された衚珟の座暙、}} \\ \ multicolumn { 2} {| l} {\ textit {座暙レコヌドは山括匧で囲たれおいる} \ langle ,,, \ rangle} \\ [0.3em] \ textbf {matrix}amp; \ mathbf {M}、\ mathbf {P} \\ \ textbf {転眮行列}amp; \ mathbf {M} ^ \ mathrm {T} \\ \ textbf {逆行列}amp; \ mathbf {M} ^ {-1} \\ \ textbf {character} xamp; sgnx= \ begin {cases} 1、amp; \ quad \ text {if} xgt; 0 \\ 0、amp; \ quad \ text {if} x = 0 \\ -1、amp; \ quad \ text {if} xlt; 0 \ end {cases} \\ \ textbf {vector length}amp; \ | \ vec {P} \ | \\ \ textbf {ベクトルのスカラヌ積}amp; \ vec {Q} \ cdot \ vec {P} \\ \ end {array} \ end {center}



飛行機



空間3Dポむント \ vec {P} およびベクトル \ vec {N} 、3Dポむントのコレクション \ vec {Q} 以倖 \ vec {P} 方皋匏を満たす \ vec {N} \ cdot\ vec {Q}-\ vec {P} 点を持぀平面を定矩したす \ vec {P} この平面に属する点の1぀であり、ベクトル \ vec {N} は法線ベクトルです。



飛行機






図 2.平面はその点によっお完党に決定されたす \ vec {P} および法線ベクトル \ vec {N} 。



倚くの堎合、平面方皋匏は次のように蚘述されたす。



Ax + By + Cz + D = 0、






どこで \ mathit {A、B} そしお \ mathit {C} そこにある \ mathit {x、y、z} 法線ベクトル成分 \ vec {N} 、そしお D =-\ vec {N} \ cdot \ vec {P} 。 䟡倀 | D | / \ | \ vec {N} \ | は、原点から平面たでの距離に等しくなりたす  法線ベクトルの成分をその長さで割ったものが、面の単䜍法線ベクトルの方向䜙匊であるこずに泚意しおください 。



正芏化された法線ベクトルの堎合、匏



d = \ vec {N} \ cdot \ vec {Q} + D、






平面から任意の点たでの距離を芋぀けるために䜿甚できたす \ vec {Q} 。 もし d = 0 、 \ vec {Q} 平面にありたす。 堎合に dgt; 0 ポむント \ vec {Q} 平面のプラス偎、぀たり 平面の法線ベクトルから dlt; 0 ポむント \ vec {Q} 平面の法線ベクトルの方向ず反察の方向に、平面から離れお配眮されおいる \ vec {N} 。

平面を4次元ベクトルで曞くず䟿利です。 簡単に蚀うず、平面の方皋匏は次のように蚘述されたす。 \ langle \ vec {N}、D \ rangle 。 明らかに、任意の点に察しお \ vec {Q} 均質な 4次元座暙を持぀ \ mathit {w} 座暙が1の堎合、 匏 2は次のように曞き換えられたす。 d = \ vec {L} \ cdot \ vec {Q} どこで \ vec {L} = \ langle \ vec {N}、D \ rangle そしおポむント \ vec {Q} 平面にある堎合 \ vec {L} \ cdot \ vec {Q} = 0 。



平面倉換



平面の空間倉換の特城を理解するには、 法線ベクトルの倉換に泚意を払う必芁がありたす。 ポリゎンモデルの空間倉換では、ベクトル、ポリゎンの衚面の接線ず法線ベクトルの動䜜は異なりたす。 倚くの堎合、 接線ベクトルは、2぀の倉換された頂点間の差ずしお衚すこずができたす。 2぀の自然に倉換された点の間で、結果ずしお、倉換されたベクトルの性質は私たちの期埅に沿っおいたす。 しかし、空間倉換の䞀般的なケヌスでは、行列 \ mathbf {M} 盎亀ではないので、倉換ベクトルを法線ベクトルに盎接適甚するず、このベクトルは法線ではなくなり、ポリゎンの衚面に垂盎になりたす。



ベクトルは接線であるため \ vec {T} そしおベクトルは正垞です \ vec {N} 同じポリゎンに属するは、倉換されたベクトルのスカラヌ積に察しお垂盎のたたでなければなりたせん \ vec {T} {^ '} そしお \ vec {N} {^ '} 元のベクタヌず同じ条件を満たしおいる必芁がありたす。 \ vec {T} {^ '} \ cdot \ vec {N} {^'} = 0 。 法線ベクトルの性質を明確にするために、いく぀かの簡単な代数挔算を実行したす。



もし \ mathbf {M} -3x3空間倉換行列接線および法線ベクトルの堎合、空間倉䜍は重芁ではありたせん \ vec {T} {^ '} = \ mathbf {M} \ vec {T} 、倉換マトリックスを芋぀けるずいう目暙を蚭定したす \ mathbf {G} のために \ vec {N} そのような



\ vec {N} {^ '} \ cdot \ vec {T} {^'} =\ mathbf {G} \ vec {N}\ cdot\ mathbf {M} \ vec {T}= 0、






ベクトルの乗算は次のように曞くこずができるこずを芚えおおいおください完党に同等



\ mathbf {G} \ vec {N}\ cdot\ mathbf {M} \ vec {T}=\ mathbf {G} \ vec {N}^ \ mathrm {T}\ mathbf {M } \ vec {T}= \ vec {N} ^ \ mathrm {T} \ mathbf {G} ^ \ mathrm {T} \ mathbf {M} \ vec {T}、






以来 \ vec {N} ^ \ mathrm {T} \ vec {T} = 0 衚珟 \ vec {N} ^ \ mathrm {T} \ mathbf {G} ^ \ mathrm {T} \ mathbf {M} \ vec {T} = 0 実行された堎合 \ mathbf {G} ^ \ mathrm {T} \ mathbf {M} = \ mathbf {I} どこで \ mathbf {I} 単䜍行列です。 それから続く \ mathbf {G} =\ mathbf {M} ^ {-1}^ \ mathrm {T} 。 転眮された逆倉換行列によっお同様の方法で倉換が行われるベクトルは共 倉ベクトルですが、 接線ベクトルのように倉換するベクトルは反倉ベクトルです。



ただし、法線ベクトルずは察照的に、同次座暙の平面にはれロ以倖の倀がありたす \ mathit {w} -座暙。4x4倉換での動䜜をさらに調査する必芁がありたす。



この平面内にあるポむントに察しお、 法線ベクトル倉換の特城を考慮しお空間倉換を適甚した埌の、座暙原点から平面たでの距離 \ vec {P} 、おなじみのスカラヌ積により



\ begin {array} {l} D {^ '} =-\ mathbf {M} {^ {-1}}^ \ mathrm {T} \ vec {N}\ cdot\ mathbf {M} \ vec {P} + \ vec {T}\\ \ qquad {} =-\ mathbf {M} ^ {-1}^ \ mathrm {T} \ vec {N}^ \ mathrm {T } \ mathbf {M} \ vec {P}-\ mathbf {M} ^ {-1}^ \ mathrm {T} \ vec {N}^ \ mathrm {T} \ vec {T} \\ \ qquad {} =-\ vec {N} ^ \ mathrm {T} \ mathbf {M} ^ {-1} \ mathbf {M} \ vec {P}-\ vec {N} ^ \ mathrm {T} \ mathbf {M} ^ {-1} \ vec {T} \\ \ qquad {} = D-\ vec {N} \ cdot \ mathbf {M} ^ {-1} \ vec {T}、\ end {array }






これらの蚈算で倉換行列を䜿甚したした \ mathbf {F} シフト操䜜による回転、スケヌリング、面取りの操䜜で補完されたす。



\ mathbf {F} = \å·Š[\\; \ begin {matrix} \ quad {}amp; \ quad {}amp; \ vlineamp; \ quad {} \\ \ quad {}amp; \ mathbf {M} \ quad {}amp; \ vlineamp; \ vec {T} \\ \ quad {}amp; \ quad {}amp; \ vlineamp; \ quad {} \\ \ hline \ quad {}amp; 0 \ quad {}amp; \ vlineamp; 1 \ end {matrix} \\; \ right] = \ left [\\; \ begin {matrix} M_ {11}amp; M_ {12}amp; M_ {13}amp; \ vline \、amp; T_x \\ M_ {21}amp; M_ {22}amp; M_ {23}amp; \ vline \、amp; T_y \\ M_ {31}amp; M_ {32}amp; M_ {33}amp; \ vline \、amp; T_z \\ \ hline 0amp; 0amp; 0amp; \ vline \ 、​​amp; 1 \\ \ end {matrix} \\; \ right]、






マトリックスからマトリックスぞの逆倉換 \ mathbf {F} 通垞の行列反転アルゎリズムによっお怜玢されたす



\ mathbf {F} ^ {-1} = \å·Š[\\; \ begin {matrix} \ quad {}amp; \ quad {}amp; \ vlineamp; \ quad {} \\ \ quad {}amp; \ mathbf {M} ^ {-1} \ quad {}amp; \ vlineamp;-\ mathbf {M} ^ {-1} \ vec {T} \\ \ quad {}amp; \ quad {}amp; \ vlineamp; \ quad {} \\ \ hline \ quad {}amp ; 0 \ quad {}amp; \ vlineamp; 1 \ end {matrix} \\; \ right] = \ left [\\; \ begin {matrix} M_ {11} ^ {-1}amp; M_ {12} ^ {-1}amp; M_ {13} ^ {-1}amp; \ vline \、amp;-\ mathbf {M} ^ {-1} T_x \\ M_ {21} ^ {-1}amp; M_ {22} ^ {-1}amp; M_ {23} ^ {-1}amp; \ vline \、amp;-\ mathbf {M} ^ {-1} T_y \\ M_ {31} ^ {-1}amp; M_ {32} ^ {-1}amp; M_ {33} ^ {-1}amp; \ vline \、amp; -\ mathbf {M} ^ {-1} T_z \\ \ hline 0amp; 0amp; 0amp; \ vline \、amp; 1 \\ \ end {matrix} \\; \ right]、






逆行列を転眮する



{\巊\ mathbf {F} ^ {-1} \右^ \ mathrm {T}} = \å·Š[\\; \ begin {matrix} \ quad {}amp; \ quad {}amp; \ vlineamp; \ quad {} \\ \ quad {}amp; {\巊\ mathbf {M} ^ {-1} \右 {} ^ \ mathrm {T}} \ quad {}amp; \ vlineamp; 0 \\ \ quad {}amp; \ quad {}amp; \ vlineamp; \ quad {} \\ \ hline \ quad {} amp;-\ mathbf {M} ^ {-1} \ vec {T} \ quad {}amp; \ vlineamp; 1 \ end {matrix} \\; \右]、






私たちはそれを芋るこずができたす D-\ vec {N} \ cdot \ mathbf {M} ^ {-1} \ vec {T} 匏 5からは、転眮逆倉換行列の4行目に均䞀座暙レコヌドの4次元ベクトルを乗算した結果です \ langle N_x、N_y、N_z、D \ rangle 、぀たり 飛行機甚 \ vec {C} = \ langle \ vec {N}、D \ rangle 、4x4倉換行列によっお蚘述される空間倉換䞭の画像 \ mathbf {F} 衚珟された



\ vec {C} {^ '} = {\巊\ mathbf {F} ^ {-1} \右{} ^ \ mathrm {T}} \ vec {C}。






さらに、平面が空間倉換の共倉的性質に埓うこずが䞍可欠です。



透芖投圱



透芖投圱は、芳枬者の投圱面に奥行き感を䜜成するために䜿甚されたす。透芖倉換行列は、可芖性ピラミッドの空間を可芖性キュヌブの正芏化された空間に反映する必芁がありたす。 可芖性のピラミッドは、通垞、䞊、䞋、巊、右、遠、近、たたは濃淡、アスペクト、近、遠、ずいう芳点で衚珟できたす。䞀郚のOpenGL実装には、巊右䞡方の座暙系を操䜜するツヌルがありたす。 各システムでのマトリックスずベクトルの乗算の違いず順序は、プログラマヌにずっお明らかなはずです。

錐台








図 3.コンピュヌタヌグラフィックスシステムの可芖性錐台の角錐台は、埌続のレンダリングのために、偎面から投圱軞に沿っお可芖性ゟヌンを切り取りたす。 ビュヌのカメラのスペヌスにある可芖性のピラミッドは、ピラミッドの䞊郚が座暙系の䞭心にあり、カメラからのビュヌの方向が軞ず反察になるように、右手座暙系に配眮されたす z 、近くの蚈画は遠くにありたす n 負の軞方向に沿っお z 、遠方の蚈画は遠くにありたす f 負の軞方向に沿っお z 。



䞀般に、可芖性ピラミッドは通垞の角錐台の圢状である必芁はなく、非察称にするこずもできたす。そのため、䞊、䞋、巊、右、遠、近のモデルは、斜錐台の特城を説明するのに適しおいたす「傟斜角ピラミッド」。 平面で囲たれたボリュヌムで閉じられた可芖性の立方䜓の 「圧瞮空間」 x = \ pm 1、y = \ pm 1、z = \ pm 1 、英語の甚語ずの䞀貫性を保぀ために、以䞋クリップ領域ず呌びたす 。

最初の可芖性ピラミッドで蚈画したオブゞェクトのカットオフを敎理するには、モデルで䜿甚される透芖投圱行列を倉曎する必芁がありたす。 OpenGLプログラマヌは、 メむンの OpenGL ドキュメントの Webサむトでこのようなマトリックスのパラメヌタヌを芋぀けるこずができたす。FlashプログラマヌAS3はPerspectiveMatrix3Dクラスを䜿甚する可胜性が最も高く、Direct3Dプログラマヌは゜ヌスを持ち、 Androidのラむタヌは必芁なすべおをandroid.opengl.Matrixクラスなどで芋぀けたす。 .d。 メむンアむデアを理解しおいる誰かが、远加機胜を䜿甚しお独自のクラスの遠近法倉換を拡匵するこずを奜む可胜性がありたす。



ビュヌカメラの可芖性のピラミッドの空間からの点は、たずえば、次の4x4マトリックス倉換glFrustum-OpenGL関数によっお生成された透芖倉換マトリックスを䜿甚 で、暙準立方䜓のクリップスペヌスにマッピングされたす 。



\ vec {P} {^ '} = \ mathbf {M} _ {frustum} \ vec {P} = \ begin {bmatrix} \ frac {2n} {rl}amp; 0amp; \ frac {r + l} {rl}amp; 0 \\ [0.3em] 0amp; \ frac {2n} {t-b}amp; \ frac {t + b} {t-b}amp; 0 \\ [0.3em] 0amp; 0amp;-\ frac {f + n} {f-n}amp;-\ frac {2nf} {f-n} \\ [0.3em] 0amp; 0amp; -1amp; 0 \ end {bmatrix} \\ !! Begin {bmatrix} P_x \\ P_y \\ P_z \\ 1 \ end {bmatrix}。






このような倉換により、 \ mathit {w} - クリップの均䞀空間内の倉換されたポむントの座暙には、笊号の反察の笊号がありたす \ mathit {z} -カメラビュヌの空間内のポむントの座暙。



暙準の倉換行列による空間歪みの特城は、図4からわかりたす。

\ mathit {z} -可芖性ピラミッドの空間からの座暙は範囲[-1、1] NDCに反映され、ビュヌカメラからの可芖性ピラミッドの背景の背埌にある無限の範囲は有限の間隔に圧瞮されたす。 \å·Š[1、\ tfrac {f + n} {f-n} \右] NDC内; カメラからZ軞に沿った背景たでの最終距離は、無限のギャップたで拡倧したす ] {-\ infty}、-1] NDC; カメラの前にあるZ軞に沿った点は範囲に反映されたす \å·Š[\ tfrac {f + n} {f-n}、\ infty \ right [ 。



正芏化されたデバむス座暙








図 4.リフレクション \ mathit {z} -ビュヌのカメラ空間から正芏化されたデバむス座暙の空間たでのポむントの座暙 NDC- 正芏化されたデバむス座暙 。



可芖性ピラミッドのニアプランをクリッピングプレヌンに眮き換えお、透芖倉換マトリックスの䞻な機胜を保持する必芁がありたす。 \ mathit {z} -デバむスNDCの正芏化された座暙で、修正されたニアプレヌン䞊にあるポむントの座暙は-1のたたでなければなりたせん。 それ以降のすべおの芳枬倀は、任意の可逆射圱行列に察しお普遍的であり、 匏 10の射圱行列の䜿甚は、倉換行列を倉曎する䞀般的なプロセスを説明するためだけに圹立ちたす。



もし \ vec {C} {^ '} クリップのスペヌスを制限する平面の1぀であり、倉換行列 \ mathbf {M} カメラ空間からクリップ空間ぞの投圱行列です。この平面を衚瀺するこずは難しくありたせん \ vec {C} {^ '} 転眮行列を䜿甚しお、クリップ空間からカメラ空間に \ mathbf {M} ^ \ mathrm {T} 、 匏 9から明らかに続きたす。



\ vec {C} = \å·Š[\巊\ mathbf {M} ^ {-1} \右{} ^ {-1} \右] {} ^ \ mathrm {T} \ vec {C} {^ '} = \ mathbf {M} ^ \ mathrm {T} \ vec {C} {^'}






芖界のピラミッドのクロヌズアップの倉曎



たず、任意の投圱行列から抜出したす \ mathbf {M} 可芖性ピラミッドの6぀の切断面に察応する4次元ベクトル。 ゚リック・ランゲルは、クリップ空間内の平面は垞に倉化しないずいう事実から進んだ。平面の法線は、䞻座暙軞の1぀に平行である。



図5は、芁玠「 x - z »4次元の均䞀なクリップスペヌスの3次元スラむス 。 このスラむスの䞭 \ mathit {w} -任意の点の座暙は1であるため、 \ mathit {w} 各平面の座暙は1であり、もちろん、 x -、 y -たたは z -coordinatesは±1です。これを衚 1に瀺したす。 è¡š 1を理解するには、 匏 11をもう䞀床泚意深く芋る必芁がありたす。行列のいく぀かの2列の合蚈 \ mathbf {M} ^ \ mathrm {T} 行列の察応する2行の合蚈のみ \ mathbf {M} 。



同皮のクリップ空間のスラむス








図 5.クリップの同次立方䜓空間を境界付ける巊、右、近、および遠の平面の法線ベクトル。 クリップ空間の䞊郚および䞋郚の平面の法線ベクトルは、オブザヌバヌずの間で方向付けられたす。



タブ 1.クリップ空間の座暙ずビュヌカメラの可芖性の切頭ピラミッドの空間ずの関係。 射圱行列 \ mathbf {M} カメラビュヌのスペヌスをクリップのスペヌスに倉換し、指定 \ mathbf {M} _i 衚す 私は 行列行 \ mathbf {M} 。

\ begin {center} \ begin {array} {rcc} \ hline \ textbf {Frustum plane}amp; \ textbf {クリップスペヌス}amp; \ textbf {カメラスペヌス} \\ \ hline \ text {Near} \ qquad {}amp; \ langle 0、0、1,1 \ rangleamp; \ vec {M} _4 + \ vec {M} _3 \\ \ text {Far} \ qquad {}amp; \ langle 0、0、-1.1 \ rangleamp; \ vec {M} _4-\ vec {M} _3 \\ \ text {Left} \ qquad {}amp; \ langle 1、0、0,1 \ rangleamp; \ vec {M} _4 + \ vec {M} _1 \\ \ text {Right} \ qquad {}amp; \ langle -1、0、0,1 \ rangleamp; \ vec {M} _4-\ vec {M} _1 \\ \ text {Bottom} \ qquad {}amp; \ langle 0、1、0,1 \ rangleamp; \ vec {M} _4 + \ vec {M} _2 \\ \ text {Top} \ qquad {}amp; \ langle 0、-1、0,1 \ rangleamp; \ vec {M} _4-\ vec {M} _2 \\ \ hline \ end {array} \ end {center}



させる \ vec {C} = \ langle C_x、C_y、C_z、C_w \ rangle -いずれの平面も図に瀺されおいない 6、ビュヌカメラの座暙空間で、ゞオメトリを制限したす。 カメラは平面の負の偎 平面ベクトルの方向ずは反察偎にあるため、 C_wlt; 0 。 したがっお、 è¡š 1の比率に埓っお、芖界のピラミッドの近くの蚈画を眮き換える予定があるのはこの平面です。 \ vec {C} 実行する必芁がありたす



\ vec {C} = \ vec {M} _4 + \ vec {M} _3。






透芖投圱行列の4行目を倉曎するこずはできたせん。 吊定を反映するために䜿甚されたす z 座暙 w -coordinate。グラフィックパむプラむンをさらに正しく動䜜させるために必芁です。ただし、匏12の右偎の2番目の項では、より自由に行動できたす。



\vec{M}_3{^'}=\vec{C}-\vec{M}_4.






cut clip space






図。6.可芖性ピラミッドのクロヌズアップを平面に眮き換える\vec{C} 。



よれば、あるので、衚 1、射圱行列の3行き目はのかための発珟の䞀郚であおる遠景錐台、の倉圢を考慮すおる必芁があおるこずかは明ならかであおる長期蚈画



\begin{array}{|c|}\hline
\;\\
\vec{F}=\vec{M}_4-\vec{M}_3^'}\;\\[0.3em]   
\qquad {}=2\vec{M}_4-\vec{C}\;\\[1em]
\hline \end{array}\:.






そしお、この結果は透芖投圱では顕著な問題です。 \ vec {M} _4 = \ langle0、0、-1、0 \ rangle 、その埌、芖界のピラミッドの遠方蚈画ず近方蚈画は、非れロの倀の堎合、平行でなくなりたす C_x そしお C_y 。 さらに、埌続のレンダリングでは、角錐台の圢状が非垞に望たしくなくなりたす。 \ vec {P} = \ langle x、y、0、w \ rangle そのために \ vec {C} \ cdot \ vec {P} = 0 、そしおこれはれロぞの平等を䌎い、 \ vec {F} \ cdot \ vec {P} 、そこから、私たちの新しい近距離ず遠距離の蚈画は、 図2に瀺されおいるのず同様の方法で亀差するず結論しなければなりたせん。 7a。



以前にバックグラりンドで最倧に達し、グラフィックラスタラむズプロセスに必芁なポむント深床の投圱は、軞に沿った投圱ではなくなりたした z 、むしろ、近い平面ず遠い平面の間の䜍眮に応じた倀になりたす。 可芖性ピラミッド内の方向ぞの投圱深床の䟝存性は、深床バッファ倀の正確さに重倧な圱響を及がしたす。 ただし、この望たしくない効果は、ラスタラむズのタスクに蚱容できるレベルにたで枛らすこずができ、ニアプランずファヌプランの間の角床を最小限に抑えるこずができたす。 飛行機のように、飛行機 \ vec {C} スケヌリングするこずができ、これは私たちのケヌスでは可胜な限りそのプロパティです。 平面スケヌリング \ vec {C} 背景の向きに圱響する \ vec {F} 、したがっお、間の角床を最小化するような方法でスケヌリング係数を遞択するだけです \ vec {C} そしお \ vec {F} 図1に瀺すように、可芖性ピラミッド内のシヌンのコンテンツを損なうこずなく。 7b。

修正された遠方面






図 7.a 匏 14に埓っお修正された長距離の亀差点 \ vec {F} 修正されたクロヌズアップ \ vec {C} で x - y 「-飛行機。 b近接堎スケヌリング \ vec {C} パラメヌタ \アルファ 匏 17によっお導入されたものは、初期型の切り捚おを損傷するこずなく、遠近蚈画間の角床を可胜な限り最小に倉曎したす。 網掛け郚分は、切り捚おられおいないスペヌスの量を瀺したす。



させる \ vec {C} {^ '} = \巊\ mathbf {M} ^ {-1} \右{} ^ \ mathrm {T} \ vec {C} クリップ空間の新しいクロヌズアップの投圱です \ mathbf {M} 元の投圱行列です。 角床 \ vec {Q} ^ ' 芖界のピラミッド内で、飛行機の反察偎にある \ vec {C} 次の座暙がありたす。



\ vec {Q} {^ '} = \ langle sgnC {^'} _x、sgnC {^ '} _y、1、1 \ rangle。






ほずんどの透芖投圱では、コンポヌネントの兆候 C {^ '} _x そしお C {^ '} _y 倉換された平面は、察応するコンポヌネントの笊号ず䞀臎したす C _x そしお C _y 、元の平面の座暙分解の兆候を䜿甚できたす。

角床成分を倉換した \ vec {Q} {^ '} 、すでに元の角床の成分を蚈算できたす \ vec {Q} 飛行機の反察偎にある \ vec {C} のような \ vec {Q} = \ mathbf {M} {^ {-1}} \ vec {Q} {^ '} 。 通垞の可芖性のピラミッドでは、ポむント \ vec {Q} 2぀の偎面の亀差点ず平面の反察偎にある背景によっお圢成される角床の頂点 \ vec {C} 飛行機から最も遠い \ vec {C} ポむント。



長期蚈画にはポむントが含たれるように \ vec {Q} 、条件を満たしおいる必芁がありたす \ vec {F} \ cdot \ vec {Q} = 0 、 匏 14にスケヌリングプレヌンを远加したす \ vec {C} 因数 \アルファ



\ vec {F} = 2 \ vec {M} _4- \ alpha \ vec {C}






そしお状態から芋぀ける \ vec {F} \ cdot \ vec {Q} = 0 スケヌリング係数



\ alpha = \ frac {2 \ vec {M} _4 \ cdot \ vec {Q}} {\ vec {C} \ cdot \ vec {Q}。






亀換 \ vec {C} に \ alpha \ vec {C} 匏で 13



\ vec {M} _3 {^ '} = \ alpha \ vec {C}-\ vec {M} _4






たた、 図5に瀺すように、芖界のピラミッドの遠方の蚈画を最適に方向付けるこずができたす。 7bこの眮換手法は、遠方の蚈画が無限に削陀された可芖性ピラミッドに察しおも正しく機胜したす- 無限投圱行列の堎合 -このため、遠方の蚈画が反察偎の平面の 2぀のゞェネレヌタの1぀ず平行であるこずが必芁です \ vec {C} 面の角床 。



䞊蚘の芳察の実甚化



以前に行われたすべおの理論的研究は、あらゆる可逆射圱行列に適甚されたすが、䟋ずしお、 匏 10のOpenGLの暙準行列が既に䜿甚されおいるため、それを䜿甚しお䟋のチェヌンを続けるこずは論理的です。



逆行列は次のようになりたす。



\ mathbf {M} {^ {-1}} = \ begin {bmatrix} \ frac {r-l} {2n}amp; 0amp; 0amp; \ frac {r + l} {2n} \\ [0.3em] 0amp; \ frac {tb} {2n}amp; 0amp; \ frac {t + b} {2n} \\ [0.3em ] 0amp; 0amp; 0amp; -1 \\ [0.3em] 0amp; 0amp;-\ frac {f-n} {2nf}amp; \ frac {f + n} {2nf} \ end {bmatrix}






匏 18で提案されおいるように、考慮された修正投圱行列の3行目の倀を取埗したす。 \アルファ 匏 17から



\ vec {M} _3 {^ '} = {\ frac {2 \ vec {M} _4 \ cdot \ vec {Q}} {\ vec {C} \ cdot \ vec {Q}} \ vec {C}- \ vec {M} _4






以来 \ vec {M} _4 = \ langle 0、0、-1、0 \ rangle 、この匏は次のように曞くこずができたす



\ vec {M} _3 {^ '} = {\ frac {-2Q_z} {\ vec {C} \ cdot \ vec {Q}} \ vec {C} + \ langle 0、0、1、0 \ rangle






匏 19の逆行列を乗算する \ vec {Q} {^ '} 匏 15から、 \ vec {Q} 



\ vec {Q} = \ begin {bmatrix} sgnC_x\ frac {rl} {2n} + \ frac {r + l} {2n} \\ [0.5em] sgnC_x\ frac {tb} { 2n} + \ frac {t + b} {2n} \\ [0.5em] -1 \\ [0.3em] 1 / f \ end {bmatrix}






射圱行列を修正するための開発された方法の正確性を怜蚌するために、カットオフ平面の䜍眮の特定のケヌスを考慮したす \ vec {C} 軞に垂盎 z 、぀たり 可芖性のピラミッドの通垞のニアプランに平行-座暙レコヌドでは、このような平面は次のようになりたす \ vec {C} = \ langle 0、0、-1、-d \ rangle どこで d -いく぀かの正の距離。 芖界のピラミッドの新しい投圱行列では、 近い蚈画が遠いこずを期埅するのは自然です d カメラから離れるず、 長期蚈画は以前の䜍眮に残りたす。



スカラヌ積 \ vec {C} \ cdot \ vec {Q} そのような平面の堎合は等しくなりたす 1-d / f 、および修正された射圱行列の3行目を蚈算する匏 21は、



\ begin {array} {l} \ vec {M} _3 {^ '} = {\ frac {2} {1-d / f}} \ langle 0、0、-1、-d \ rangle + \ langle 0、 0、1、0 \ rangle \\ [0.3em] \ qquad {} = \ langle 0、0、-\ frac {f + d} {fd}、-\ frac {2fd} {fd} \ rangle \ end {配列}






-期埅ず䞀臎した結果い぀ d = n 倉曎された行列の3行目は、 匏 10の射圱行列の3行目ず䞀臎したす。



すでに䞊蚘で提案したように、ラスタラむズプロセスは、倉曎されおいない可芖性ピラミッドの堎合ほど銎染みがないず予想する必芁がありたす。 ピラミッドゞオメトリの倉曎により、衚瀺ピラミッド内のさたざたな方向に沿っお深床バッファヌ倀の党範囲が達成されたせん。 任意の方向のベクトルを取る \ vec {V} = \ langle V_x、V_y、V_z、0 \ rangle ビュヌカメラのスペヌスで V_zlt; 0 、および正芏化された z 点座暙 \ langle 0、0、1、0 \ rangle + s \ vec {V} 可芖性のピラミッド内にありたす。



\ begin {array} {l} zs= {\ cfrac {\ mathbf {M} {^ '} \ langle sV_x、sV_y、sV_z、1 \ rangle_z} {\ mathbf {M} {^ '} \ langle sV_x、sV_y、sV_z、1 \ rangle_w}} \\ [0.8em] \ qquad {} = {\ cfrac {\ alpha \ vec {C}-\ vec {M} _4\ cdot \ langle sV_x、sV_y、sV_z、1 \ rangle} {\ vec {M} _4 \ cdot \ langle sV_x、sV_y、sV_z、1 \ rangle}} \ end {array}、






どこで \アルファ - 匏 17で導入されたスケヌリング係数。 のために \ vec {M} _4 = \ langle 0、0、-1、0 \ rangle 、 匏 24は



\ begin {array} {l} zs= \ cfrac {\ alpha sC_xV_x + \ alpha sC_yV_y + \ alpha sC_zV_z + sV_z + \ alpha C_w} {-sV_z} \\ [0.8em] \ qquad {} = \ cfrac {\ alpha s\ vec {C} \ cdot \ vec {V}+ sV_z + \ alpha C_w} {-sV_z} \ end {array}。






スカラヌ積 \ vec {C} \ cdot \ vec {V} \ geq 0 、そうでなければポむント \ langle 0、0、1、0 \ rangle + s \ vec {V} 芖界のピラミッドの倖偎にありたす。 状況を考えおみたしょう s 無限になる傟向がありたす



\ lim_ {s \ to \ infty} zs=-\ cfrac {\ alpha\ vec {C} \ cdot \ vec {V}+ V_z} {V_z}、






結果の匏は、正芏化の達成可胜な最倧倀を瀺したす z -方向の座暙 \ vec {V} 。

探玢方向 \ vec {V} = \ langle 0、0、-1、0 \ rangle カメラの䜍眮からの盎芖に沿っお 匏 26で瀺される制限倀は、条件が \ alpha C_zgt; -2 。 この堎合、 z - 長距離座暙 \ vec {F} 匏 16で指定された倀はれロより小さく、 背景は可芖性ピラミッドの範囲を制限する平面ではありたせん。 長期蚈画は方向に沿っお到達できない可胜性があるため \ vec {V} 、 深床バッファの正芏化された倀の範囲は、通垞のピラミッドの可芖性の堎合よりもかなり狭くなるこずがありたす。



プログラマは、遞択した空間モデルをさらに䜜業するこずを承認する前に、修正された斜めの錐台可芖性のピラミッド内の正芏化された座暙の動䜜を確認するこずをお勧めしたす。 問題のある領域をタむムリヌに怜出するこずにより、圌はカメラの䜍眮を修正するか、深床バッファヌの操䜜を単玔化しお通垞モヌドに近づけるような方法で割線面の傟斜角を倉曎するこずができたす。 そのようなアクションのコストは特に重芁ではありたせんが、結果は完璧䞻矩者の萜ち着きに圹立ちたす。

匏 10の暙準の射圱行列を匕き続き掻甚しお、正芏化された倀を調べるための次の䜿甚䟋に進むのは簡単です。 z -修正された可芖性のピラミッド内の座暙



奜きではないゞオメトリを切り取り、可芖性のピラミッドの近くの平面を眮き換える平面が、ガむド䜙匊で次のように衚されるず仮定したす。 \ vec {C} = \ langle C_x、C_y、-C_z、-d \ rangle 、特定のケヌスでは、 C_x、C_y、C_z 正の倀を持぀平面はピラミッドの右䞊隅の反察偎にある C_z -軞の負の方向の間の角床 z プレヌンの法線ベクトル。 正芏化された倉化を考慮しおください z -負の軞方向に沿った座暙 z ニアプレヌンの法線ベクトルず軞の負の方向の間の角床に応じお z 、カメラから背景たでの距離。



スカラヌ積 \ vec {C} \ cdot \ vec {Q} この堎合、 匏 22を考慮しお、次の結果が埗られたす。



\ vec {C} \ cdot \ vec {Q} = \ cfrac {rfC_x + tfC_y-nd-fC_z} {nf}、






倉換された射圱行列の3行目は次の圢匏を取りたす。



\ begin {array} {l} \ vec {M} _3 {^ '} = {\ cfrac {2nf \ langle C_x、C_y、-C_z、-d \ rangle} {rfC_x + tfC_y-nd-fC_z} + \ langle 0、0、1、0 \ rangle} \ end {array}。






正芏化された座暙の動䜜を怜蚎する z ポむントのカメラからの正面ビュヌの方向 \ vec {P} = \ langle 0、0、P_z、1 \ rangle 、倀の範囲から [_n、-f]のP_z \ 正芏化 z -この堎合の座暙は



z = {\ frac {P_z ^ '} {P_w ^'}} =-\ cfrac {rfC_x + tfC_y-nd + fC_zP_z-2nfd} {rfC_x + tfC_y-nd-fC_z P_z} \;  。






最埌の匏は、数倀研究の目的に非垞に適しおいたす。 そのような研究の䟋は図に芋るこずができたす。 8.平面の法線ず軞の負の方向の間の角床が倧きくなるず、深床バッファ甚の正芏化された倀の範囲が急激に狭くなりたす z たた、深床バッファの粟床が倧幅に䜎䞋し、カメラから遠距離に近接方向を移動する可胜性がありたす  近接カメラに近すぎる配眮は、正芏化された座暙の倀に悪圱響を䞎えるこずが知られおいたす。

修正された遠方面






図 8.正芏化された範囲の狭たり z -投圱の方向の座暙 \ vec {V} = \ langle 0、0、-1、0 \ rangle 、 近 割線平面の法線ベクトルず軞の負の方向の間の角床に応じお z 、およびカメラからニア セカント平面たでの距離。 1に近い倀は、調査䞭の空間ポむントが修正された長距離プランの近くにある堎合の状況に察応したすが、 近距離プランは 長距離プランからかなり離れおおり、その法線ベクトルは負の軞方向からわずかにずれおいたす z 。 角床を倧きくし、クロヌズアップ方向をカメラから遠ざけるず、正芏化された倀の範囲 z -座暙は、ほずんどの深床バッファの操䜜に最も䞍適切な倀に狭められたす 。



おわりに



アプリケヌションを開発する過皋で、プログラマはしばしば、速床ず珟実的なレンダリングの劥協点を芋぀けなければなりたせん。 この蚘事で説明する手法により、最も広い範囲のデバむスで最倧のパフォヌマンスを達成できるだけでなく、シヌンを線集しお最も奜たしい衚瀺にするこずが望たしい状況を刀断するこずもできたす。



可芖性ピラミッドを倉曎するプロセスず、倉曎されたピラミッドの深床バッファヌをテストするプロセスを組み合わせるこずたたは䞊蚘の芳察を考慮に入れるこずは、プログラマヌの困難な䜜業の最終結果の高品質を保蚌したす。




文孊



[1] Eric Lengyel、 斜めビュヌの錐台の深さの投圱ずクリッピング 。 Journal of Game Development、Vol。 1、いいえ 22005幎3月、pp。 5-16。



[2] Eric Lengyel、 3Dゲヌムプログラミングおよびコンピュヌタヌグラフィックスの数孊 。 Charles River Media、2002、p。 103。



All Articles