メインコンテンツへスキップ

マット4

Mat4 インターフェースは 4x4 の行列を表し,列長順の 16 要素配列として格納される. このタイプの行列は、3D幾何学で位置、回転、スケールなどの変換を表現するためによく使われる(TRS行列とも呼ばれる)。 これらの行列は、3Dシーン内のオブジェクトの位置、向き、大きさを定義するために不可欠である。

TRS行列のようなある種の行列は、効率的に計算可能な逆行列を持つ。 このような場合、Mat4は逆行列を定数時間で計算することができ、O(1)の非常に高速な演算となる。 Mat4 オブジェクトは、ecs.math.mat4 ファクトリ(Mat4Factory)を使用するか、既存の Mat4 インスタンスに対する操作によって作成されます。

工場

i

恒等行列

ecs.math.mat4.i() // -> mat4

直接指定されたデータを用いて,列-長順の行列を作成します. オプションで逆数を指定することもできる。 逆行列を指定しない場合,行列が可逆行列であれば自動的に逆行列が計算される. 非可逆行列の逆行列を計算しようとするとエラーが発生する。

ecs.math.mat4.of(data: number[], inverseData?: number[]) // -> mat4

r

四元数から回転行列を作成します。

ecs.math.mat4.r(q: QuatSource) // -> mat4

rows

指定された行データを用いて行列を作成します。 また、オプションで逆行列データを提供することもできる。 dataRowsとinverseDataRowsは、それぞれ4つの数値を含む配列でなければならない。 逆行列が与えられない場合、行列が可逆であれば自動的に計算される。

危険

非可逆行列の逆行列を計算しようとするとエラーが発生する。

ecs.math.mat4.rows(dataRows: number[][], inverseDataRows?: number[][]) // -> mat4

s

スケール行列を作成します。 x軸、y軸、z軸のスケールファクターを指定する。

ecs.math.mat4.s(x:, y:, z:) // -> mat4

t

変換行列を作成します。 x軸、y軸、z軸の移動オフセットを指定する。

ecs.math.mat4.t(x:, y:, z:) // -> mat4

並進ベクトルと回転用のクォータニオンを使用して、並進と回転を組み合わせた行列を作成します。

ecs.math.mat4.tr(t: Vec3Source, r: QuatSource) // -> mat4

トラス

平行移動、回転、スケールを組み合わせた行列を作成します。 並進ベクトル、回転にはクォータニオン、x、y、z軸にはスケールファクターを使用する。

ecs.math.mat4.trs(t: Vec3Source, r: QuatSource, s: Vec3Source) // -> mat4

不変

以下のメソッドは,Mat4 の内容を変更することなく,その現在の値を用いて計算を行います. Mat4 型を返すメソッドは,新しいインスタンスを生成する. イミュータブルAPIは一般的に、ミュータブルAPIに比べて安全で、可読性が高く、エラーを減らすことができるが、毎フレーム何千ものオブジェクトが生成されるようなシナリオでは効率が悪くなる可能性がある。

メモ

ガベージ・コレクションがパフォーマンスの問題になるようなら、Mutable APIを使うことを検討しよう。

クローン

この行列と同じ成分を持つ新しい行列を作成する。

ecs.math.mat4.clone() // -> mat4

データ

行列の生データを列の長さ順に取得する。

ecs.math.mat4.data() // -> number[].

分解Trs

行列が平行移動、回転、スケールの順で形成されていると仮定して、行列を平行移動、回転、スケールの各成分に分解する。 target'が与えられた場合、結果は'target'に格納され、'target'が返される。 そうでない場合は、新しい {t, r, s} オブジェクトが作成されて返される。

ecs.math.mat4.decomposeTrs(target?: {t: Vec3, r: Quat, s: Vec3}) // -> {t: Vec3, r: Quat, s: Vec3}

行列式

行列の行列式を計算する。

ecs.math.mat4.determinant() // -> 数

イコール

2つの行列が等しいかどうかを、指定された浮動小数点数の許容誤差でチェックする。

ecs.math.mat4.equals(m: Mat4, tolerance: number) // -> boolean

イン

行列を反転させる。行列が反転不可能な場合は throw する。 Mat4は事前に計算された逆数を保存しているので、この操作は非常に高速である。

ecs.math.mat4.inv() // -> mat4

逆データ

逆行列の生データを列-長順で取得。行列が逆行列でない場合は null。

ecs.math.mat4.inverseData() // -> number[] | null

ルックアット

この行列と同じ位置とスケールを持つ行列を取得しますが、ターゲットを見るように回転を設定します。

ecs.math.mat4.lookAt(target: Vec3Source, up: Vec3Source) // -> mat4

scale

行列にスカラーを乗じる。

危険

