A CFrame, skrót od Ramki Współrzędnych, to typ danych używany do obracania i pozycjonowania obiektów 3D. Jako właściwość obiektu lub jednostka samodzielna, CFrame zawiera globalne współrzędne X, Y i Z, a także dane o rotacji dla każdej osi. Ponadto, CFrames zawierają przydatne funkcje do pracy z obiektami w przestrzeni 3D.
Pozycjonowanie CFrame
Możesz stworzyć pusty CFrame w domyślnej pozycji (0, 0, 0) za pomocą CFrame.new(). Aby umieścić CFrame w konkretnej lokalizacji, podaj współrzędne X, Y i Z jako argumenty dla CFrame.new(). W poniższym przykładzie właściwość CFrame części redBlock zmienia się na newCFrame, przekształcając ją do (-2, 2, 4).
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Utwórz nowy CFramelocal newCFrame = CFrame.new(-2, 2, 4)-- Zastąp aktualny CFrame czerwonego bloku nowym CFrameredBlock.CFrame = newCFrame


Alternatywnie, możesz dostarczyć nową pozycję Vector3 do CFrame.new() i osiągnąć ten sam wynik:
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Utwórz nowy CFramelocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- Zastąp aktualny CFrame czerwonego bloku nowym CFrameredBlock.CFrame = newCFrame
Obracanie CFrame
Aby stworzyć obrócony CFrame, użyj konstruktora CFrame.fromEulerAnglesXYZ(), dostarczając kąt obrotu w radianach dla pożądanych osi. Parametry do CFrame.fromEulerAnglesXYZ() są w radianach, a nie w stopniach; jeśli wolisz stopnie, użyj math.rad(), aby przeliczyć stopnie na radiany. W poniższym przykładzie część redBlock obraca się o 45 stopni w kierunku przeciwnym do ruchu wskazówek zegara na osi Y.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Utwórz nowy obrócony CFramelocal newCFrame = CFrame.fromEulerAnglesXYZ(0, math.rad(45), 0)-- Zastąp aktualny CFrame czerwonego bloku nowym CFrameredBlock.CFrame = newCFrame


Ukierunkowanie CFrame w stronę punktu
Możesz użyć CFrame.lookAt(), aby skierować przednią powierzchnię CFrame na konkretny punkt w świecie. W poniższym przykładzie redBlock jest umieszczany na pozycji (0, 3, 0) i wskazuje swoją przednią powierzchnię, oznaczoną białym okręgiem, na część blueCube.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.Position = Vector3.new(0, 3, 0)-- Skieruj przednią powierzchnię czerwonego bloku na niebieski sześcianredBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)


Przesunięcie CFrame
Aby przesunąć obiekt o określoną liczbę studów od jego aktualnej pozycji, dodaj lub odejmij Vector3 od nowego CFrame w pozycji obiektu. Aby uzyskać poprawnie sformatowaną pozycję Vector3 obiektu do użycia z CFrame.new(), jak pokazano tutaj, właściwość Position (redBlock.Position) jest wygodnym skrótem.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)


Możesz użyć tej samej techniki, aby przesunąć obiekt z pozycji innego obiektu. W poniższym przykładzie Vector3 dodaje się do nowego CFrame, utworzonego w pozycji niebieskiego sześcianu, zamiast pozycji bloku.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)


Dynamiczna orientacja CFrame
Konstruktory CFrame.new() i CFrame.fromEulerAnglesXYZ() przekształcają lub obracają obiekt w konkretnej orientacji w świecie, ale czasami nie można polegać na stałej pozycji w świecie i kącie obrotu. Na przykład:
- Umieszczanie unoszącej się skarbonki bezpośrednio przed graczem, który może stać wszędzie w świecie, zwrócony w dowolnym kierunku.
- Sprawianie, aby magiczny dżin pojawił się bezpośrednio nad prawym ramieniem gracza.
W takich przypadkach użyj metod CFrame zamiast ich konstruktorów.
Pozycja względna
Funkcja CFrame:ToWorldSpace() przekształca CFrame obiektu — szanując jego własną lokalną orientację — do nowej orientacji w świecie. To czyni ją idealnym rozwiązaniem do przesuwania części względem siebie lub względem innego obiektu, niezależnie od tego, jak jest aktualnie umiejscowiona/obrócona.
W poniższym przykładzie część redBlock jest przesuwana o 2 study w kierunku osi Y niebieskiego sześcianu (zielona strzałka wskazująca na nią) i nie względem globalnej osi Y wskazującej w górę.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)


Rotacja względna
Możesz również użyć CFrame:ToWorldSpace(), aby obrócić obiekt względem siebie. W poniższym przykładzie część redBlock obraca się o 70 stopni w kierunku przeciwnym do ruchu wskazówek zegara na osi Y i 20 stopni w kierunku zgodnym z ruchem wskazówek zegara na osi 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)


Ukierunkowanie konkretnej powierzchni w stronę punktu
Możesz uczynić przód obiektu skierowanym na inny obiekt, dostarczając punkt Vector3 jako drugi parametr CFrame.new(). Możesz również użyć rotacji względnej, aby uczynić dowolną powierzchnię obiektu zwróconą w stronę punktu Vector3. W poniższym przykładzie wykonywane są dwie kolejne operacje CFrame:
- Skieruj przednią powierzchnię, oznaczoną białym okręgiem, na cel.
- Obróć CFrame tak, aby górna powierzchnia, oznaczona czarnym okręgiem, wskazywała na cel.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- Skieruj przednią powierzchnię czerwonego bloku na niebieski sześcianredBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)-- Obróć CFrame względem siebie, aby górna powierzchnia (nie przednia) wskazywała na niebieski sześcianlocal rotatedCFrame = CFrame.fromEulerAnglesXYZ(math.rad(-90), 0, 0)redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)


Znajdź punkt pomiędzy punktami
Możesz użyć interpolacji liniowej, czyli lerp, aby umiejscowić CFrame pomiędzy dwoma punktami. W poniższym przykładzie część redBlock przemieszcza się pomiędzy częściami greenCube i cyanCube. Wartość 0.7 umieszcza go na 70% odległości od zielonego sześcianu.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal greenCube = Workspace.GreenCubelocal cyanCube = Workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)

