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 CFramelocal newCFrame = CFrame.new(-2, 2, 4)-- Substituir o CFrame atual do redBlock com um novo CFrameredBlock.CFrame = newCFrame
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 CFramelocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- Substituir o CFrame atual do redBlock com um novo CFrameredBlock.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óriolocal newCFrame = CFrame.Angles(0, math.rad(45), 0)-- Substituir o CFrame atual do redBlock com um novo CFrameredBlock.CFrame = newCFrame
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.RedBlocklocal blueCube = workspace.BlueCube-- Crie um Vector3 para ambas as posições de início e de destinolocal 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)
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.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
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.RedBlocklocal blueCube = workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
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.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 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.RedBlocklocal rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
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
- Pontar a superfície frente , marcada pelo círculo branco, na direção do alvo.
- Girar o CFrame para fazer a superfície top , marcada pelo círculo preto, apontar para o alvo.
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCube-- Crie um Vector3 para a posição do alvolocal 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 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)
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.RedBlocklocal greenCube = workspace.GreenCubelocal cyanCube = workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)