永井 忠一 2025.1.19
ライブラリのインストール(私の環境では、Linux apt)
Linux apt |
---|
|
OpenGL 1.1 の頃にあった API の代わりに GLM を利用
頂点シェーダーによって行われる、座標変換\[ \begin{align} \text{gl_Position} &= \text{Projection}*\text{View}*\text{Model}*\text{vec4(position, 1.0f)} \\ & = \text{MVP}*\text{vec4(position, 1.0f)} \end{align} \]
ここで、「vec4(position, 1.0f)」は、(位置ベクトルの)同次座標系への変換
MVP 行列を掛けたあとの gl_Position は、クリップ座標系で表現されている(w で割って正規化する前)
(そのあと、w で割って正規化を行い NDC へ変換するのは、レンダリングパイプライン側。NDC は、正規化デバイス座標系)
scale、回転、そして並進からなる(scale → rotate → translateの順)\[ \text{Model} = \text{translate}*\text{rotate}*\text{scale} \]
何も作用しない Model 行列の例(単位行列。つまり、ローカル座標系とグローバル座標系とが等しい)
C++ GLM (OpenGL Mathematics) |
---|
|
スケーリング行列による、右手系と左手系の変換。Z 軸を反転\[ \text{scale} = \begin{bmatrix} S_x & 0 & 0 & 0 \\ 0 & S_y & 0 & 0 \\ 0 & 0 & -S_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]
(拡大も縮小もしない場合は、\( \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & -1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \) となる)
C++ GLM |
---|
|
(表示の「-0.000000」は、浮動小数点数の演算誤差)
OpenGL は右手系。(View 行列が単行列となる)カメラの初期姿勢では、カメラは -z の方向を向いている(カメラの初期位置はワールド座標系の原点、up ベクトルは上)
C++ GLM |
---|
|
不正な引数を lookAt() 関数に与えると、View 行列の値が nan になる。注視点とカメラ位置が同じになってしまっている例(カメラの方向が決定できない)
C++ GLM |
---|
|
カメラが真下を向いている状態で、up ベクトルにワールド座標系の Y 軸方向を設定してしまった例
C++ GLM |
---|
|
また、カメラの位置姿勢を表現するのに、9パラメタ(vec3 の引数が3個)あるのは冗長なため、結果、同じ View 行列となるものはいくつもある
C++ GLM |
---|
|
(この場合も、View 行列は、単位行列になっている)
正射影で、Projection 行列が単位行列になるように引数を指定
C++ GLM |
---|
|
(※Projection 行列が単位行列になるのは、zNear と zFar とが逆転しているときなので、注意)
最後に、(それぞれの単位行列を掛け合わせた結果として)MVP 行列が単位行列となっている例
C++ GLM |
---|
|
(当然、単位行列同士を掛けているだけなので、結果は単位行列になる)
© 2025 Tadakazu Nagai