CFrames

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

Un CFrame , breve per Frame di coordinate , è un tipo di dati utilizzato per ruotare e posizionare oggetti 3D.Come proprietà di un oggetto o come unità standalone, un CFrame contiene i coordinati globali x-, y-, e z- e i dati di rotazione per ciascun asse.Inoltre, CFrames contenere funzioni utili per lavorare con oggetti nello Spazio3D.

Alcuni esempi di CFrame applicazioni in un gioco potrebbero essere:

  • Trovare un punto di destinazione lontano per un proiettile, come la posizione di un nemico mirato dal laser blaster di un Giocatore.
  • Spostare la fotocamera in modo che si concentri su NPC specifici mentre un giocatore interagisce con essi.
  • Posizionare un indicatore di stato direttamente sopra la testa di un Giocatoreper mostrare se è paralizzato, potenziato, avvelenato, ecc.

Base di CFrame

Posiziona un CFrame

Puoi creare un vuoto CFrame alla posizione predefinita di (0, 0, 0) utilizzando CFrame.new().Per posizionare un CFrame a un punto specifico, fornisci x-, y-, e z-coordinate come argomenti a CFrame.new() .Nell'esempio seguente, le proprietà della parte redBlock della parte CFrame cambiano a newCFrame, riposizionandola a (-2, 2, 4).


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
-- Crea una nuova CFrame
local newCFrame = CFrame.new(-2, 2, 4)
-- Sovrascrivi il CFrame attuale di redBlock con un nuovo CFrame
redBlock.CFrame = newCFrame

Prima di
>

Dopo
>

In alternativa, puoi fornire una nuova posizione Vector3 a CFrame.new() e ottenere lo stesso Risultato:


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
-- Crea una nuova CFrame
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- Sovrascrivi il CFrame attuale di redBlock con un nuovo CFrame
redBlock.CFrame = newCFrame

Ruota un CFrame

Per creare un rotto CFrame , usa il costruttore CFrame.Angles() , fornendo un angolo di rotazione in radiani per gli assi desiderati.I parametri a CFrame.Angles() sono in radianti, non in gradi.Se preferisci gradi, usa math.rad() per convertire i gradi in radiani.Nell'esempio seguente, la parte redBlock ruota di 45 gradi antiorario sull'asse y.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
-- Crea una nuova rotazione di CFrame
local newCFrame = CFrame.Angles(0, math.rad(45), 0)
-- Sovrascrivi il CFrame attuale di redBlock con un nuovo CFrame
redBlock.CFrame = newCFrame

Prima di
>

Dopo
>

Affronta un CFrame verso un punto

Puoi usare CFrame.new() per puntare la superficie frontale di un CFrame a un punto specifico nel Mondo.Nell'esempio seguente, redBlock le posizioni delle parti a (0, 3, 0) e indica la sua superficie frontale, contrassegnata dal cerchio bianco, alla parte blueCube.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
-- Crea un Vector3 per la posizione di partenza e la posizione target
local startPosition = Vector3.new(0, 3, 0)
local targetPosition = blueCube.Position
-- Posiziona il redBlock a 'startPosition' e punta la sua superficie frontale a 'targetPosition'
redBlock.CFrame = CFrame.new(startPosition, targetPosition)

Prima di
>

Dopo
>

Sposta un CFrame

Per compensare un oggetto con un numero specifico di borchie dalla sua posizione attuale, aggiungi o sottrai un Vector3 a o da una nuova CFrame alla posizione dell'oggetto.Per ottenere una posizione correttamente formattata Vector3 di un oggetto da utilizzare con CFrame.new() , come visto qui, la sua proprietà Position ( redBlock.Position ) è un conveniente Scorciatoia.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
redBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)

Prima di
>

Dopo
>

Puoi usare la stessa tecnica per compensare un oggetto dalla posizione di un altro oggetto.Nell'esempio seguente, un Vector3 aggiunge a una nuova CFrame creata alla posizione del cubo blu invece della 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 di
>

Dopo
>

Orientamento CFrame dinamico

I costruttori CFrame.new() e CFrame.Angles() riposizionano o ruotano un oggetto in un orientamento specifico all'interno del Mondo, ma a volte non puoi fare affidamento su una posizione e un angolo di rotazione fissi nel mondo.Ad esempio:

  • Posizionare un tesoro galleggiante direttamente di fronte a un giocatore che potrebbe stare ovunque nel Mondo, facendo fronte a qualsiasi direzione.
  • Fare apparire un genio magico direttamente sopra la spalla destra di un Giocatore.

In questi casi, usa i metodi CFrame invece dei loro costruttori.

Posizione relativa

La funzione CFrame:ToWorldSpace() transforms un oggetto di CFrame — rispettando la propria orientazione locale — in una nuova orientazione mondo .Questo lo rende ideale per compensare una parte rispetto a se stessa o ad un altro oggetto, indipendentemente da come è attualmente posizionata/rotata.

Nell'esempio seguente, la parte redBlock offsetta 2 borchie relative all'asse y del cubo blu (la freccia verde che punta attraverso di essa) e non relative all'asse globale y che punta dritto su.


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 di
>

Dopo
>

Rotazione relativa

Puoi anche usare CFrame:ToWorldSpace() per ruotare un oggetto rispetto a se stesso.Nell'esempio seguente, la parte redBlock ruota di 70 gradi antiorario sull'asse y e di 20 gradi orario sull'asse z.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)

Prima di
>

Dopo
>

Affronta una superficie specifica verso un punto

Puoi far fronte alla faccia anteriore di un oggetto con un altro oggetto fornendo un punto Vector3 come secondo parametro di CFrame.new().Puoi anche usare la rotazione relativa per far puntare qualsiasi faccia dell'oggetto verso un punto Vector3 .L'esempio seguente esegue due operazioni consecutive CFrame :

  1. Puntare la superficie frontale , contrassegnata dal cerchio bianco, al bersaglio.
  2. Ruota il CFrame per rendere la superficie superiore , contrassegnata dal cerchio nero, puntata verso l'obiettivo.

local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
-- Crea un Vector3 per la posizione target
local targetPosition = blueCube.Position
-- Puntare la superficie anteriore del blocco rosso a 'targetPosition'
redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)
-- Ora la superficie anteriore del redBlock (cerchio bianco) punta verso il blueCube
-- Ruota il CFrame di redBlock rispetto a se stesso in modo che la sua superficie superiore (non frontale) punta verso il bersaglio
local rotatedCFrame = CFrame.Angles(math.rad(-90), 0, 0)
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
-- Now the redBlock's top surface (black circle) is pointing towards the blueCube (as seen in After below)

Prima di
>

Dopo
>

Trova un punto tra i punti

Puoi usare interpolazione lineare o lerp per posizionare un tra due punti.Nell'esempio seguente, la parte redBlock ricolloca tra le parti greenCube e cyanCube.Il valore di 0.7 lo 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 di
>

Dopo
>