A CFrame , krótki dla ramy koordynacyjnej , jest typem danych używanym do obrotu i pozycjonowania obiektów 3D.Jako właściwość obiektu lub jako niezależna jednostka, CFrame zawiera globalne x-, y- i z-koordynaty, a także dane o obrocie dla każdej osi.Ponadto CFrames zawierają przydatne funkcje do pracy z obiektami w przestrzeni 3D.
Niektóre przykłady aplikacji CFrame w grze mogą być:
- Znalezienie odległego punktu docelowego dla pocisku, takiego jak pozycja wroga celowanego przez laserowy blaster gracza.
- Przesuwanie kamery, aby skupiła się na konkretnych NPC, gdy gracz z nimi interakuje.
- Umieszczenie wskaźnika stanu bezpośrednio nad głową gracza, aby pokazać, czy są sparaliżowani, wzmocnieni, zatrute itp.
Podstawy CFrame
Pozycjonuj CFrame
Możesz utworzyć puste CFrame w domyślnej pozycji (0, 0, 0) za pomocą CFrame.new().Aby umieścić CFrame w określonym punkcie, podaj x-, y- i z-koordynaty jako argumenty do CFrame.new().W następnym przykładzie właściwość części zmienia się do , przesuwając ją do (-2, 2, 4).
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Utwórz nowe CFramelocal newCFrame = CFrame.new(-2, 2, 4)-- Zastąp obecny CFrame redBlocka 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 nowe CFramelocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- Zastąp obecny CFrame redBlocka nowym CFrameredBlock.CFrame = newCFrame
Obróć CFrame
Aby stworzyć obrócony CFrame, użyj konstruktora CFrame.Angles(), dostarczając kąt obrotu w radiach dla pożądanych osi.Parametry do CFrame.Angles() są w radiach, a nie stopniach.Jeśli wolisz stopnie, użyj math.rad(), aby przekształcić stopnie na radiany.W następnym przykładzie część redBlock obraca się o 45 stopni w kierunku przeciwnym na osi y.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Utwórz nowy obrócony CFramelocal newCFrame = CFrame.Angles(0, math.rad(45), 0)-- Zastąp obecny CFrame redBlocka nowym CFrameredBlock.CFrame = newCFrame


Zwróć twarz CFrame w kierunku punktu
Możesz użyć CFrame.new(), aby wskazać przednią powierzchnię CFrame na określonej pozycji na świecie.W następnym przykładzie redBlock pozycje części w (0, 3, 0) i wskazuje jej przednią powierzchnię, oznaczoną białym kręgiem, na części blueCube.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- Utwórz wektor 3 dla pozycji startowej i pozycji docelowejlocal startPosition = Vector3.new(0, 3, 0)local targetPosition = blueCube.Position-- Umieść czerwony blok w pozycji "startPosition" i skieruj jego powierzchnię frontową na pozycję "targetPosition"redBlock.CFrame = CFrame.new(startPosition, targetPosition)


Odłóż CFrame
Aby zrównoważyć obiekt o określoną liczbę szpil od jego obecnej pozycji, dodaj lub odejmij z lub do nowej pozycji obiektu.Aby uzyskać prawidłowo formatowane położenie Vector3 obiektu do użycia z CFrame.new() , jak pokazano tutaj, jego 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 zrównoważyć obiekt z pozycji innego obiektu.W następnym przykładzie Vector3 dodaje do nowego CFrame utworzonego na pozycji niebieskiego kubu 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
Konstruktorzy CFrame.new() i CFrame.Angles() przesuwają lub obracają obiekt w określonej orientacji w świecie, ale czasami nie można polegać na stałej pozycji świata i kącie obrotu.Na przykład:
- Umieszczenie pływającego skarbu bezpośrednio przed graczem, który może stać gdziekolwiek na świecie, zwrócony w dowolnym kierunku.
- Wyświetlanie magicznego geniusza bezpośrednio nad prawym ramieniem gracza.
W tych przypadkach użyj metod CFrame zamiast ich konstruktorów.
Pozycja względna
Funkcja CFrame:ToWorldSpace() przekształca orientację obiektu CFrame — respektując jego własną lokalną orientację — na nową orientację świata .To czyni go idealnym do odwracania części względem samej siebie lub innego obiektu, niezależnie od tego, jak obecnie jest położona/obrócona.
W następnym przykładzie część redBlock odwraca 2 szpilki względem osi y niebieskiego kubu (zielona strzałka wskazująca przez nią) i nie względem globalnej osi y wskazującej prosto 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)


Relatywna rotacja
Możesz także użyć CFrame:ToWorldSpace() , aby obrócić obiekt względem samego siebie.W następnym przykładzie część redBlock obraca się o 70 stopni w lewo na osi y i o 20 stopni w lewo na osi z.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)


Zwróć się do konkretnej powierzchni w kierunku punktu
Możesz sprawić, że przód obiektu zmierza w stronę innego obiektu, dostarczając punkt Vector3 jako drugi parametr CFrame.new().Możesz również użyć względnej rotacji, aby każda twarz obiektu wskazywała na punkt Vector3.Poniższy przykład wykonuje dwie kolejne operacje CFrame:
- Wskaż powierzchnię przodu , oznaczoną białym kręгом, na celu.
- Obróć CFrame, aby uczynić powierzchnię górną , oznaczoną czarnym kręгом, wskazującą w stronę celu.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- Stwórz Vector3 dla docelowej pozycjilocal targetPosition = blueCube.Position-- Skieruj przednią powierzchnię czerwonego bloku na 'targetPosition'redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)-- Teraz powierzchnia frontowa czerwonego bloku (biały krąg) wskazuje w kierunku niebieskiego kubu-- Obróć CFrame czerwonego bloku względem samego siebie, tak aby jego górna powierzchnia (nie przednia) wskazywała na cellocal 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)


Znajdź punkt między punktami
Możesz użyć liniowej interpolacji lub lerp , aby umieścić CFrame między dwoma punktami.W następnym przykładzie część redBlock przenosi się między częściami greenCube i cyanCube.Wartość 0.7 umieszcza ją na odległość 70% od zielonego kubu.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal greenCube = Workspace.GreenCubelocal cyanCube = Workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)

