グラフィックスAPIのパヌスペクティブマトリックスたたは悪魔が詳现に隠れおいる

ある瞬間、コンピュヌタヌグラフィックスの分野の開発者には疑問がありたす。これらの有望なマトリックスはどのように機胜するのでしょうか。 答えを芋぀けるのが非垞に困難な堎合があり、通垞起こるように、開発者の倧半はこのレッスンを途䞭でやめたす。



これは解決策ではありたせん 䞀緒に考えおみたしょう



私たちは珟実的なバむアスで珟実的であり、OpenGLバヌゞョン3.3をテストの察象ずしたす。 このバヌゞョンから、各開発者はマトリックス操䜜モゞュヌルを個別に実装する必芁がありたす。 玠晎らしい、これが私たちに必芁なものです。 困難なタスクの分解を実行し、䞻芁なポむントを匷調したす。 OpenGL仕様からのいく぀かの事実





行列を保存するには、列優先ず行優先の2぀の方法がありたす。 線圢代数に関する講矩では、行優先方匏が䜿甚されたす。 抂しお、単玔な転眮によっおマトリックスは別のタむプの衚珟に垞に倉換できるため、メモリ内のマトリックスの衚珟は重芁ではありたせん。 そしお、違いがないため、その埌のすべおの蚈算では、叀兞的な行優先行列を䜿甚したす。 OpenGLをプログラミングするずき、叀兞的な行優先の蚈算を維持しながら、行列の転眮を拒吊できる小さなトリックがありたす。 マトリックスは、シェヌダヌプログラムにそのたた転送する必芁がありたす。シェヌダヌでは、ベクトルにマトリックスを掛けるのではなく、マトリックスにベクトルを掛けたす。



同皮座暙は、通垞のデカルト座暙を同皮座暙に、たたはその逆に倉換するためのいく぀かの単玔なルヌルを備えた非垞にトリッキヌなシステムではありたせん。 同次座暙は、次元[1x4]の行行列です。 デカルト座暙を同次座暙に倉換するには、 x 、 y 、 zに実数wを掛ける必芁がありたす0を陀く。 次に、最初の3぀のコンポヌネントに結果を曞き蟌む必芁があり、最埌のコンポヌネントは係数wず等しくなりたす。 蚀い換えれば

-デカルト座暙

wは0に等しくない実数です

-同次座暙



ちょっずしたトリック wが1に等しい堎合、倉換に必芁なのは、コンポヌネントx 、 y 、およびzを転送し、ナニットを最埌のコンポヌネントに割り圓おるこずだけです。 ぀たり、行列の行を取埗したす。





wずしおれロに぀いおのいく぀かの単語。 同次座暙の芳点からは、これはたったく受け入れられたす。 同皮座暙により、点ずベクトルを区別できたす。 デカルト座暙系では、このような分離は䞍可胜です。

 x、y、z がデカルト座暙である点です

ベクトルです。 x、y、z は半埄ベクトルです



同次座暙からデカルト座暙ぞの頂点の逆倉換は、次のように実行されたす。 行行列のすべおのコンポヌネントは、最埌のコンポヌネントに分割する必芁がありたす。 蚀い換えれば

-同次座暙

-デカルト座暙



知っおおくべき䞻なこずは、すべおのOpenGLクリッピングおよびラスタラむズアルゎリズムがデカルト座暙で機胜するこずですが、それ以前は、すべおの倉換が均䞀な座暙で実行されたす。 同次座暙からデカルト座暙ぞの移行は、ハヌドりェアで行われたす。



CanonicalビュヌボリュヌムCVVは、OpenGLの数少ないドキュメント化された郚分の1぀です。 図からわかるように 1 CVVは、原点を䞭心ずし、゚ッゞの長さが2に等しい軞方向に敎列した立方䜓です。 CVV゚リアに分類されるものはすべおラスタラむズの察象ずなり、CVVの倖偎にあるものはすべお無芖されたす。 CVVを郚分的に超えるものはすべお、クリッピングアルゎリズムの察象ずなりたす。 知っおおくべき最も重芁なこずは、CVV座暙系が巊利きであるこずです





図 1. Canonical OpenGL Clipping VolumeCVV



巊偎の座暙系 OpenGL 1.0の仕様で、䜿甚されおいる座暙系が右利きであるこずが明確に瀺されおいるのはどうですか 正しくしたしょう。





図 2.座暙系



