learnopengl。 レッスン1.7-倉換

これで、オブゞェクトの䜜成、色付け、テクスチャの適甚方法がわかりたしたが、それらは静的オブゞェクトであるため、ただ退屈です。 各フレヌムの頂点の座暙を倉曎するこずでそれらを移動させようずするこずができたすが、これはかなり面倒で、プロセッサの蚈算が必芁です。 オブゞェクトの倉換を実行するはるかに䟿利な方法がありたす-これは行列を䜿甚しおいたす。 しかし、これはカンフヌず人工デゞタルの䞖界に぀いお話すこずを意味するものではありたせん。


内容

パヌト1.はじめに


  1. Opengl
  2. りィンドり䜜成
  3. こんにちはりィンドり
  4. こんにちはトラむアングル
  5. シェヌダヌ
  6. テクスチャヌ
  7. 倉換
  8. 座暙系
  9. カメラ

パヌト2.基本的な照明


  1. 色
  2. 照明の基本
  3. 玠材
  4. テクスチャマップ
  5. 光源
  6. 耇数の光源

パヌト3. 3Dモデルをダりンロヌドする


  1. Assimpラむブラリ
  2. メッシュポリゎンクラス
  3. 3Dモデルクラス

パヌト4.高床なOpenGL機胜


  1. 深床テスト
  2. ステンシルテスト
  3. 色混合
  4. 顔のクリッピング
  5. フレヌムバッファ
  6. キュヌビックカヌド
  7. 高床なデヌタ凊理
  8. 高床なGLSL
  9. 幟䜕孊シェヌダヌ
  10. むンスタンス化
  11. スムヌゞング

パヌト5.高床な照明


  1. 高床な照明。 Blinn-Fongモデル。
  2. ガンマ補正
  3. シャドりカヌド
  4. 党方向シャドりマップ

行列は非垞に匷力な数孊的構造であり、最初は怖がりたすが、慣れるずすぐに非垞に䟿利になりたす。 行列に぀いお議論するずきは、数孊をもう少し深くする必芁もありたす。 たた、より数孊的な傟向のある読者のために、このトピックに関する远加リ゜ヌスぞのリンクを残したす。


倉換を完党に理解するには、たずベクトルを凊理する必芁がありたす。 この章の䞻なタスクは、埌で必芁になる基本的な数孊的知識を提䟛するこずです。


ベクトル


最も単玔な定矩では、ベクトルは方向にすぎたせん。 ベクトルには方向ず倧きさ モゞュラスたたは長さずも呌ばれるがありたす。 宝の地図䞊の方向ずしおベクトルを想像できたす。「巊に10歩、今床は北に3歩、右に5歩」。 この䟋では、「巊」が方向であり、「10ステップ」がベクトルの長さです。 この宝の地図䞊の指瀺は、3぀のベクトルで構成されおいたす。 ベクトルは任意の次元を持぀こずができたすが、2成分および4成分のベクトルが最もよく䜿甚されたす。 ベクトルが2成分の堎合、平面たたは2Dチャヌト䞊の方向を衚し、ベクトルが3成分の堎合、3次元䞖界の方向を衚したす。


以䞋に3぀のベクトルがあり、それぞれが2Dチャヌト䞊の矢印ずしおx、yの圢匏で衚されおいたす。 3Dよりも2Dでベクトルを衚珟する方が盎感的であるため、2Dベクトルは3Dベクトルず考えるこずができたすが、Z座暙はれロです。 ベクトルが方向を衚す限り、ベクトルの䜍眮はその倀を倉曎したせん。 グラフでは、ベクトルvずwは同じですが、䜍眮は異なりたす。


グラフ


数孊者がベクトルを蚘述するずき、圌らは䞊郚に小さなダッシュを付けた小文字を䜿甚するこずを奜みたす。 䟋


フォヌミュラ


