Un CFrame, abbreviazione di Frame di Coordinate, è un tipo di dato usato per ruotare e posizionare oggetti 3D. Come proprietà di un oggetto o come unità autonoma, un CFrame contiene coordinate globali X, Y, e Z oltre ai dati di rotazione per ciascun asse. Inoltre, i CFrames contengono funzioni utili per lavorare con oggetti nello spazio 3D.
Posizionare un CFrame
Puoi creare un CFrame vuoto nella posizione predefinita di (0, 0, 0) utilizzando CFrame.new(). Per posizionare un CFrame in un punto specifico, fornisci le coordinate X, Y, e Z come argomenti a CFrame.new(). Nell'esempio seguente, la proprietà CFrame della parte redBlock cambia in newCFrame, riposizionandola a (-2, 2, 4).
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Crea un nuovo CFramelocal newCFrame = CFrame.new(-2, 2, 4)-- Sovrascrivi il CFrame attuale del blocco rosso con il nuovo CFrameredBlock.CFrame = newCFrame


In alternativa, puoi fornire una nuova posizione di Vector3 a CFrame.new() e ottenere lo stesso risultato:
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Crea un nuovo CFramelocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- Sovrascrivi il CFrame attuale del blocco rosso con il nuovo CFrameredBlock.CFrame = newCFrame
Ruotare un CFrame
Per creare un CFrame ruotato, utilizza il costruttore CFrame.fromEulerAnglesXYZ(), fornendo un angolo di rotazione in radianti per gli assi desiderati. I parametri di CFrame.fromEulerAnglesXYZ() sono in radianti, non in gradi; se preferisci i gradi, usa math.rad() per convertire i gradi in radianti. Nell'esempio seguente, la parte redBlock ruota di 45 gradi in senso antiorario sul suo asse Y.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Crea un nuovo CFrame ruotatolocal newCFrame = CFrame.fromEulerAnglesXYZ(0, math.rad(45), 0)-- Sovrascrivi il CFrame attuale del blocco rosso con il nuovo CFrameredBlock.CFrame = newCFrame


Fai puntare un CFrame verso un punto
Puoi usare CFrame.lookAt() per puntare la superficie frontale di un CFrame verso un punto specifico nel mondo. L'esempio seguente posiziona redBlock a (0, 3, 0) e punta la sua superficie frontale, contrassegnata dal cerchio bianco, verso la parte blueCube.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.Position = Vector3.new(0, 3, 0)-- Punta la superficie frontale del blocco rosso verso il cubo bluredBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)


Offset di un CFrame
Per spostare un oggetto di un numero specifico di stud dal suo attuale posizione, aggiungi o sottrai un Vector3 a o da un nuovo CFrame nella posizione dell'oggetto. Per ottenere una posizione Vector3 formattata correttamente di un oggetto da usare con CFrame.new(), come visto qui, la sua proprietà Position (redBlock.Position) è un comodo shortcut.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)


Puoi usare la stessa tecnica per spostare un oggetto dalla posizione di un altro oggetto. Nell'esempio seguente, un Vector3 aggiunge a un nuovo CFrame creato nella posizione del cubo blu invece che nella posizione del blocco.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)


Orientamento dinamico del CFrame
I costruttori CFrame.new() e CFrame.fromEulerAnglesXYZ() riposizionano o ruotano un oggetto a un'orientazione specifica all'interno del mondo, ma a volte non puoi fare affidamento su una posizione e un angolo di rotazione fissi. Ad esempio:
- Posizionare un tesoro flottante direttamente di fronte a un giocatore che può trovarsi ovunque nel mondo, affrontando qualsiasi direzione.
- Far apparire un genio magico direttamente sopra la spalla destra di un giocatore.
In questi casi, usa i metodi di CFrame invece dei loro costruttori.
Posizione relativa
La funzione CFrame:ToWorldSpace() trasforma un CFrame di un oggetto — rispettando la sua propria orientazione locale — in una nuova orientazione mondiale. Questo la rende ideale per spostare una parte in modo relativo a se stessa o a un altro oggetto, indipendentemente da come è attualmente posizionata/ruotata.
Nell'esempio seguente, la parte redBlock si sposta di 2 stud rispetto all'asse Y del cubo blu (la freccia verde che lo attraversa) e non rispetto all'asse Y globale che punta dritto verso l'alto.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)


Rotazione relativa
Puoi anche usare CFrame:ToWorldSpace() per ruotare un oggetto relativamente a se stesso. Nell'esempio seguente, la parte redBlock ruota di 70 gradi in senso antiorario sull'asse Y e di 20 gradi in senso orario sull'asse Z.
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)


Fai puntare una superficie specifica verso un punto
Puoi far puntare la parte frontale di un oggetto verso un altro oggetto fornendo un punto Vector3 come secondo parametro di CFrame.new(). Puoi anche utilizzare la rotazione relativa per fare in modo che qualsiasi superficie dell'oggetto punti verso un punto Vector3. L'esempio seguente esegue due operazioni consecutive di CFrame:
- Punta la superficie frontale, contrassegnata dal cerchio bianco, verso il bersaglio.
- Ruota il CFrame in modo che la superficie superiore, contrassegnata dal cerchio nero, punti verso il bersaglio.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- Punta la superficie frontale del blocco rosso verso il cubo bluredBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)-- Ruota il CFrame relativamente a se stesso in modo che la superficie superiore (non frontale) punti verso il cubo blulocal rotatedCFrame = CFrame.fromEulerAnglesXYZ(math.rad(-90), 0, 0)redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)


Trova un punto tra i punti
Puoi usare l'interpolazione lineare, o lerp, per posizionare un CFrame tra due punti. Nell'esempio seguente, la parte redBlock si riposiziona tra le parti greenCube e cyanCube. Il valore di 0.7 la posiziona al 70% della distanza dal cubo verde.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal greenCube = Workspace.GreenCubelocal cyanCube = Workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)