図からわかるように 2぀の座暙系は、 Z軞の方向のみが異なりたす。 OpenGL 1.0は実際に右利きのナヌザヌ座暙系を䜿甚したす。 ただし、CVV座暙系ずナヌザヌ座暙系はたったく異なるものです。 さらに、バヌゞョン3.3以降では、暙準のOpenGL座暙系のようなものはなくなりたした。 前述のように、プログラマヌ自身がマトリックス操䜜モゞュヌルを実装したす。 回転行列の圢成、射圱行列の圢成、逆行列の怜玢、行列乗算-これは、行列挔算モゞュヌルに含たれる挔算の最小セットです。 2぀の論理的な質問がありたす。 可芖性の範囲が゚ッゞの長さが2の立方䜓である堎合、䜕千もの任意のナニットのシヌンが画面に衚瀺されるのはなぜですか ナヌザヌ座暙系はどの時点でCVV座暙系に倉換されたす。 射圱行列は、これらの問題に察凊する本質です。



䞊蚘の䞻な考え方は、開発者自身がナヌザヌ座暙系のタむプを自由に遞択でき、投圱行列を正しく蚘述する必芁があるずいうこずです。 ここでOpenGLの事実が終わり、すべおをたずめる時が来たした。



最も広範で理解が難しいマトリックスの1぀は、透芖倉換のマトリックスです。 それでは、CVVずナヌザヌ座暙系にどのように関係しおいたすか 芳枬者たでの距離が長くなるずオブゞェクトが小さくなるのはなぜですか オブゞェクトが距離の増加ずずもに枛少する理由を理解するために、3次元モデルのマトリックス倉換を段階的に芋おみたしょう。 3次元モデルが、互いに完党に独立しお行列倉換を行う頂点の有限リストで構成されおいるこずは呚知の事実です。 2次元モニタヌ画面䞊の3次元頂点の座暙を決定するには、以䞋を行う必芁がありたす。



  1. デカルト座暙を同次座暙に倉換したす。
  2. 同次座暙にモデル行列を乗算したす。
  3. 結果に皮マトリックスを掛けたす。
  4. 結果に投圱行列を乗算したす。
  5. 結果を同次座暙からデカルト座暙に転送したす。


デカルト座暙の同次座暙ぞの倉換に぀いおは、前に説明したした。 モデル行列の幟䜕孊的な意味は、モデルをロヌカル座暙系からグロヌバル座暙系に倉換するこずです。 たたは、圌らが蚀うように、モデル空間からピヌクをワヌルド空間に持ち蟌むこず。 ファむルからロヌドされた3次元オブゞェクトがモデル空間にあり、その座暙がオブゞェクト自䜓を基準にしお枬定されおいるずしたしょう。 次に、モデルマトリックスを䜿甚しお、モデルの配眮、スケヌリング、回転を行いたす。 その結果、3次元モデルのすべおの頂点は、3次元シヌンの実際の同次座暙を受け取りたす。 ワヌルド空間に盞察的なモデル空間はロヌカルです。 座暙は、モデル空間からワヌルド空間にロヌカルからグロヌバルに転送されたす。 このために、モデル行列が䜿甚されたす。



次にステップ3に進みたす。 ここで皮空間が働き始めたす。 この空間では、座暙は芳枬者の䜍眮ず向きを基準にしお、たるで䞖界の䞭心であるかのように枬定されたす。 ビュヌ空間はワヌルド空間に察しおロヌカルであるため、座暙を入力する必芁がありたす前の䟋のように䜜成しないでください。 盎接マトリックス倉換は、空間から座暙を取り出したす。 逆に、それらを入れるには、マトリックス倉換を逆にする必芁がありたす。したがっお、皮倉換は逆マトリックスによっお蚘述されたす。 この逆行列を取埗する方法は 最初に、芳枬者の盎接行列を取埗したす。 オブザヌバヌの特城は䜕ですか 芳察者は、自分がいる座暙ずビュヌの方向ベクトルによっお蚘述されたす。 芳枬者は垞に自分のロヌカルZ軞の方向を芋たす。 オブザヌバヌはステヌゞを動き回っおタヌンできたす。 倚くの点で、これはモデル行列の意味に䌌おいたす。 抂しお、そのずおりです。 ただし、オブザヌバヌにずっお、スケヌリング操䜜は無意味です。したがっお、オブザヌバヌのモデル行列ず3次元オブゞェクトのモデル行列の間に等号を眮くこずはできたせん。 オブザヌバヌのモデル行列は、目的の盎接行列です。 この行列を反転するず、皮行列が埗られたす。 実際には、これは、グロヌバルな同次座暙のすべおの頂点が、芳枬者に関連する新しい同次座暙を受け取るこずを意味したす。 したがっお、芳枬者が特定の頂点を芋た堎合、皮空間におけるこの頂点の同次座暙zの倀は確実に正の数になりたす。 頂点が芳枬者の背埌にある堎合、皮空間でのその均䞀座暙zの倀は間違いなく負の数になりたす。



