CFrameは、座標フレームの略称で、3Dオブジェクトを回転させたり配置したりするために使用されるデータ型です。オブジェクトのプロパティとしても、独立したユニットとしても、CFrameは、各軸の回転データに加えて、グローバルなX、Y、およびZ座標を含みます。さらに、CFramesには、3D空間でオブジェクトを操作するための便利な関数が含まれています。
CFrameを配置する
CFrame.new()を使用することで、デフォルトの位置(0, 0, 0)に空のCFrameを作成できます。特定のポイントにCFrameを配置するには、引数としてX、Y、およびZ座標をCFrame.new()に提供します。以下の例では、redBlockパーツのCFrameプロパティがnewCFrameに変更され、(-2, 2, 4)に再配置されます。
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- 新しいCFrameを作成local newCFrame = CFrame.new(-2, 2, 4)-- 赤いブロックの現在のCFrameを新しいCFrameで上書きredBlock.CFrame = newCFrame


また、CFrame.new()に新しいVector3位置を提供することで、同じ結果を得ることができます:
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- 新しいCFrameを作成local newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- 赤いブロックの現在のCFrameを新しいCFrameで上書きredBlock.CFrame = newCFrame
CFrameを回転させる
回転したCFrameを作成するには、CFrame.fromEulerAnglesXYZ()コンストラクタを使用し、希望する軸のためにラジアンで回転角度を提供します。CFrame.fromEulerAnglesXYZ()に渡すパラメータはラジアンであり、度数法ではありません。度数法を使用したい場合は、math.rad()を使用して度をラジアンに変換します。以下の例では、redBlockパーツがY軸で反時計回りに45度回転します。
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- 新しい回転CFrameを作成local newCFrame = CFrame.fromEulerAnglesXYZ(0, math.rad(45), 0)-- 赤いブロックの現在のCFrameを新しいCFrameで上書きredBlock.CFrame = newCFrame


CFrameを特定のポイントに向ける
CFrame.lookAt()を使用すると、CFrameの前面が世界の特定のポイントを指すようにします。以下の例では、redBlockを(0, 3, 0)に配置し、その前面(白い円でマークされています)がblueCubeパーツを指すようにします。
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.Position = Vector3.new(0, 3, 0)-- 赤いブロックの前面を青いキューブに向けるredBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)


CFrameをオフセットする
オブジェクトをその現在の位置から特定のスタッド数だけオフセットするには、新しいCFrameをそのオブジェクトの位置に追加または減算します。CFrame.new()と共に使用するためにオブジェクトの正しくフォーマットされたVector3位置を取得するには、ここで見たようにそのPositionプロパティ(redBlock.Position)が便利なショートカットです。
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)


他のオブジェクトの位置からオフセットするために同じ技法を使用することができます。以下の例では、Vector3がブロックの位置ではなく、青いキューブの位置で作成された新しいCFrameに追加されています。
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)


動的CFrameの向き
CFrame.new()とCFrame.fromEulerAnglesXYZ()コンストラクタは、特定の向きでオブジェクトを再配置または回転させますが、固定された世界の位置や回転角度に依存できない場合があります。例えば:
- プレイヤーがどこにでも立っていて、どの方向を向いているかにかかわらず、浮遊している宝物をプレイヤーの真前に置く。
- マジカルなジーニーをプレイヤーの右肩の真上に現れさせる。
これらの場合、コンストラクタの代わりにCFrameのメソッドを使用します。
相対位置
CFrame:ToWorldSpace()関数は、オブジェクトのCFrameを変換します — 自身のローカル向きを尊重しながら — 新しい世界の向きにします。これにより、現在の位置や回転に関係なく、パーツを自分自身や他のオブジェクトに対して相対的にオフセットするのに理想的です。
以下の例では、redBlockパーツが青いキューブのY軸に対して2スタッドオフセットされます(緑の矢印が指し示す方向)であり、グローバルなY軸の指し示す上方向に対してではありません。
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)


相対回転
CFrame:ToWorldSpace()を使用して、オブジェクトを自分自身に対して回転させることもできます。以下の例では、redBlockパーツがY軸で反時計回りに70度、Z軸で時計回りに20度回転します。
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal rotatedCFrame = CFrame.fromEulerAnglesXYZ(0, math.rad(70), math.rad(20))redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)


特定の面をポイントに向ける
CFrame.new()の第二パラメータとしてVector3ポイントを供給することで、オブジェクトの前面を他のオブジェクトに向けることができます。また、相対回転を使用して、オブジェクトの任意の面をVector3ポイントに向けさせることもできます。以下の例では、2回の連続したCFrame操作を行います:
- 前面がターゲットを向くようにします(白い円でマークされています)。
- CFrameを回転させて、上面(前面ではなく)がターゲットを指すようにします(黒い円でマークされています)。
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- 赤いブロックの前面を青いキューブに向けるredBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)-- CFrameを自分自身に相対的に回転させて、上面(前面ではなく)が青いキューブを指すようにするlocal rotatedCFrame = CFrame.fromEulerAnglesXYZ(math.rad(-90), 0, 0)redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)


ポイント間の中間点を見つける
線形補間、またはlerpを使用して、2つのポイントの間にCFrameを配置できます。以下の例では、redBlockパーツがgreenCubeとcyanCubeの間で再配置されます。値0.7は、緑のキューブから70%の距離に位置させます。
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal greenCube = Workspace.GreenCubelocal cyanCube = Workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)

