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 CFramelocal newCFrame = CFrame.new(-2, 2, 4)-- Sovrascrivi il CFrame attuale di redBlock con un nuovo CFrameredBlock.CFrame = newCFrame
In alternativa, puoi fornire una nuova posizione Vector3 a CFrame.new() e ottenere lo stesso Risultato:
local redBlock = workspace.RedBlock-- Crea nuovo CFramelocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- Sovrascrivi il CFrame attuale di redBlock con un nuovo CFrameredBlock.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 rotatalocal newCFrame = CFrame.Angles(0, math.rad(45), 0)-- Sovrascrivi il CFrame attuale di redBlock con un nuovo CFrameredBlock.CFrame = newCFrame
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.RedBlocklocal blueCube = workspace.BlueCube-- Crea un Vector3 per la posizione di partenza e la posizione di destinazionelocal 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)
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.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
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.RedBlocklocal blueCube = workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
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.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 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.RedBlocklocal rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
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 <
- Punta la superficie fronte , contrassegnata dal cerchio bianco, sulla destinazione.
- Ruota il CFrame per creare la superficie top , contrassegnata dal cerchio nero, puntata verso il target.
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCube-- Crea un Vector3 per la posizione targetlocal 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 targetlocal 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)
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.RedBlocklocal greenCube = workspace.GreenCubelocal cyanCube = workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)