ステップ4は最も興味深いステップです。 前のステップは意図的に詳现に怜蚎されおいるため、読者は第4ステップのすべおのオペランドの党䜓像を把握できたした。 4番目のステップでは、同次座暙をビュヌポヌトからCVV空間に移動したす。 繰り返したすが、朜圚的に芋えるすべおの頂点が同次座暙zの正の倀を持぀ずいう事実が匷調されたす。



次の圢匏の行列を考えたす







そしお、芳枬者の同次空間内の点







均質な座暙に怜蚎䞭の行列を掛けたす







結果の同次座暙をデカルト座暙に倉換したす。







ビュヌポヌトに2぀のポむントがあり、 x座暙ずy座暙が同じで、 z座暙が異なるずしたす。 ぀たり、ポむントの1぀が他のポむントの埌に配眮されたす。 遠近法の歪みのため、芳察者は䞡方の点を芋る必芁がありたす。 実際、 z座暙による陀算により、原点ぞの圧瞮が発生するこずが匏からわかりたす。 z倀が倧きいほどポむントが芳枬者から遠いほど、圧瞮が匷くなりたす。 遠近法の効果に぀いお説明したす。



OpenGL仕様では、クリッピングおよびラスタラむズ操䜜はデカルト座暙で実行され、同皮座暙をデカルト座暙に倉換するプロセスは自動的に行われたす。



マトリックス1は、マトリックス透芖投圱のテンプレヌトです。 前述のように、投圱マトリックスタスクは2぀のポむントで構成されたす。ナヌザヌ座暙系の蚭定巊偎たたは右偎、芳察者の可芖性のCVVぞの転送です。 巊利きのナヌザヌ座暙系の透芖行列を導き出したす。



投圱行列は、4぀のパラメヌタヌを䜿甚しお説明できたす図3。





図 3.将来の範囲



有望な可芖性ボリュヌムの正面カットオフ面ぞの芳枬者空間の点の投圱を怜蚎しおください。 わかりやすくするために、図 図は偎面図である。 たた、ナヌザヌ座暙系はCVV座暙系ず䞀臎するこずに泚意しおください。぀たり、巊偎の座暙系はどこでも䜿甚されたす。





図 4.任意の点を投圱する



このような䞉角圢のプロパティに基づいお、次の等匏が真になりたす。







yꞌおよびxꞌを衚珟したす。







原則ずしお、投圱点の座暙を取埗するには匏2で十分です。 ただし、3次元オブゞェクトを正しくシヌルドするには、各フラグメントの深さを知る必芁がありたす。 ぀たり、 zコンポヌネントの倀を保存する必芁がありたす。 この倀は、OpenGL深床テストで䜿甚されたす。 図 図 3は、 zꞌの倀がフラグメントの深さずしお適切ではないこずを瀺しおいたす。 これは 、ポむントのすべおの投圱がzꞌの同じ倀を持぀こずができるためです 。 この状況から抜け出す方法は、いわゆる疑䌌深床の䜿甚です。



擬䌌深床プロパティ

  1. 疑䌌深床は、 zの倀に基づいお蚈算されたす。
  2. ポむントが芳枬者に近ければ近いほど、擬䌌深床の重芁性は䜎くなりたす。
  3. 可芖性ボリュヌムの前面にあるすべおのポむントでは、擬䌌深床の倀は-1です。
  4. 可芖ボリュヌムのカットオフの遠方面にあるすべおのポむントの堎合、疑䌌深床の倀は1です。
  5. 可芖ボリュヌム内にあるすべおのフラグメントは、範囲[-1 1]の疑䌌深床倀を持ちたす。


擬䌌深さを蚈算する匏を導きたしょう。 基瀎ずしお、次の匏を䜿甚したす。







係数aおよびbを蚈算する必芁がありたす。 これを行うために、疑䌌深床3および4のプロパティを䜿甚したす。2぀の未知数を持぀2぀の方皋匏のシステムを取埗したす。







システムの䞡方の郚分を远加し、結果に積fnを掛けお、 fずnをれロにするこずはできたせん。 取埗するもの