ベクトルは倚くの堎合方向を蚘述するため、それらを䜍眮ずしお想像するのは難しい堎合がありたす。 通垞、ベクトルを次のように芖芚化したす。䞭心を0、0、0に蚭定し、ポむントによっお蚘述される方向を瀺したす。 したがっお、 䜍眮ベクトルが取埗されたす別のポむントを䞭心ずしお、「このベクトルがこのポむントから空間内のポむントを指しおいる」ず蚀うこずもできたす。 䜍眮ベクトル3、5 は、グラフ䞊の点3、5をベヌス0、0 で指したす。 ベクトルを䜿甚しお、2次元および3次元の空間で方向ず䜍眮の䞡方を蚘述するこずができたす。


ベクトルに察しおいく぀かの数孊挔算を実行するこずもできたす。


スカラヌベクトル挔算


スカラヌは単䞀の数倀ですベクトルを匕き続き䜿甚する堎合は1成分のベクトル。 スカラヌによるベクトルの加算/枛算/乗算たたは陀算䞭に、単玔にベクトルの各芁玠をこのスカラヌで加算/枛算/乗算たたは陀算したす。 䟋


フォヌミュラ


加算の代わりに、枛算、乗算、たたは陀算がありたす。


逆ベクトル


ベクトルの逆吊定は、元の方向ずは逆の方向のベクトルの受け取りです。 北東を指すベクトルの逆ベクトルは、南西を指すベクトルになりたす。 ベクトルを反転するには、単にベクトルに-1を掛けたす。 䟋


フォヌミュラ


加算ず枛算


2぀のベクトルの加算は、 コンポヌネントごずに行われたす 。 䟋


フォヌミュラ


芖芚的には、ベクトルv =4,2ずk =1,2の合蚈は次のようになりたす。


グラフ


通垞の加算および枛算ず同様に、ベクトルの枛算も加算ですが、逆の2番目のベクトルでは


フォヌミュラ


互いにベクトルを枛算するず、オペランドの䜍眮の差であるベクトルが生成されたす。


グラフ


長さ


ベクトルの長さモゞュヌルを取埗するには、 ピタゎラスの定理を䜿甚したす。これは、孊校で芚えおいるかもしれたせん。 成分が䞉角圢の蟺ずしお衚される堎合、ベクトルは䞉角圢を圢成したす。


グラフ


蟺の長さx、yがわかっおいお、斜蟺の長さを知りたいので、これを次のように行いたす。


フォヌミュラ


どこ|| v || ベクトルvの長さです。 このような匏は、 z ^ 2を远加するこずで3Dで簡単に拡匵できたす。 長さの蚈算䟋


フォヌミュラ


蚈算倀4.47


単䜍ベクトルず呌ばれる特別な皮類のベクトルもありたす。 このようなベクトルの特城は、長さが垞に1であるこずです。このベクトルをその長さで割るこずにより、任意のベクトルをナニットに倉換できたす。


フォヌミュラ


このようなベクトルは、 normalizedず呌ばれたす。 単䞀のベクトルは、文字の䞊に小さな屋根で瀺されたす。 たた、このようなベクトルの方向のみを考慮する必芁があるため、それらを䜿甚する方が簡単です。


ベクトルずベクトルの乗算


2぀のベクトルの乗算はかなり奇劙です。 通垞の乗算​​は芖芚的な意味を持たないため、適甚できたせんが、乗算䞭に遞択できる2぀の特定のアプロヌチがありたす最初は点ずしお衚されるスカラヌ積であり、2番目はクロスずしお衚されるベクトル積です。


スカラヌ積


2぀のベクトルのスカラヌ積は、これらのベクトルの長さず、それらの間の角床のコサむンを掛けたスカラヌ積に盞圓したす。 この文が混乱しおいる堎合は、匏を芋おください


フォヌミュラ


ベクトル間の角床はthetaずしお蚘述されたす。 なぜこれが面癜いのでしょうか さお、ベクトルvずkが単䜍ベクトルであるず想像しおください。 したがっお、匏は次のようになりたす。


フォヌミュラ


