CFrame

*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 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 CFrame
local newCFrame = CFrame.new(-2, 2, 4)
-- Napisać obecny CFrame redBlock'a nowym CFrame
redBlock.CFrame = newCFrame
Przed
Po

Alternatywnie możesz zaoferować nową pozycję Vector3 do CFrame.new() i uzyskać taki sam wynik:


local redBlock = workspace.RedBlock
-- Utwórz nowy CFrame
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- Napisać obecny CFrame redBlock'a nowym CFrame
redBlock.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 CFrame
local newCFrame = CFrame.Angles(0, math.rad(45), 0)
-- Napisać obecny CFrame redBlock'a nowym CFrame
redBlock.CFrame = newCFrame
Przed
Po

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.RedBlock
local blueCube = workspace.BlueCube
-- Utwórz Vector3 dla obu pozycji startowych i pozycji docelowej
local 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)
Przed
Po

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

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

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

相对旋转

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

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

  1. Wskaż przednią powierzchnię, oznaczoną białym kręгом, na celu.
  2. Obróć CFrame, aby stworzyć powierzchnię górną , zaznaczoną przez czarny krąg, wskazując na cel.

local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
-- Utwórz Vector3 dla pozycji docelowej
local 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 cel
local 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)
Przed
Po

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.RedBlock
local greenCube = workspace.GreenCube
local cyanCube = workspace.CyanCube
redBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)
Przed
Po