A CFrame , skrót dla Koordynatora ram, jest typem danych używanym do obrotu i pozycjonowania obiektów 3D. Jako właściwość obiektu lub jednostka samodzielna, 2> Datatype.CFrame2> zawiera globalne
Niektóre przykłady zastosowań CFrame w grze mogą być:
- Znalezienie daleko położonego punktu docelowego dla pocisku, takiego jak pozycja wroga celowanego przez laserową nóż kłującą.
- Przenieś kamerę, aby skupić się na konkretnych NPC jako gracz z nimi interaguje.
- Umieszczenie wskaźnika statusu bezpośrednio nad głową gracza, aby pokazać, czy są one paraliżowane, wzmocnione, zatruwane itp.
Podstawy CFrame
Pozycjonowanie CFrame
Możesz utworzyć pusty CFrame w pozycji domyślnej (0, 0, 0) poprzez użycie Dat
local redBlock = workspace.RedBlock-- Utwórz nowy CFramelocal newCFrame = CFrame.new(-2, 2, 4)-- Napisać obecny CFrame redBlock'a nowym CFrameredBlock.CFrame = newCFrame


Alternatywnie możesz zaoferować nową pozycję Vector3 do CFrame.new() i uzyskać taki sam wynik:
local redBlock = workspace.RedBlock-- Utwórz nowy CFramelocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- Napisać obecny CFrame redBlock'a nowym CFrameredBlock.CFrame = newCFrame
Obrót CFrame
Aby stworzyć obrócony CFrame , użyj konstruktora CFrame.Angles(), zapewniającego kąt obrotowy w stopniach dla celowanych osi, parametry do Datatype.
local redBlock = workspace.RedBlock-- Utwórz nowy obrócony CFramelocal newCFrame = CFrame.Angles(0, math.rad(45), 0)-- Napisać obecny CFrame redBlock'a nowym CFrameredBlock.CFrame = newCFrame


Spogląd w kierunku punktu
Możesz użyć CFrame.new() , aby wskazać przednią powierzchnię CFrame na określonym punkcie w świecie. W następnym przykładzie redBlock pozycje części na (0, 3, 0) i wskazują jego powierzchnię, oznaczoną przez biały krąg, na części <
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCube-- Utwórz Vector3 dla obu pozycji startowych i pozycji docelowejlocal startPosition = Vector3.new(0, 3, 0)local targetPosition = blueCube.Position-- Umieść czerwonyBlock w 'startPosition' i wskaż jego przednią powierzchnię na 'targetPosition'redBlock.CFrame = CFrame.new(startPosition, targetPosition)


Wyłączenie CFrame
Aby zrównać obiekt przez określną liczbę jednostek od jego obecnej pozycji, dodaj lub odejmij Vector3 do lub z nowej CFrame pozy
local redBlock = workspace.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)


Możesz użyć tej samej techniki, aby odesłać obiekt z pozycji innego obiektu. W następnym przykładzie Vector3 dodaje się do nowego CFrame stworzonego w pozycji niebieskiego kubu, zamiast pozycji bloku.
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)


O orientacji CFrame dynamicznej
Konstrukty CFrame.new() i CFrame.Angles() przesuwają lub obróщают obiekt w określonym kierunku 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 być stojący w dowolnym miejscu na świecie, twarzą w dowolnym kierunku.
- Utworzenie magicznego ducha pojawiającego się 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 obiektu CFrame — zachowując jego własne lokalne orientacje — w nowy świat przestrzeni . To czyni go idealnym do kompensacji części w odniesieniu do siebie lub innego obiektu, niezależnie od tego, jak obecnie położony / obrócony.
W następnym przykładzie część redBlock ma odległość 2 studs względem osi y niezależnie od koloru kostki (zielonego стрелки wskazującej poprzez nią) i nie względem globalnej osi wskazującej prosto.
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)


相对旋转
Możesz również użyć CFrame:ToWorldSpace() , aby obrócić obiekt w stosunku do siebie. W następnym przykładzie część redBlock obraca się o 70 stopni w kierunku przeciwko siebie na swojej osi y i 20 stopni w kierunku na swojej zachodniej osi.
local redBlock = workspace.RedBlocklocal rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)


Spotkanie z konkretną powierzchnią w kierunku punktu
Możesz uczynić przedmiotu twarzy Vector3 punkt jako drugą parametr CFrame.new() . Możesz również użyć stosunkowej rotacji, aby uczynić dowolną twarz Vector3 punkt. Następny przykład wykonuje dwa kolejne operacje 1> Datatype.CFrame
- Wskaż przednią powierzchnię, oznaczoną białym kręгом, na celu.
- Obróć CFrame, aby stworzyć powierzchnię górną , zaznaczoną przez czarny krąg, wskazując na cel.
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCube-- Utwórz Vector3 dla pozycji docelowejlocal targetPosition = blueCube.Position-- Wskaż przednią powierzchnię czerwonego bloku na „targetPosition”redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)-- Teraz przednia powierzchnia redBlock (biały krąg) wskazuje na blueCube-- Obróć CFrame redBlock'a w stosunku do siebie, 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)


Znalezienie punktu między punktami
Możesz użyć liniowej interpolacji lub lerp, aby pozycjonować CFrame pomiędzy dwoma punktami. W następnym przykładzie część 2> redBlock2> repozycjonuje się międ
local redBlock = workspace.RedBlocklocal greenCube = workspace.GreenCubelocal cyanCube = workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)