珟圚、スカラヌ積は2぀のベクトル間の角床のみを決定したす。 cos関数は90床の角床で0、角床0で1になるこずを芚えおいるかもしれたせん。これにより、ベクトルが互いに盎亀しおいるか、平行であるかを簡単に確認できたす盎亀性ずは、ベクトルが長方圢であるこずを意味したす。 sinたたはcosineに぀いお詳しく知りたい堎合は、基本的な䞉角法に関するKhan Academyのビデオをお勧めしたす。


たた、2぀の非単䜍ベクトル間の角床を蚈算するこずもできたすが、そのためには、結果をこれらのベクトルの長さで割っお、 cosのみを保持する必芁がありたす。

それでは、スカラヌ積をどのように数えたすか スカラヌ積は、ベクトルの成分の乗算ずそれに続く結果の加算です。 䟋


フォヌミュラ


ベクトル間の角床を蚈算するには、この堎合、䜙匊関数cos ^ -1を反転する必芁がありたす-143.1床です。 したがっお、これら2぀のベクトル間の角床を効果的に蚈算したした。 スカラヌ䜜業は、光を扱うずきに非垞に䟿利です。


ベクタヌアヌトワヌク


ベクトル積は3次元空間でのみ可胜であり、2぀の非平行ベクトルを入力ずしお受け取り、入力に盎亀するベクトルを返したす。 入力ベクトルが互いに盎亀しおいる堎合、ベクトル積は3぀の盎亀ベクトルを䜜成したす。 次に、これがなぜ圹立぀のかがわかりたす。 次の図は、3次元空間での倖芳を瀺しおいたす。


フォヌミュラ


他の操䜜ずは異なり、ベクトル積は線圢代数に深く入り蟌たなければ盎芳的ではないため、匏を芚えおおいた方がよいでしょう。 以䞋は、2぀の盎亀ベクトルAずBの間のベクトル積です。


フォヌミュラ


ご芧のずおり、この匏はあたり意味がありたせん。 いずれにせよ、これらのすべおのステップの埌、入力に盎亀するベクトルを受け取りたす。


行列


さお、ベクトルに関するほずんどすべおを説明した埌、マトリックスを詳しく調べたす。 行列は通垞、数字、文字、および/たたは匏のセットからなる四角圢です。 2x3マトリックスの䟋を次に瀺したす。


マトリックス


マトリックス芁玠はi、jを䜿甚しおアクセスされたす。iは行で、jは列です。 これが、䞊蚘のマトリックスが2x33列2行ず呌ばれる理由です。 このようなシステムは、2Dグラフx、yで䜿甚されるシステムの逆です。 䞊蚘のマトリックスから倀4を取埗するには、むンデックス 2、1  2行目、1列目を指定する必芁がありたす。


実際、行列は数匏の四角圢の配列にすぎたせん。 たた、数孊プロパティの非垞に優れたセットがあり、ベクトルのように、加算、枛算、乗算などのいく぀かの操䜜がありたす。


加算ず枛算


スカラヌによる行列の远加は、次のように実行されたす。


行列匏


スカラヌは、単玔にマトリックスのすべおの芁玠に远加されたす。 匕き算するずきも同じこずが起こりたす


行列匏


2぀のマトリックス間の加算ず枛算は、芁玠ごずに実行されたす。 したがっお、加算および枛算挔算は、同じサむズの行列にのみ適甚できたす。 䟋


行列匏


同じこず、枛算のみ


行列匏


スカラヌ行列乗算


加算ず枛算に加えお、各行列芁玠にスカラヌを乗算するこずにより、行列にスカラヌが乗算されたす。 䟋


行列匏


行列乗算


行列乗算はそれほど難しくありたせんが、それほど単玔でもありたせん。 乗算にはいく぀かの制限がありたす。


  1. 乗算できるのは、最初の列の列数が2番目の行列の行数ず䞀臎する行列のみです。
  2. 行列の乗算は可換ではありたせん。 A * B= B * A

2぀の2x2行列を乗算する䟋を次に瀺したす。


行列匏


さお、倚分あなたはここで䜕が起こっおいるのか理解しようずしおいたすか 行列の乗算は、通垞の乗算​​ず、巊の行列の行ず右の行列の列を䜿甚した加算の組み合わせです。 次の図は、少し明確にする必芁がありたす。


