Um CFrame , curto para Quadro de Coordenação , é um tipo de dado usado para girar e posicionar objetos 3D.Como uma propriedade de objeto ou uma unidade independente, um CFrame contém coordenadas globais x-, y- e z- e dados de rotação para cada eixo.Além disso, CFrames contêm funções úteis para trabalhar com objetos no espaço 3D.
Alguns exemplos de CFrame aplicações em um jogo podem ser:
- Encontrar um ponto de alvo distante para um projétil, como a posição de um inimigo alvo do laser de um jogador.
- Mover a câmera para que ela se concentre em NPCs específicos enquanto um jogador interage com eles.
- Colocar um indicador de status diretamente acima da cabeça de um jogador para mostrar se estão paralisados, aumentados, envenenados, etc.
Noções básicas de CFrame
Posicione um CFrame
Você pode criar um vazio CFrame na posição padrão de (0, 0, 0) usando CFrame.new().Para posicionar um CFrame em um ponto específico, forneça x-, y- e z-coordenadas como argumentos para CFrame.new().No seguinte exemplo, as propriedades da parte redBlock da parte CFrame mudam para newCFrame, reposicionando-a para (-2, 2, 4).
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Criar novo CFramelocal newCFrame = CFrame.new(-2, 2, 4)-- Substituir o CFrame atual do redBlock por um novo CFrameredBlock.CFrame = newCFrame


Alternativamente, você pode fornecer uma nova posição Vector3 para CFrame.new() e obter o mesmo resultado:
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Criar novo CFramelocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- Substituir o CFrame atual do redBlock por um novo CFrameredBlock.CFrame = newCFrame
Girar um CFrame
Para criar um girado CFrame , use o construtor CFrame.Angles(), fornecendo um ângulo de rotação em radianos para os eixos desejados.Os parâmetros para CFrame.Angles() estão em radianos, não em graus.Se você preferir graus, use math.rad() para converter graus em radianos.No seguinte exemplo, a parte redBlock gira 45 graus no sentido horário no eixo y.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Criar novo CFrame giradolocal newCFrame = CFrame.Angles(0, math.rad(45), 0)-- Substituir o CFrame atual do redBlock por um novo CFrameredBlock.CFrame = newCFrame


Enfrente um CFrame para um ponto
Você pode usar CFrame.new() para apontar a superfície frontal de um CFrame para um ponto específico no mundo.No seguinte exemplo, redBlock posiciona as partes em (0, 3, 0) e aponta sua superfície frontal, marcada pelo círculo branco, para a peça blueCube.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- Crie um Vector3 para a posição de início e a posição de alvolocal startPosition = Vector3.new(0, 3, 0)local targetPosition = blueCube.Position-- Coloque o bloco vermelho em 'startPosition' e aponta sua superfície frontal em 'targetPosition'redBlock.CFrame = CFrame.new(startPosition, targetPosition)


Desvie um CFrame
Para compensar um objeto por um número específico de metros de sua posição atual, adicione ou subtraia um Vector3 de ou para um novo CFrame na posição do Objeto.Para obter uma posição Vector3 adequadamente formatada de um objeto para usar com CFrame.new() , como visto aqui, sua propriedade Position ( redBlock.Position) é um atalho conveniente.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)


Você pode usar a mesma técnica para compensar um objeto a partir da posição de outro Objeto.No seguinte exemplo, um Vector3 adiciona a um novo CFrame criado na posição do cubo azul em vez da posição do bloco.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)


Orientação CFrame dinâmica
Os construtores CFrame.new() e CFrame.Angles() reposicionam ou giram um objeto em uma orientação específica dentro do mundo, mas às vezes você não pode confiar em uma posição e ângulo de rotação fixos do mundo.Por exemplo:
- Colocar um tesouro flutuante diretamente na frente de um jogador que pode estar em qualquer lugar do mundo, enfrentando qualquer direção.
- Fazer um genie mágico aparecer diretamente acima do ombro direito de um jogador.
Nesses casos, use métodos CFrame em vez de seus construtores.
Posição relativa
A função CFrame:ToWorldSpace() transforma um Objetode CFrame — respeitando sua própria orientação local — em uma nova orientação de mundo .Isso torna-o ideal para compensar uma parte em relação a si mesma ou a outro Objeto, independentemente de como está atualmente posicionada/rotacionada.
No seguinte exemplo, a parte redBlock desloca 2 metros em relação ao eixo y do cubo azul (a seta verde apontando através dele) e não em relação ao eixo global y apontando diretamente para cima.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)


Rotação relativa
Você também pode usar CFrame:ToWorldSpace() para girar um objeto em relação a si mesmo.No seguinte exemplo, a parte redBlock gira 70 graus no sentido horário no eixo y e 20 graus no sentido horário no eixo 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)


Enfrente uma superfície específica em direção a um ponto
Você pode fazer a frente de um objeto enfrentar outro objeto fornecendo um ponto Vector3 como o segundo parâmetro de CFrame.new().Você também pode usar rotação relativa para fazer qualquer rosto do objeto apontar para um ponto Vector3 .O seguinte exemplo realiza duas operações consecutivas CFrame :
- Aponte a frente superfície, marcada pelo círculo branco, ao alvo.
- Gire o CFrame para fazer a superfície superior , marcada pelo círculo preto, apontar para o alvo.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- Crie um Vector3 para a posição alvolocal targetPosition = blueCube.Position-- Apontar a superfície frontal do bloco vermelho para 'targetPosition'redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)-- Agora, a superfície frontal do redBlock (círculo branco) está apontando para o blueCube-- Gire o CFrame do redBlock em relação a si mesmo para que sua superfície superior (não frontal) aponta para o alvolocal 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)


Encontre um ponto entre pontos
Você pode usar interpolação linear ou lerp para posicionar um entre dois pontos.No seguinte exemplo, a parte redBlock reposiciona entre as partes greenCube e cyanCube.O valor de 0.7 coloca-o a 70% de distância do cubo verde.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal greenCube = Workspace.GreenCubelocal cyanCube = Workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)

