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)
サイコロオブジェクトは5が正面になっている

現在の位置から相対的に移動させる

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