CF레임

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

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.RedBlock
local 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.RedBlock
redBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
이전에

다른 개체의 위치에서 개체를 상쇄하기 위해 동일한 기술을 사용할 수 있습니다.다음 예제에서는 블록의 위치 대신 파란색 큐브의 위치에 새로 생성된 가 추가됩니다.


local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local blueCube = Workspace.BlueCube
redBlock.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.RedBlock
local blueCube = Workspace.BlueCube
local 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.RedBlock
local rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
이전에

특정 표면을 지점으로 향해 직면

의 두 번째 매개 변수로 포인트를 제공하여 개체의 앞면이 다른 개체와 마주하도록 할 수 있습니다.상대 회전을 사용하여 개체의 모든 면이 Vector3 포인트를 향하도록 할 수도 있습니다.다음 예제에서는 두 연속 CFrame 작업을 수행합니다:

  1. 하얀색 원으로 표시된 앞면 표면을 대상에 가리키세요.Point the front surface, marked by the white circle, at the target.
  2. 검은색 원으로 표시된 상단 표면을 가리키도록 하려면 CFrame를 회전하여 최상위 표면을 표시합니다.

local Workspace = game:GetService("Workspace")
local redBlock = Workspace.RedBlock
local 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 부품이 greenCubecyanCube 부품 사이에서 재위치합니다.0.7의 값은 녹색 큐브에서 70% 떨어진 위치에 배치합니다.


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)
이전에