CFrameとは
パーツなどのオブジェクトの位置や回転を保持するデータ型のこと。CFrameはCoordinate Frameの略、直訳すると座標枠となる。位置や回転の座標を管理する枠組み、程度に捉えればよい。CFrameは位置情報を保持するためにX, Y, Zの位置情報を、回転情報を保持するために各回転軸(X軸,Y軸,Z軸)に対する回転量を持つ。
また、CFrameはオブジェクトを3次元空間で操作するための便利な関数群を保持しており、活用することで楽にオブジェクトを移動、回転させることができる。
CFrameの活用例
- プレイヤーが銃を発射したときのカーソルを対象物に表示する
- プレイヤーがNPCと会話するときにカメラの焦点をNPCに合わせる
- プレイヤーの頭上に状態異常を示すインジケータを表示する
CFrameの利用例の紹介
CFrameを利用すれば様々な移動、回転の表現ができるが数が多いため、主要なものをピックアップして紹介する
WorkSpaceに任意のパーツを作成し、ServerScriptServiceにスクリプトを作成する
今回はDiceという名前のサイコロを利用する
位置を移動する
local dice = workspace.Dice -- {0, 5, 5}の位置情報を持つCFrameを作成 dice.CFrame = CFrame.new(0, 5, 0) -- Vector3を直接代入しても可 local position = Vector3.new(0, 5, 0) dice.CFrame = CFrame.new(position)
回転させる
オブジェクトを回転させるにはCFrame.Anglesを利用する
local dice = workspace.Dice -- Y軸に対して45度回転させる dice.CFrame = CFrame.Angles(0, math.rad(45), 0)
オブジェクトがめり込んでいるのは、位置情報を指定しておらず初期値(0, 0, 0)になっているため
特定の方向を向く
Poleパーツを作成し、ターゲットにする
local dice = workspace.Dice local pole = workspace.Pole -- 位置と視点のターゲットを指定する dice.CFrame = CFrame.new(dice.Position, pole.Position)
現在の位置から相対的に移動させる
local dice = workspace.Dice -- 現在の位置から上に2増やす dice.CFrame = CFrame.new(dice.Position) + Vector3.new(0, 2, 0)
実行前
実行後
現在の姿勢から相対的に回転させる
local dice = workspace.Dice -- 回転量を定義する local rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20)) dice.CFrame = dice.CFrame:ToWorldSpace(rotatedCFrame)
実行前
実行後
特定のオブジェクトから相対的に移動させる
Diceオブジェクトを複製して名前をDice2に変更する
local dice = workspace.Dice local dice2 = workspace.Dice2 -- 移動量を指定する local offsetCFrame = CFrame.new(0, -5, 0) dice.CFrame = dice2.CFrame:ToWorldSpace(offsetCFrame)
位置と回転量を指定する
local dice = workspace.Dice -- 位置と回転量を定義する local positionCrame = CFrame.new(0, 5, 0) local rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20)) dice.CFrame = positionCrame * rotatedCFrame
関連
https://developer.roblox.com/en-us/articles/Understanding-CFrame