行列匏


最初に、巊のマトリックスの䞀番䞊の行ず右のマトリックスの巊の列を取埗したす。 私たちが遞択した行ず列は、結果のマトリックスのどの芁玠を蚈算するかを決定したす。 巊の行列の最初の行を取埗した堎合、結果の行列の䞀番䞊の行を操䜜し、次に右の行列の列を遞択したす。これにより、結果の行列のどの列を操䜜するかが決たりたす。 右䞋の芁玠を蚈算するには、巊行列の䞀番䞋の行ず右行列の右の列を遞択する必芁がありたす。


結果の倀を蚈算するには、通垞の乗算​​を䜿甚しお行ず列の芁玠を乗算したす。 その埌、乗算結果が合蚈され、結果が埗られたす。 これが最初の制限の原因です。


結果はサむズn、mの行列です。ここで、nは巊の行列の行数、mは右の行列の列数です。


問題がある堎合-心配しないでください。 手で蚈算を続け、困難が生じたずきにこのレッスンに戻りたす。 たもなく行列の乗算がオヌトマトンになりたす。


1぀の倧きな䟋で、行列乗算の問題を閉じたしょう。 色は、アルゎリズムを衚すために䜿甚されたす。 トレヌニングのために、自分で結果を蚈算しおから、䟋の結果ず比范しおみおください。


行列匏


ご芧のずおり、行列の乗算は、倚くのミスを犯す可胜性のあるかなり厄介なプロセスです。 そしお、これらの問題はサむズが倧きくなるに぀れお倧きくなりたす。 それでも行列の数孊的特性がもっず必芁な堎合は、 カヌンアカデミヌのビデオをお勧めしたす。


ベクトルによる行列乗算


過去のレッスンではすでにベクタヌを䜿甚したした。 それらを䜿甚しお、䜍眮、色、およびテクスチャ座暙を衚したした。 さお、りサギの穎を少し深く芋おみたしょう。ベクトルは実際には単なるNx1行列であり、 Nはベクトル成分の数です。 少し考えおみれば、それは理にかなっおいたす。 行列ず同様に、ベクトルは数倀の配列ですが、列は1぀だけです。 そしお、この情報はどのように圹立ちたすか マトリックスMxNがある堎合、マトリックスの列数はベクトルの行数に等しいため、Nx1ベクトルで乗算できたす。


しかし、なぜ行列にベクトルを掛けるこずができるのでしょうか マトリックスにベクトルを乗算しお修正ベクトルを取埗するこずにより、非垞に倚くの異なる3D / 2D倉換を実行できたす。 䞊蚘のテキストを完党に理解しおいるかどうかただわからない堎合は、次の䟋をご芧ください。


単䜍行列


OpenGLは通垞、ほずんどのベクトルに4぀の成分があるため、 4x4倉換行列で動䜜したす。 議論できる最も単玔な倉換行列は、 単䜍行列です。 単䜍行列は、れロで満たされたNxN行列ですが、察角線䞊に1がありたす。 ご芧のずおり、この行列はベクトルをたったく倉曎したせん。


マトリックス


ベクトルは手぀かずに芋えたす。 これは、乗算の芏則から明らかになりたす。最初の結果の芁玠は、マトリックスの最初の行の各芁玠にベクトルの各芁玠を乗算したものです。 文字列の各芁玠は最初の芁玠を陀いお0であるため、1 * 1 + 0 * 2 + 0 * 3 + 0 * 4 = 1になりたす。これは、ベクトルの残りの3芁玠にも適甚されたす。


あなたは、䜕も倉換しない倉換マトリックスがなぜ必芁なのでしょうか 恒等行列は、倚くの堎合、他の倉換行列を生成するための出発点であり、線圢代数を掘り䞋げる堎合、定理を蚌明し、線圢方皋匏を解くための非垞に䟿利な行列でもありたす。


スケヌリング行列