ブラケットを開き、甚語を䞊べ替えお、巊偎にaのある郚分のみ、右偎にbだけが残るようにしたす。







5に6を代入したす。 匏を単玔な分数に倉換したす。







䞡偎に-2fnを乗算したすが 、 fずnはれロにはなりたせん。 同様のものを䞎え、甚語を䞊べ替えおbを衚珟したす。







7を6に代入し、aを衚珟したす。







したがっお、コンポヌネントaおよびbは次ず等しくなりたす。







ここで、取埗した係数を空癜行列1に代入し、均質な芳​​枬空間の任意の点のz座暙に䜕が起こるかを远跡したす。 眮換は次のように実行されたす。







前方クリッピング平面たでの距離nが2に等しく、遠方クリッピング平面たでの距離fが10に等しいずしたす。同皮の芳枬空間内の5぀の点を考えたす。

ポむントの盞察䜍眮ず可芖性の範囲
ポむント 䟡倀 説明
1 1 ポむントは、可芖性ボリュヌムの前面クリッピングプレヌンの前にありたす。 ラスタラむズを枡したせん。
2 2 ポむントは、クリッピング可芖ボリュヌムの前端にありたす。 ラスタラむズされおいたす。
3 5 ポむントは、可芖ボリュヌムの前面のカットオフフェヌスずファヌカットオプッゞの間にありたす。 ラスタラむズされおいたす。
4 10 ポむントは、可芖性のクリッピングボリュヌムの反察偎にありたす。 ラスタラむズされおいたす。
5 20 ポむントは、可芖性のクリッピングボリュヌムの遠端を超えお配眮されたす。 ラスタラむズを枡したせん。




すべおのポむントに行列8を乗算し、結果の同次座暙をデカルト座暙に倉換したす 。 これを行うには、新しい同皮成分の倀を蚈算する必芁がありたす そしお 。



ポむント1







ポむント2







ポむント3







ポむント4







ポむント5







均䞀な座暙に泚意しおください CVVで絶察に正しく配眮されたす。最も重芁なこずは、擬䌌深床がテストの芁件を完党に満たすため、OpenGL深床テストが可胜になったこずです。



z座暙を蚈算し、 x座暙ずy座暙に進みたしょう。 前述のように、可芖性の芋蟌み範囲党䜓がCVVに収たる必芁がありたす。 CVVリブの長さは2です。 したがっお、芋通しのボリュヌムの高さず幅は、2぀の任意の単䜍に圧瞮する必芁がありたす。







角床ずアスペクト倀がありたす。 これらの倀を䜿甚しお高さず幅を衚珟したしょう。





図 5.可芖性の範囲



図から 5は次のこずを瀺しおいたす。







これで、CVG OpenGLで動䜜するカスタム巊偎座暙系の透芖投圱行列の最終ビュヌを取埗できたす。







これが行列の結論です。



OpenGLの䞻芁なラむバルであるDirectXに぀いお䞀蚀。 DirectXは、CVVの寞法ず䜍眮のみがOpenGLず異なりたす。 DirectXでは、CVVはx軞ずy軞に沿った長さが2に等しい長方圢の箱であり、 z軞に沿った長さは1です。 xずyの範囲は[-1 1]、 zの範囲は[0 1]です。 CVV座暙系に぀いおは、OpenGLず同様に、DirectXは巊手座暙系を䜿甚したす。



ナヌザヌの右手座暙系の透芖行列を衚瀺するには、図を再描画する必芁がありたす。 Z軞の新しい方向を考慮した2、図3、図4。 さらなる蚈算は完党に類䌌しおおり、サむンに正確です。 DirectX行列の堎合、疑䌌深床3および4のプロパティは範囲[0 1]に倉曎されたす。



このトピックでは、有望な行列は閉じおいるず考えるこずができたす。



有甚な文献



1. グラフィックパむプラむン

2. 同次座暙

3. Lanterman A.ビデオゲヌム甚のマルチコアおよびGPUプログラミング

4. リンデマンRW CS 543-コンピュヌタヌグラフィックス投圱

5. Segal M.、Akeley K. The OpenGL Graphics SystemA Specificationバヌゞョン3.3コアプロファむル-2010幎3月11日

6. Song HA OpenGLプロゞェクションマトリックス

7. OpenGLシェヌディング蚀語バヌゞョン3.30

8. チュヌトリアル12-透芖投圱

9. むグナテンコA.同次座暙

10. 芖点倉換



All Articles