0でスケーリングするとエラーになる。

ecs.math.mat4.scale(s: number) // -> mat4

転置行列

行列の転置行列を取得します。

ecs.math.mat4.transpose() // -> mat4

行列に別の行列を掛ける。

ecs.math.mat4.times(m: Mat4) // -> mat4

タイムズベック

同次座標を使って行列にベクトルを掛ける。

ecs.math.mat4.timesVec(v: Vec3Source, target?: Vec3) // -> vec3

ミュータブル

以下のメソッドは、Mat4 の現在値に基づいて結果を計算し、その内容を直接変更します。 これらは、先に説明したImmutable APIのメソッドを反映している。 Mat4 型を返すメソッドは、同じオブジェクトへの参照を提供し、メソッドの連鎖を可能にする。 ミュータブルAPIはイミュータブルAPIよりもパフォーマンスが向上する一方で、安全性や可読性に劣り、エラーが発生しやすい傾向がある。

メモ

コードが1フレーム内で頻繁に実行される可能性が低い場合は、コードの安全性と明瞭性を高めるためにImmutable APIを使用することを検討してください。

セットインヴ

行列を反転させる。行列が反転不可能な場合は throw する。 Mat4は事前に計算された逆数を保存しているので、この操作は非常に高速である。 この Mat4 に結果を格納し、この Mat4 をチェイン用に返す。

existingMat4.setInv() // -> mat4

setLookAt

平行移動とスケールは変えずに、ターゲットに向くようにマトリックスの回転を設定する。 この Mat4 に結果を格納し、連鎖のためにこの Mat4 を返す。

existingMat4.setLookAt(target: Vec3Source, up: Vec3Source) // -> mat4

セットプレマルチプライ

この行列を m 倍した結果をこの行列に設定する。 この Mat4 に結果を格納し、この Mat4 をチェイン用に返す。

existingMat4.setPremultiply(m: Mat4) // -> mat4

セットスケール

行列の各要素にスケーラーを掛ける。 0でスケーリングするとエラーになる。 この Mat4 に結果を格納し、この Mat4 をチェイン用に返す。

existingMat4.setScale(s: number) // -> mat4

セットタイムズ

行列をその転置行列に設定する。 この Mat4 に結果を格納し、この Mat4 をチェイン用に返す。

existingMat4.setTranspose() // -> mat4

セット

以下のメソッドは、現在の Mat4 オブジェクトの値を、その現在の内容に関係なく設定します。

メイクアイ

行列を恒等行列に設定する。 この Mat4 に結果を格納し、この Mat4 をチェイン用に返す。

既存Mat4.makeI() // -> mat4

メイクアール

この行列を、指定されたクォータニオンの回転行列に設定する。 この Mat4 に結果を格納し、この Mat4 をチェイン用に返す。

existingMat4.makeR(r: QuatSource) // -> mat4

メイク行

指定された行データと,オプションで指定された逆行データを持つ行列を作成します. dataRowsとinverseDataRowsは、それぞれ4つの数値を持つ4つの配列でなければならない。 逆行列が指定されない場合、行列が可逆であれば逆行列が計算される。

危険

行列が逆行可能でない場合、inv() を呼び出すとエラーが発生する。

existingMat4.makeRows(rowData: number[][], inverseRowData?: number[][]) // -> mat4

メイクス

この行列を、指定されたベクトルからのスケール行列に設定する。 ベクトルのどの要素もゼロであってはならない。 この Mat4 に結果を格納し、この Mat4 をチェイン用に返す。

existingMat4.makeS(s: Vec3Source) // -> mat4

メイクティー

この行列を指定されたベクトルからの平行移動行列に設定する。 この Mat4 に結果を格納し、この Mat4 をチェイン用に返す。

existingMat4.makeT(s: Vec3Source) // -> mat4

メイク・トラック

この行列を、指定されたベクトルとクォータニオンの平行移動行列と回転行列に設定する。 この Mat4 に結果を格納し、この Mat4 をチェイン用に返す。

existingMat4.makeTr(t: Vec3Source, r: QuatSource) // -> mat4

メイクトルス

指定されたベクトルとクォータニオンから、この行列を平行移動、回転、スケール行列に設定する。 この Mat4 に結果を格納し、この Mat4 をチェイン用に返す。

existingMat4.makeTrs(t: Vec3Source, r: QuatSource, s: Vec3Source) // -> mat4

セット

行列と逆行列の値を指定された値に設定する。 逆数が与えられていない場合は、可能であれば逆数が計算される。 行列が逆行可能でない場合、inv() を呼び出すとエラーが発生する。 この Mat4 に結果を格納し、この Mat4 をチェイン用に返す。

existingMat4.set(data: number[], inverseData?: number[]) // -> mat4