CFrame

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

Um CFrame, curto para FrameCoordinate , é um tipo de dado usado para girar e posicionar objetos 3D. Como uma propriedade de objeto ou uma unidade autônoma, um CFrame contém x-, y- e z-坐标, bem como dados de rota

Alguns exemplos de aplicações CFrame em um jogo podem ser:

  • Encontrar um ponto de alvo distante para um projétil, como a posição de um inimigo atingido por um laser do blaster de um jogador.
  • Mover a câmera para que ela se concentre em NPCs específicos à medida que um jogador interage com eles.
  • Colocar um indicador de status diretamente acima da cabeça de um jogador para mostrar se eles estão paralisados, aumentados, envenenados, etc.

CFrame Básicos

Posicionando um CFrame

Você pode criar um CFrame vazio na posição padrão (0, 0, 0) usando Datatype.CFrame.


local redBlock = workspace.RedBlock
-- Criar um novo CFrame
local newCFrame = CFrame.new(-2, 2, 4)
-- Substituir o CFrame atual do redBlock com um novo CFrame
redBlock.CFrame = newCFrame
Antes
Depois

Alternativamente, você pode fornecer uma nova posição de Vector3 para CFrame.new() e obter o mesmo resultado:


local redBlock = workspace.RedBlock
-- Criar um novo CFrame
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- Substituir o CFrame atual do redBlock com um novo CFrame
redBlock.CFrame = newCFrame

Girando um CFrame

Para criar um CFrame giratório, use o construtor CFrame.Angles(), fornecendo um ângulo de rotação em radians para os eixos desejados. Os parâmetros para Datatype.


local redBlock = workspace.RedBlock
-- Criar um novo CFrame giratório
local newCFrame = CFrame.Angles(0, math.rad(45), 0)
-- Substituir o CFrame atual do redBlock com um novo CFrame
redBlock.CFrame = newCFrame
Antes
Depois

Enfrentando um Ponto

Você pode usar CFrame.new() para apontar a superfície frontal de um CFrame em um ponto específico no mundo. No exemplo a seguir, redBlock partes posicionadas em (0, 3, 0) e pontos sua superfície frontal, marcada pelo círculo branco, na peça 1> blue


local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
-- Crie um Vector3 para ambas as posições de início e de destino
local startPosition = Vector3.new(0, 3, 0)
local targetPosition = blueCube.Position
-- Coloque o bloco vermelho no 'startPosition' e apontar sua superfície frontal para 'targetPosition'
redBlock.CFrame = CFrame.new(startPosition, targetPosition)
Antes
Depois

Desligando um CFrame

Para deslocar um objeto por um número específico de studs de sua posição atual, adicione ou subtrai um Vector3 a ou de um novo CFrame na posição do objeto


local redBlock = workspace.RedBlock
redBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
Antes
Depois

Você pode usar a mesma técnica para deslocar um objeto 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 redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
redBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
Antes
Depois

Orientação Dinâmica CFrame

Os CFrame.new() e CFrame.Angles() construtores reposicionam ou giram um objeto em uma orientação específica dentro do mundo, mas você às vezes não pode confiar em uma posição e rotação de mundo fixa. 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 gênio 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 Objetoem um novo mundo de orientação local, respeitando sua própria orientação local — respeitando sua própria orientação local — para um novo mundo de orientação. Isso torna ideal para deslocar uma parte em relação a si mesma ou a outro Objeto, independentemente de como ele está atualmente posicionado/rotacionado.

No seguinte exemplo, a parte redBlock desloca 2 studs 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 apontando direto para cima.


local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
local offsetCFrame = CFrame.new(0, 2, 0)
redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)
Antes
Depois

Rotação Relativa

Você também pode usar CFrame:ToWorldSpace() para girar um objeto em relação a si mesmo. No exemplo a seguir, a parte redBlock gira 70 graus contracircular em sua eixe y e 20 graus clockwise em sua eixe z.


local redBlock = workspace.RedBlock
local rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
Antes
Depois

Enfrentando uma Superfície Específica em direção a um Ponto

Você pode fazer a frente de um objeto rosto outro objeto fornecendo um ponto Vector3 como segundo parâmetro de CFrame.new(). Você também pode usar a rotação relativa para fazer qualquer rosto do objeto ponto para um ponto Vector3. O seguinte exemplo executa duas operações 2>Datatype.CFrame

  1. Pontar a superfície frente , marcada pelo círculo branco, na direção do alvo.
  2. Girar o CFrame para fazer a superfície top , marcada pelo círculo preto, apontar para o alvo.

local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
-- Crie um Vector3 para a posição do alvo
local targetPosition = blueCube.Position
-- Aponte a superfície frontal do redBlock em 'targetPosition'
redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)
-- Agora, a superfície frontal do redBlock (círculo branco) está apontando para o blueCube
-- Girar o CFrame de redBlock em relação a si mesmo para que sua superfície superior (não frontal) apontar para o alvo
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)
Antes
Depois

Encontrando um Ponto Entre Pontos

Você pode usar interpretação lineal , ou lerp , para posicionar um CFrame entre dois pontos. No exemplo a seguir, a parte 1> redBlock1> reposiciona entre as partes 4> green


local redBlock = workspace.RedBlock
local greenCube = workspace.GreenCube
local cyanCube = workspace.CyanCube
redBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)
Antes
Depois