CFrames

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

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 CFrame
local newCFrame = CFrame.new(-2, 2, 4)
-- Zastąp aktualny CFrame czerwonego bloku nowym CFrame
redBlock.CFrame = newCFrame
Przed
Po

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 CFrame
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- Zastąp aktualny CFrame czerwonego bloku nowym CFrame
redBlock.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 CFrame
local newCFrame = CFrame.fromEulerAnglesXYZ(0, math.rad(45), 0)
-- Zastąp aktualny CFrame czerwonego bloku nowym CFrame
redBlock.CFrame = newCFrame
Przed
Po

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.RedBlock
local blueCube = Workspace.BlueCube
redBlock.Position = Vector3.new(0, 3, 0)
-- Skieruj przednią powierzchnię czerwonego bloku na niebieski sześcian
redBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)
Przed
Po

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

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

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

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

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:

  1. Skieruj przednią powierzchnię, oznaczoną białym okręgiem, na cel.
  2. Obróć CFrame tak, aby górna powierzchnia, oznaczona czarnym okręgiem, wskazywała na cel.

local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
-- Skieruj przednią powierzchnię czerwonego bloku na niebieski sześcian
redBlock.CFrame = CFrame.lookAt(redBlock.Position, blueCube.Position)
-- Obróć CFrame względem siebie, aby górna powierzchnia (nie przednia) wskazywała na niebieski sześcian
local rotatedCFrame = CFrame.fromEulerAnglesXYZ(math.rad(-90), 0, 0)
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
Przed
Po

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.RedBlock
local greenCube = Workspace.GreenCube
local cyanCube = Workspace.CyanCube
redBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)
Przed
Po
©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.