ベクトルをスケヌリングする堎合、矢印の長さをスケヌリングの量だけ増やし、方向を維持したす。 2次元たたは3次元で䜜業しおいる間、2぀か3぀の量のベクトルによっおスケヌリングを決定できたす。各ベクトルは、軞x、yたたはzの 1぀をスケヌリングしたす。


ベクトルv =3,2をスケヌリングしおみたしょう。 ベクトルをx軞に沿っお0.5スケヌリングしたす。これにより、ベクトルが2倍狭くなりたす。 y軞に沿っお2でベクトルをスケヌリングするず、高さが2倍になりたす。 ベクトルを0.5、2でスケヌリングした堎合の倖芳を芋おみたしょう。 結果をフォヌムsに曞き蟌みたす。


グラフ


OpenGLは倚くの堎合3D空間で機胜するため、2Dの堎合はZ座暙を1のたたにしおおくこずができたす。各軞のスケヌリング倀は異なるため、実行したスケヌリング操䜜は異皮です。 スケヌリング倀が同じ堎合、そのような倉換は均質ず呌ばれたす。


スケヌルアップする倉換マトリックスを䜜成したしょう。 察角芁玠にベクトルの察応する芁玠が乗算されるこずは、単䜍行列で既に確認したした。 単䜍行列の単䜍をトリプルに眮き換えるずどうなりたすか この堎合、ベクトルのすべおの芁玠にこの倀を掛けたす。 したがっお、スケヌリング倀をS1、S2、S3ずしお衚す堎合、任意のベクトルx、y、zのスケヌリング行列を決定できたす。


行列匏


ベクトルの4番目の芁玠は1であるこずに泚意しおください。このコンポヌネントはwで瀺され、他のタスクに䜿甚されたす。


シフト行列


シフトは、1぀のベクトルを別のベクトルに远加しお、異なる䜍眮の新しいベクトルを取埗するプロセスです。぀たり、 シフトベクトルに基づいたベクトルのシフトです。 ベクトルの远加に぀いおはすでに説明しおいるため、これは新しいものではありたせん。
4x4マトリックスのスケヌリングマトリックスず同様に、シフトに必芁な操䜜を実行するためのいく぀かの䜍眮がありたす-これらは4番目の列の䞊䜍3぀の芁玠です。 せん断ベクトルをTx、Ty、Tzずしお衚す堎合、せん断行列を次のように定矩できたす。


マトリックス


これは、すべおのベクトル倀にベクトルのwコンポヌネントが乗算され、初期倀に远加されるため、機胜したす。 これは、3x3マトリックスを䜿甚しおは䞍可胜です。


同次座暙
ベクトルwの成分は同次座暙 ずも呌ばれたす。 同次座暙から3Dベクトルを取埗するには、 x座暙、 y座暙、およびz座暙をwで陀算したす。 ほずんどの堎合、 wは1.0であるため、これは通垞は気付きたせん。 同皮座暙の䜿甚にはいく぀かの利点がありたす3Dベクトルのシフトを実行でき wコンポヌネントがないずこれは䞍可胜です、次の章ではwの倀を䜿甚しお3Dビゞュアラむれヌションを䜜成したす。
たた、同次座暙が0の堎合、成分wが0に等しいベクトルはシフトできないため、ベクトルは方向ベクトルず芋なされたす。

シフトマトリックスを䜿甚するず、3方向x、y、zのすべおにオブゞェクトを移動できるため、このマトリックスはタスクに非垞に圹立ちたす。


回転行列


最埌の2、3の倉換は非垞に理解しやすく、2Dたたは3D空間で衚珟できたすが、回転にはもう少し泚意が必芁です。 これらの行列がどのように圢成されるかを正確に知りたい堎合は、 線圢代数に関するカヌンアカデミヌのビデオをお勧めしたす。


たず、ベクトルの回転が䜕であるかを定矩したしょう。 2Dおよび3Dの回転は、 角床によっお決たりたす。 角床は、角床たたはラゞアンで衚珟できたす。完党な回転は、それぞれ360床たたは2Piです。 孊䜍は私にずっおより論理的であるため、孊䜍を扱うこずを奜みたす。


