7-5. CFrame制御の活用パターン例

CFrame制御の活用パターン例

CFrameによる制御は、3D空間上での座標や向きをもつ対象に対して様々に使われます。特にエクスペリエンス内のオブジェクトやカメラについて使うことが多いためその具体的な適用方法を見ていきます。また、CFrame間で補間についてもみていきます。

Model座標変換

本章前半でも見た通り、Modelの操作は重要かつ注意が必要です。以下のようなパターンで操作することが多いので把握しておきましょう。

Modelの座標変換の基本

Modelへは前にも見た通り、メソッドを使ってCFrameを適用することが基本となります。

ポジションのみ変更

向きは維持してポジションだけ変えたい場合があります。その場合、などもありますが、こちらはコリジョンの影響を受けるため、による移動を使ったほうが便利なケースが多いです。そのためには現在のRotation成分と、指定Positionを合成する、以下の処理になります。

回転のみ変更

向きだけ変えたい場合も同様の考え方です。現在のPosition成分と、指定の回転のCFrameで合成します。

オブジェクト座標系での移動

CFrameの大きな利点が、正面や横方向などの方向ベクトルが簡単に取得可能な点です。そのため、オブジェクトの正面に向かって移動したい、何かを設置したい、など、オブジェクト基準での座標取得や操作がしやすくなっています。
以下の処理でオブジェクト正面への移動を適用できます。
これは以下のように書くことも可能です。CFrameの乗算は元のCFrameのローカル軸上での変換になるため、マイナスZ軸方向はオブジェクトの正面となります(オブジェクト正面はZ軸マイナス方向と決まっています)。
同様に、オブジェクト基準で横にずらすときには、以下のような記述で可能です。
このように、座標移動などを行う際に、オブジェクト基準での移動などが簡単に行なえます。こういった処理は、投射物(Projectile)や、車や電車などの前に進む乗り物、などで有効な座標移動方法となります。基本的にはオブジェクトの向きのみを制御して、前に進むプログラムをすればよいわけです。

Cameraオブジェクトへの適用

Cameraは、PositionやOrientationといった成分ごとのプロパティはなく、CFrameでの座標指定が必要となります。また、CameraはPVInstance派生ではないので、Pivotに関する操作をもちません。そのため、などのプロパティに直接代入して適用します。Cameraでは、Camera自体のCFrameと、FocusのCFrameも重要となります。

連続的な座標変換

Lerpを使った補間

メソッドを使うことで、特定CFrame間との特定の補間値を取得できます。 <!-- また、CFrameの回転は内部的にはクォータニオン計算なため、回転の補間ではSlerp(球面線形補間)の結果を得ることが可能です。 -->

Tweenを使った補間移動

後章で紹介しているTweenServiceを使えばCFrame間の補間計算を自動で適用することも可能です。

Utility化のすすめ

こういった座標変換は非常によく使うため、少しのコード量ではありますが、毎回書くよりもModuleScriptでUtility化しておくと確実に目的の処理が行えて便利です。例えば以下のようにというUtilityを作成して利用します。