CFrame

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

Un CFrame , a breve per Frame di coordinamento 3D , è un tipo di dati usato per ruotare e posizionare gli oggetti 3D. Come proprietà di un oggetto o di un'unità standalone, un CFrame contiene le coordinate globali x-, y- e z

Alcuni esempi di applicazioni CFrame in un gioco potrebbero essere:

  • Trovare un punto di destinazione lontano per un proiettile, come la posizione di un nemico mirato dal laser di un Giocatore.
  • Spostare la telecamera in modo che si concentri sui NPC specifici mentre un giocatore interagisce con loro.
  • Posizionare un indicatore di stato direttamente sopra la testa di un Giocatoreper mostrare se sono paralizzati, potenziati, avvelenati, ecc.

CFrame Basics

Posizionamento di CFrame

Puoi creare un vuoto CFrame alla posizione predefinita di (0, 0, 0) utilizzando Datatype.CFrame


local redBlock = workspace.RedBlock
-- Crea nuovo CFrame
local newCFrame = CFrame.new(-2, 2, 4)
-- Sovrascrivi il CFrame attuale di redBlock con un nuovo CFrame
redBlock.CFrame = newCFrame
Prima
Dopo

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


local redBlock = workspace.RedBlock
-- Crea nuovo 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

Ruotare una CFrame

Per creare un CFrame rotato, usa il costruttore CFrame.Angles() , fornendo un angolo di rotazione in radian per gli assi desiderati. I parametri per Datatype.CFrame.Ang


local redBlock = workspace.RedBlock
-- Crea nuova CFrame rotata
local newCFrame = CFrame.Angles(0, math.rad(45), 0)
-- Sovrascrivi il CFrame attuale di redBlock con un nuovo CFrame
redBlock.CFrame = newCFrame
Prima
Dopo

Orizzonti verso un punto

Puoi usare CFrame.new() per puntare la superficie frontale di un CFrame a un punto specifico nel Mondo. Nel seguente esempio, le posizioni della parte redBlock nella posizione di (0, 3, 0) e puntano alla sua superficie frontale, contrassegnata dal cerchio bianco, nella parte 1> blueCube


local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
-- Crea un Vector3 per la posizione di partenza e la posizione di destinazione
local startPosition = Vector3.new(0, 3, 0)
local targetPosition = blueCube.Position
-- Metti il redBlock al 'startPosition' e punta la sua superficie frontale a 'targetPosition'
redBlock.CFrame = CFrame.new(startPosition, targetPosition)
Prima
Dopo

Offloading di un CFrame

Per compensare un oggetto con un numero specifico di studs dalla sua posizione attuale, aggiungi o sottrai un Vector3 a o da un nuovo CFrame alla posizione dell'og


local redBlock = workspace.RedBlock
redBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
Prima
Dopo

Puoi usare la stessa tecnica per compensare un oggetto dalla posizione di un altro oggetto. Nel seguente esempio, un Vector3 aggiunge a un nuovo CFrame creato alla posizione del cubo blu invece della posizione del blocco.


local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
redBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
Prima
Dopo

Orientalamento CFrame dinamico

I costruttori Datatype.CFrame.new() e Datatype.CFrame.Angles() posizionano o ruotano un oggetto in un'orientazione specifica nel Mondo, ma in alcuni casi non puoi contare su una posizione e rotazione angolari fisse nel mondo, ad esempio:

  • Posizionare un tesoro fluttuante direttamente di fronte a un giocatore che potrebbe essere in piedi in qualsiasi parte del Mondo, facendo fronte a qualsiasi direzione.
  • Fare apparire un genio magico direttamente sopra l'omero destro di un Giocatore.

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

Posizione relativa

La funzione CFrame:ToWorldSpace() trasforma l'oggetto in un nuovo orientamento del mondo CFrame — rispettando la propria orientamento locale — in un nuovo orientamento del mondo. Questo rende ideal per l'Offset di una parte rispetto all'altra o all'altro oggetto, indipendentemente dal fatto che è attualmente posizionato / ruotato.

Nell'esempio seguente, il redBlock part offsets 2 studs rispetto all'asse y del cube blu (il punto verde che punta attraverso) e non rispetto all'asse globale che punta dritto su.


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 rispetto a se stesso. Nel seguente esempio, la parte redBlock ruota di 70 gradi in senso contrario sul suo asse y e 20 gradi in senso orario sul suo asse z.


local redBlock = workspace.RedBlock
local rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
Prima
Dopo

Affrontare una superficie specifica verso un punto

Puoi rendere la parte anteriore di un oggetto faccia un altro oggetto fornendo un punto Vector3 come secondo parametro di CFrame.new() . Puoi anche usare la rotazione relativa per rendere qualsiasi faccia dell'oggetto punto verso un punto Vector3 . L'esempio seguente esegue due operazioni consecutive <

  1. Punta la superficie fronte , contrassegnata dal cerchio bianco, sulla destinazione.
  2. Ruota il CFrame per creare la superficie top , contrassegnata dal cerchio nero, puntata verso il target.

local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
-- Crea un Vector3 per la posizione target
local targetPosition = blueCube.Position
-- Individua la superficie frontale del blocco rosso in 'targetPosition'
redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)
-- Ora la superficie frontale del redBlock (cerchio bianco) sta puntando verso il blueCube
-- Ruota il CFrame di redBlock rispetto a se stesso in modo che la sua superficie superiore (non la parte anteriore) punta verso il target
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
Dopo

Trovare un punto tra i punti

Puoi usare interpolation lineare , o lerp , per posizionare un CFrame tra due punti. Nel seguente esempio, la parte 1> redBlock1> si riposiziona tra le parti 4> greenCube


local redBlock = workspace.RedBlock
local greenCube = workspace.GreenCube
local cyanCube = workspace.CyanCube
redBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)
Prima
Dopo