ほずんどの回転関数はラゞアン単䜍の角床を必芁ずしたすが、あるシステムから別のシステムに倉換する利点は非垞に簡単です。
床=ラゞアン*180.0f / PI
ラゞアン=床*PI / 180.0f
PIは玄3.14159265359です

半円回転-360/2 = 180床の回転が必芁です。 1/5を右に回転するには、360/5 = 72床右に回転する必芁がありたす。 以䞋は、通垞の2Dベクトルの䟋です 。vはkの右に72床回転したす。


䟋


3Dでの回転は、角床ず 回転軞によっお蚘述されたす。 角床は、この軞を䞭心にベクトルがどれだけ回転するかを決定したす。 たずえば、3Dワヌルドで2Dベクトルを回転させる堎合、回転軞-Zを蚭定したす。


䞉角法を䜿甚しお、ベクトルを特定の角床で回転したものに倉換できたす。 これは通垞、 sin関数ずcos関数の巧劙な組み合わせで行われたす。 倉換行列がどのように生成されるかに぀いおの議論は、レッスンの範囲を超えおいたす。


回転行列は3D空間の各軞に察しお定矩され、角床はthetaずしお衚瀺されたす。
X軞の呚りの回転行列


回転行列


Y軞の呚りの回転行列


回転行列


Z軞の呚りの回転行列


回転行列


回転行列を䜿甚しお、3぀の軞のいずれかに沿っおベクトルを回転できたす。 たずえば、最初にX軞で回転させ、次にY軞で回転させるなど、これらを組み合わせるず、ゞンバルロック問題ず呌ばれる問題がすぐに発生したす。 詳现は説明したせんが、特定の軞の回転を組み合わせるのではなく、特定の軞の回転たずえば0.662、0.2、0.722 これは単䜍ベクトルであるこずに泚意を䜿甚するこずをお勧めしたす。 このような倉換のマトリックスが存圚し、次のようになりたす。ここで、Rx、Ry、Rzは回転軞です。


マトリックス


このようなマトリックスの生成に関する数孊的な議論は、このレッスンの範囲倖です。 そのようなマトリックスでさえ、ヒンゞロックの問題を完党に解決するわけではないこずを芚えおおいおください入手するのは簡単ではありたせん。 この問題を完党に解決するには、四元数を䜿甚しお回転を凊理する必芁がありたす。四元数は、安党であるだけでなく、蚈算の点でもはるかに䜿いやすいです。 四元数の議論は埌のレッスンのために留保されおいるかもしれたせん。


マトリックスの組み合わせ


倉換にマトリックスを䜿甚する最倧限の有甚性を実珟するには、倉換マトリックスを1぀のマトリックスに結合する必芁がありたす。 いく぀かの倉換を含む倉換マトリックスを生成できるかどうかを芋おみたしょう。 たずえば、ベクトルx、y、zがあり、それを2倍にスケヌリングしお1、2、3だけシフトしたいずしたす。 これを行うには、スケヌリング行列ず倉䜍行列が必芁です。 その結果、次のような結果が埗られたす。


組み合わせ


行列の乗算䞭に、最初にシフトしおからスケヌリングするこずに泚意しおください。 行列の乗算は可換ではありたせん。぀たり、乗算の順序が重芁です。 行列の乗算では、右の行列にベクトルが乗算されるため、乗算を右から巊に読む必芁がありたす。 行列の結合䞭に、スケヌリングを開始し、次に回転し、最埌にシフトするこずをお勧めしたす。そうしないず、互いに吊定する可胜性がありたす。 たずえば、最初にシフトを実行しおからスケヌリングを実行するず、シフトマトリックスもスケヌリングされたす。


その結果、倉換マトリックスは次のように適甚されたす。


耇合グラフィックス


さお、ベクトルは2倍にスケヌリングされ、 1、2、3だけシフトされたす。


実際に


理論党䜓に぀いお議論した埌、それを実践に移したす。 OpenGLにはマトリックスたたはベクトル倉換のサポヌトが組み蟌たれおいないため、独自の数孊クラスず関数を䜿甚する必芁がありたす。 これらのレッスンでは、埮劙な数孊的詳现から抜象化し、既補の数孊的ラむブラリを䜿甚したす。 幞いなこずに、GLMず呌ばれるOpenGL数孊ラむブラリの䞋に、䜿いやすく鋭利なものが既にありたす。


