7-4. CFrameによる3DTransform

CFrameによる座標変換

CFrameとは

CFrameは、Robloxにおいてオブジェクトの位置と向きを表すために使用されるデータ構造です。「Coordinate Frame」の略となっており「位置と方向を定義した座標データ」となります。CFrameは、Vector3型による位置情報と、3×3行列による回転情報のセットで構成されスケール情報は含みません。すなわちゲーム数学でよく使う4x4行列とは明確に異なります。
移動と回転を明確に分け、回転行列にスケールの影響がないという特性から、特に方向に関する情報の取得や操作がしやすいデータ構造となっています。直感的に操作可能なメソッドや演算子も用意されており、一般的なゲーム数学における行列演算よりも、シンプルな計算でオブジェクトの座標変換が可能となっています。

CFrameの生成(コンストラクタ)

移動量をもつCFrame生成

以下で移動量のみ(回転なし)のCFrame生成します。ゲーム中ではVector3型のデータを扱うことも多く、Vector3型から生成も可能です。

回転量をもつCFrame生成

以下で指定の回転成分をもつCFrameを生成します。回転指定のコンストラクタは、回転順の違いで複数用意されています。CFrameではラジアンでの角度指定に統一されています。

移動と回転をもつCFrame生成

移動と回転を合わせたCFrame生成は後述の演算子も使って、移動CFrameと回転CFrameを合成して作成します。以下が基本的なグローバルでの座標と回転を指定したCFrame生成です。
また、指定位置と、特定位置の方向を向いた回転、のCFrameは以下のコンストラクタで作成が可能となっています。方向ベクトルではなく、LookAt位置指定なことに注意しましょう。

CFrameによる座標変換

座標移動(グローバル)

グローバルな座標移動(平行移動)は「+」または「-」演算子で行います。この演算では、CFrameの回転成分の影響がない、移動量自体の直接加算減算計算が行われます。すなわちグローバル(ワールド)座標系での座標計算が行われます。
また以下のように、複合代入演算子による省略した演算記述も可能です。

座標移動(ローカル)

ローカル座標系での座標移動はCFrameの合成となる「*」演算子で行います。左のCFrameの回転軸上での移動を行います。
合成も同様に複合代入演算子での演算記述が可能です。

回転

回転はCFrameの合成となる「*」演算子で行います。
CFrameの合成は、適用される状態でのローカル座標系での計算となります。

ObjectSpaceへの変換

座標をObjectSpace(ローカル座標系)へ変換するには、行列の逆行列と同様ににて行います。また専用メソッドも用意されています。

CFrameから情報取得

移動(座標)の取得

Positionプロパティで取得します。また、各成分を直接取得することも可能です。

回転の取得

プロパティのRotatioはCFrame(3×3の行列成分のみを持つ)であることに注意が必要です。Rotationの値で取得する場合は などのメソッドを利用します。値はラジアンです。
 

参照すべき情報