blog

OpenGLベクトルと行列

OpenGLでは、ベクトルは常に方向を持つ量を表現するために使われます。例えば、原点から3D座標系の任意の点までの矢印の線分は、方向と数の2つの重要な値を持っています。 しかし、ベクトルが単位ベクトル...

Jul 14, 2020 · 4 min. read
シェア

ベクトル

ベクトルとは?

OpenGLでは、ベクトルは常に、原点から3D座標系の任意の点までの矢印の線分のような、方向を持つ量を表現するために使われ、方向と数の2つの重要な値を持ちます。

スカラーは量や大きさを表すだけ

単位ベクトル

長さ1のベクトルは単位ベクトル

では、ベクトルの長さはどのように計算すればいいのでしょうか?

ただし、ベクトルが単位ベクトルでない場合は、正規化処理によって長さを 1 にすることができます。

ゼロでないベクトルをそのモジュラスで割ると、同じ方向の単位ベクトルが得られます。

ベクトルの定義

OpenGLのmath3dライブラリでは

  • M3DVector3fは3次元ベクトルを表します。
  • M3DVector4fは4次元ベクトルを表し、xyzはwの値で割ることでスケーリングされます。

//次元ベクトル/4次元ベクトルの宣言
typedef float M3DVector3f[3];
typedef float M3DVector4f[4];
//次元ベクトルM3DVector3fを宣言する。:型 vVector:変数名 M3DVector3fvVector;
//次元ベクトルを宣言し、4次元ベクトルを初期化する。
M3DVector4f vVertex = {0,0,1,1};
//例えば三角形の形状を作るために、3成分の頂点の配列を宣言する。
//M3DVector3f vVerts[]={
 -0.5f,0.0f,0.0f,
 0.5f,0.0f,0.0f,
 0.0f,0.5f,0.0f};

ベクトルにできること?

ドット単位の乗算

2つの3次元ベクトル間の角度を計算する必要がある場合、このような演算はドット積と呼ばれます。結果は[=1,1]の範囲の値を返し、これは2つの単位ベクトル間の角度のcos値です。

の内積を計算する関数が含まれています。

フォーク乗算

2つのベクトルによって定義される平面に垂直なベクトルを得る必要がある場合、そのような演算はクロス積と呼ばれ、結果は元の2つのベクトルによって定義される平面に垂直な新しいベクトルを返します。

math3d ライブラリでクロス積を計算する関数です。

void m3dCrossProduct3(M3DVector3f result,constM3D Vector3f u,const M3DVector3f v);;

注意!

  • この積を操作する2つのベクトルは、単位ベクトルである必要はありません。
  • 計算の順番が違います。

V1にV2を掛け合わせたもの、V2にV1を掛け合わせたもの、どちらもV1とV2で形成される平面に垂直なベクトルになりますが、結果のベクトルは反対方向を向いています。

行列

空間内の点がある場合、それは特定の角度に沿って任意の方向に任意の位置の周りに回転され、この点の新しい位置は、行列によって計算される必要があり、もはや頂点x、y、zの単純な加算と減算操作することができます。xの新しい位置だけでなく、元のx座標と他の回転パラメータだけでなく、y、z座標を持つため。

単位行列

ベクトルにユニタリー行列を掛けることは、そのままベクトルに1を掛けることと同じです。

  • 主対角線上のデータはすべて1。
  • ベクトル * ユニタリー行列 == ベクトル * 1
  • 行列との乗算の場合、列数=行列の行数でなければ、行列のルールは満たされません。

行列の乗算

  • 線形代数の観点から

線形代数の次元では、書きやすくするために、座標は左から右の順に、次のように計算されます。

変換後の頂点ベクトル = V_local * M_model * M_view * M_pro;
変換後の頂点ベクトル =   * モデル行列 * 行列を表示する * 射影行列;

頂点ベクトルは行ベクトルなので、行列との掛け算のルールを満たすためには、行列を右側に配置する必要があり、これは右回りの掛け算となります。

  • OpenGLから見ると

OpenGLでは行列は列優先で指定されるため、頂点は列ベクトルとして表現され、同じ計算でも次のように変わります。

変換後の頂点ベクトル = M_pro * M_view * M_model * V_local;
変換後の頂点ベクトル = 射影行列 * 行列を表示する * モデル行列 *  ;

この場合は左の掛け算です。

  • 行列スタックからの行列乗算のソースコード解析
1.まず、スタックの先頭の行列をmTempに格納する。
2.スタック先頭の行列 mTemp * 入力mMatrix //左の乗算
3.結果はスタックの一番上に格納される

Read next

Python:データクラスを使う。

データクラスのデコレータにデフォルト値を追加する基本的な使い方は、データオブジェクトを格納するために、次のパラメータで動作することができます @dataclass(init=True,repr=True,eq=True,order=False,).

Jul 14, 2020 · 2 min read