CFrames

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

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 CFrame
local newCFrame = CFrame.new(-2, 2, 4)
-- Sovrascrivi il CFrame attuale del blocco rosso con il nuovo CFrame
redBlock.CFrame = newCFrame
Prima
Dopo

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 CFrame
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- Sovrascrivi il CFrame attuale del blocco rosso con il nuovo CFrame
redBlock.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 ruotato
local newCFrame = CFrame.fromEulerAnglesXYZ(0, math.rad(45), 0)
-- Sovrascrivi il CFrame attuale del blocco rosso con il nuovo CFrame
redBlock.CFrame = newCFrame
Prima
Dopo

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.RedBlock
local blueCube = Workspace.BlueCube
redBlock.Position = Vector3.new(0, 3, 0)
-- Punta la superficie frontale del blocco rosso verso il cubo blu
redBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)
Prima
Dopo

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.RedBlock
redBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
Prima
Dopo

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.RedBlock
local blueCube = Workspace.BlueCube
redBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
Prima
Dopo

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.RedBlock
local blueCube = Workspace.BlueCube
local offsetCFrame = CFrame.new(0, 2, 0)
redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)
Prima
Dopo

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.RedBlock
local rotatedCFrame = CFrame.fromEulerAnglesXYZ(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
Prima
Dopo

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:

  1. Punta la superficie frontale, contrassegnata dal cerchio bianco, verso il bersaglio.
  2. 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.RedBlock
local blueCube = Workspace.BlueCube
-- Punta la superficie frontale del blocco rosso verso il cubo blu
redBlock.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 blu
local rotatedCFrame = CFrame.fromEulerAnglesXYZ(math.rad(-90), 0, 0)
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
Prima
Dopo

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.RedBlock
local greenCube = Workspace.GreenCube
local cyanCube = Workspace.CyanCube
redBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)
Prima
Dopo
© 2026 Roblox Corporation. Roblox, il logo Roblox e Powering Imagination sono tra i nostri marchi registrati e non registrati negli Stati Uniti. e altri paesi.