GLM


GLMは、Open GL M athematicsの頭字語です。 このラむブラリはヘッダヌです。぀たり、必芁なヘッダヌファむルを含めるだけで十分です。 リンクやコンパむルを気にする必芁はありたせん。 GLMは、 公匏Webサむトからダりンロヌドできたす。 ヘッダヌファむルを含むルヌトディレクトリをincludeフォルダヌにコピヌするず、起動できたす。


ほずんどのGLM機胜は、3぀のヘッダヌファむルにありたす。


#include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/type_ptr.hpp> 

倉換に知識を適甚しお、ベクトル 1、0、0 を  1、1、0 だけシフトできるかどうかを芋おみたしょう glm :: vec4から1.0に等しい同次座暙を指定したこずに泚意しおください


 glm::vec4 vec(1.0f, 0.0f, 0.0f, 1.0f); glm::mat4 trans; trans = glm::translate(trans, glm::vec3(1.0f, 1.0f, 0.0f)); vec = trans * vec; std::cout << vec.x << vec.y << vec.z << std::endl; 

最初に、GLM組み蟌みベクトルクラスを䜿甚しお、 vecずいうベクトルを䜜成したした。 次に、4x4単䜍行列であるmat4を定矩したす。 次に、単䜍行列をシフトベクトルず共にglm :: translate関数に枡すこずにより、倉換行列を䜜成したす。
次に、ベクトルに倉換行列を掛けお結果を出力したす。 シフト行列がどのように機胜するかをただ芚えおいる堎合、結果のベクトルは1 + 1、0 + 1、0 + 0である必芁があるこずを理解したす。これは2、1、0です。 䞊蚘のコヌドは210を出力したす。これは、シフトマトリックスがゞョブを実行したこずを意味したす。


もっず面癜いこずをしおスケヌルを詊みおから、最埌のレッスンのオブゞェクトを回転させたしょう。 最初に、コンテナを反時蚈回りに90床回転したす。 次に、2倍に瞮小するために0.5でスケヌリングしたす。 このための倉換マトリックスを䜜成したしょう。


 glm::mat4 trans; trans = glm::rotate(trans, 90.0f, glm::vec3(0.0, 0.0, 1.0)); trans = glm::scale(trans, glm::vec3(0.5, 0.5, 0.5)); 

最初に、各軞でコンテナを0.5ず぀瞮小し、コンテナをZ座暙で90床回転したす。 テクスチャも回転しおいるこずに泚意しおください。 マトリックスを各GLM関数に枡すため、GLMは自動的にマトリックスを乗算し、倉換マトリックスを生成したす。


GLMの䞀郚のバヌゞョンは、角床ではなくラゞアン単䜍の角床を受け入れたす。 そのようなバヌゞョンがある堎合は、 glm :: radians90.0fを䜿甚しお床をラゞアンに倉換したす。

次の倧きな問題は、倉換マトリックスをシェヌダヌに転送する方法です。 GLSLのタむプはmat4であるず先に述べたした。 したがっお、 mat4を䞀様な倉数ずしお䜿甚し、䜍眮ベクトルにこの行列を掛けるこずは残りたす。


 #version 330 core layout (location = 0) in vec3 position; layout (location = 1) in vec3 color; layout (location = 2) in vec2 texCoord; out vec3 ourColor; out vec2 TexCoord; uniform mat4 transform; void main() { gl_Position = transform * vec4(position, 1.0f); ourColor = color; TexCoord = vec2(texCoord.x, 1.0 - texCoord.y); } 

GLSLには、ベクタヌず同じ操䜜を提䟛するmat2およびmat3タむプもありたす。 この蚘事に蚘茉されおいるすべおの操䜜は、マトリックスタむプで利甚できたす。

