A CFrame , 짧은 좌표 프레임 , 3D 개체를 회전하고 위치하는 데 사용되는 데이터 유형입니다.개체 속성 또는 독립 실행형 단위로, CFrame에는 각 축에 대한 전역 x-, y-, 및 z-좌표와 회전 데이터가 포함되어 있습니다.또한, CFrames 은 3D 공간에서 개체를 작업하는 데 유용한 함수를 포함합니다.
게임에서 CFrame 응용 프로그램의 일부 예시는 다음과 같을 수 있습니다.
- 플레이어의 레이저 블래스터가 타겟으로 지정한 적의 위치와 같이 발사체의 멀리 떨어진 목표 지점을 찾는 것
- 플레이어가 특정 NPC와 상호작용할 때 초점을 맞추도록 카메라를 이동합니다.
- 플레이어의 머리 위에 상태 표시기를 배치하여 마비되었는지, 부스트되었는지, 중독되었는지 등을 표시합니다.
CF레임 기본
CF레임 위치하기
(0, 0, 0)의 기본 위치에서 CFrame.new()를 사용하여 빈 CFrame를 생성할 수 있습니다.특정 지점에 CFrame 를 배치하려면 x-, y-, 및 z-좌표를 CFrame.new() 의 인수로 제공하십시오.다음 예제에서는 redBlock 부분의 CFrame 속성이 newCFrame 로 변경되어(-2, 2, 4) 위치가 변경됩니다.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- 새 CFrame 생성local newCFrame = CFrame.new(-2, 2, 4)-- 레드블록의 현재 CFrame을 새 CFrame으로 덮어쓰기redBlock.CFrame = newCFrame


또는 새로운 Vector3 위치를 CFrame.new() 에 제공하여 동일한 결과를 얻을 수 있습니다.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- 새 CFrame 생성local newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- 레드블록의 현재 CFrame을 새 CFrame으로 덮어쓰기redBlock.CFrame = newCFrame
CFrame 회전
회전된 CFrame를 생성하려면 원하는 축에 대한 라디안 단위의 회전 각도를 제공하는 CFrame.Angles() 생성기를 사용하십시오.CFrame.Angles() 의 매개 변수는 도가 아닌 라디안입니다.학위를 선호하는 경우 math.rad() 을 사용하여 학위를 라디안으로 변환합니다.다음 예제에서는 redBlock 부품이 y축에서 45도 시계 반대 방향으로 회전합니다.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- 새로운 회전된 CFrame 생성local newCFrame = CFrame.Angles(0, math.rad(45), 0)-- 레드블록의 현재 CFrame을 새 CFrame으로 덮어쓰기redBlock.CFrame = newCFrame


포인트에 CFrame 대면
CFrame.new()를 사용하여 세계의 특정 지점에서 CFrame의 앞면 표면을 가리킬 수 있습니다.다음 예제에서는 redBlock 부품 위치가 (0, 3, 0)에 있고 흰색 원으로 표시된 앞면 표면을 부품 blueCube에 가리킵니다.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- 시작 위치와 대상 위치 모두에 벡터3 생성local startPosition = Vector3.new(0, 3, 0)local targetPosition = blueCube.Position-- 빨간 블록을 '시작 위치'에 배치하고 앞면을 '대상 위치'에 가리키세요redBlock.CFrame = CFrame.new(startPosition, targetPosition)


CF레임 오프셋
현재 위치에서 특정 스터드 수로 개체를 상쇄하려면 개체의 위치에서 새로운 Vector3 또는 CFrame 를 더하거나 빼십시오.여기에서 보듯이 CFrame.new() 에 사용할 개체의 올바르 형식의 Vector3 위치를 얻으려면 해당 Position 속성(redBlock.Position)이 편리한 단축 경로입니다.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)


다른 개체의 위치에서 개체를 상쇄하기 위해 동일한 기술을 사용할 수 있습니다.다음 예제에서는 블록의 위치 대신 파란색 큐브의 위치에 새로 생성된 가 추가됩니다.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)


동적 CFrame 방향
CFrame.new() 및 CFrame.Angles() 생성자는 세계 내에서 특정 방향으로 개체를 재배치하거나 회전하지만, 고정된 세계 위치와 회전 각도에 의존할 수 없는 경우가 있습니다.예를 들어:
- 세계 어디에서나 서 있을 수 있는 플레이어 앞에 떠있는 보물을 직접 배치하여 어떤 방향으로든 향할 수 있습니다.
- 마법의 요정을 플레이어의 오른쪽 어깨 바로 위에 나타나게 하는 중
이 경우 생성자 대신 CFrame 메서드를 사용하십시오.
상대 위치
CFrame:ToWorldSpace() 함수는 개체의 CFrame — 자체 로컬 방향을 존중하도록 —를 새로운 세계 방향으로 변환합니다.이렇게 하면 현재 위치/회전이 어떻게 되었든 자체 또는 다른 개체와의 부품 상쇄에 적합합니다.
다음 예제에서는 파란색 큐브의 y-축(녹색 화살표를 통해 가리키는)과 전체 글로벌 y-축(바로 위로 가리키는)에 대해 redBlock 부분이 2스터드 오프셋되고, 전체 글로벌 y-축에 대해서는 없음 입니다.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)


상대 회전
또한 CFrame:ToWorldSpace()를 사용하여 자체와 관련된 개체를 회전시킬 수 있습니다.다음 예제에서는 redBlock 부품이 y축에서 70도 반시계 방향으로 회전하고 z축에서 20도 시계 방향으로 회전합니다.
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)


특정 표면을 지점으로 향해 직면
의 두 번째 매개 변수로 포인트를 제공하여 개체의 앞면이 다른 개체와 마주하도록 할 수 있습니다.상대 회전을 사용하여 개체의 모든 면이 Vector3 포인트를 향하도록 할 수도 있습니다.다음 예제에서는 두 연속 CFrame 작업을 수행합니다:
- 하얀색 원으로 표시된 앞면 표면을 대상에 가리키세요.Point the front surface, marked by the white circle, at the target.
- 검은색 원으로 표시된 상단 표면을 가리키도록 하려면 CFrame를 회전하여 최상위 표면을 표시합니다.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- 대상 위치에 벡터3 생성local targetPosition = blueCube.Position-- 빨간색 블록의 앞면을 '목표 위치'에 가리키세요redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)-- 이제 redBlock의 앞면(흰색 원)이 블루큐브를 가리키고 있습니다-- 빨간색 블록의 CFrame을 자체에 대해 회전하여 상단 표면(앞면이 아님)이 대상을 향하도록 합니다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)


포인트 사이의 지점 찾기
선형 인터폴레이션 또는 lerp 를 사용하여 두 점 사이에 CFrame 위치를 지정할 수 있습니다.다음 예제에서는 redBlock 부품이 greenCube 및 cyanCube 부품 사이에서 재위치합니다.0.7의 값은 녹색 큐브에서 70% 떨어진 위치에 배치합니다.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal greenCube = Workspace.GreenCubelocal cyanCube = Workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)