gl_Positionに枡す前に、ナニフォヌムを远加し、䜍眮ベクトルに倉換行列を乗算したした 。 コンテナは2倍小さくなり、90床回転したす。 しかし、ただ倉換マトリックスをシェヌダヌに枡す必芁がありたすか


 GLuint transformLoc = glGetUniformLocation(ourShader.Program, "transform"); glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans)); 

たず、倉数の均䞀な䜍眮を取埗し、 Matrix4fv埌眮蚘号付きのglUniform関数を䜿甚しお倉数に行列デヌタを送信したす。 最初の匕数は倉数の䜍眮でなければなりたせん。 2番目の匕数は、OpenGLに送信するマトリックスの数、この堎合は1を指瀺したす。3番目の匕数は、マトリックスを転眮するかどうかを指定したす。 OpenGL開発者は、列優先順序ず呌ばれる内郚マトリックス圢匏をよく䜿甚したす。これは、GLMでデフォルトで䜿甚されるため、マトリックスを転眮する必芁はありたせん。GL_FALSEのたたにしおおくこずができたす。 実際、最埌のパラメヌタヌはデヌタですが、GLMはOpenGLが芋たいデヌタを正確に保存しないため、 value_ptrを䜿甚しお倉換したす 。


倉換マトリックスを䜜成し、頂点シェヌダヌで均䞀ず宣蚀し、シェヌダヌでマトリックスを送信しお、頂点座暙を修正したした。 結果は次のようになりたす。


結果


いいね コンテナは本圓に巊に曲がり、2倍小さくなったため、倉換は成功したした。 コンテナをリアルタむムで回転させ、右䞋隅に移動させたしょう。 これを行うには、メむンルヌプの各反埩で蚈算を実行する必芁がありたす。 GLFW関数を䜿甚しお、時間ずずもに角床を倉曎する時間を取埗したす。


 glm::mat4 trans; trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f)); trans = glm::rotate(trans,(GLfloat)glfwGetTime() * 50.0f, glm::vec3(0.0f, 0.0f, 1.0f)); 

どこでも倉換行列を宣蚀する前に、各フレヌムの回転を曎新できるように各反埩で䜜成するこずに泚意しおください。 ぀たり、ゲヌムルヌプの各反埩で倉換行列を再䜜成する必芁がありたす。 通垞、シヌンに耇数のオブゞェクトがある堎合、レンダリングの各反埩で新しい倀を䜿甚しおそれらの倉換行列が再䜜成されたす。


次に、オブゞェクトを䞭心0、0、0の呚りに回転させ、その埌、回転させたバヌゞョンを画面の右䞋隅に移動したす。 倉換を適甚する実際のシヌケンスは逆の順序で読み取られるこずを忘れないでください。コヌドでも、最初にシフトしおから回転するず、倉換は逆の順序、最初、タヌン、シフトの順に適甚されたす。 これらのすべおの倉換ず、それらがオブゞェクトにどのように圱響するかを理解するこずはかなり困難です。 倉換を詊しおみるず、すぐに慣れたす。


すべおを正しく行った堎合、次のようになりたす。



以䞊です。 時間の経過ずずもに回転するシフトされたコンテナヌ。これはすべお、単䞀の倉換マトリックスで行われたす。 これで、グラフィックスの䞖界でマトリックスが非垞に匷い理由を確認できたす。 倉換を無制限に定矩し、それらを1぀のマトリックスに結合しお、埌で再利甚できたす。 頂点シェヌダヌでこのような倉換を䜿甚するず、デヌタをバッファヌに送信する必芁がないため、頂点デヌタを倉曎しないでプロセッサ時間を節玄できたす。


正しい結果が埗られなかった堎合、たたはどこかに行き詰たっおいる堎合は、 頂点シェヌダヌずフラグメントシェヌダヌず共に゜ヌスコヌドを確認しおください。


次のレッスンでは、マトリックスを䜿甚しお頂点のさたざたな座暙空間を定矩する方法に぀いお説明したす。 これは、リアルタむムの3Dグラフィックスの䞖界における新しいステップです


挔習


Source: https://habr.com/ru/post/J319144/


All Articles