CFormas

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

Un CFrame , corto para Coordinar marco , es un tipo de datos usado para rotar y posicionar objetos 3D. Como propiedad de un objeto o una unidad autónoma, un CFrame contiene coordenadas globales x-, y- y z- , así como datos de rotación para

Algunos ejemplos de aplicaciones de CFrame en un juego pueden ser:

  • Encontrar un punto de destino lejano para un proyectil, como la posición de un enemigo apuntado por el láser del jugador.
  • Mover la cámara para que se enfogue en NPC específicos mientras el jugador interactúa con ellos.
  • Colocar un indicador de estado directamente por encima de la cabeza de un jugador para mostrar si está paralítico, potenciado, envenenado, etc.

CFrame Básicos

Posicionando un CFrame

Puede crear un vacío CFrame en la posición predeterminada (0, 0, 0) usando Datatype.CFrame.


local redBlock = workspace.RedBlock
-- Crear nuevo CFrame
local newCFrame = CFrame.new(-2, 2, 4)
-- Sobrescribir el CFrame actual de redBlock con un nuevo CFrame
redBlock.CFrame = newCFrame
Antes
Después

Alternativamente, puede proporcionar una nueva posición de Vector3 a CFrame.new() y obtener el mismo resultado:


local redBlock = workspace.RedBlock
-- Crear nuevo CFrame
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- Sobrescribir el CFrame actual de redBlock con un nuevo CFrame
redBlock.CFrame = newCFrame

Girando un CFrame

Para crear un CFrame giratorio, use el constructor de CFrame.Angles(), proporcionando un ángulo de rotación en radianes para los ejes deseados. Los parámetros de Datatype.CFrame


local redBlock = workspace.RedBlock
-- Crear nuevo CFrame giratorio
local newCFrame = CFrame.Angles(0, math.rad(45), 0)
-- Sobrescribir el CFrame actual de redBlock con un nuevo CFrame
redBlock.CFrame = newCFrame
Antes
Después

Mirando hacia un punto

Puede usar CFrame.new() para apuntar la superficie delantera de un CFrame a un punto específico en el mundo. En el ejemplo siguiente, las posiciones de la parte redBlock están en (0, 3, 0) y apuntan su superficie delantera, marcada por el círculo blanco, en la parte


local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
-- Crea un Vector3 para ambas la posición de inicio y la posición de destino
local startPosition = Vector3.new(0, 3, 0)
local targetPosition = blueCube.Position
-- Pon el bloque rojo en 'startPosition' y apunta su superficie frontal a 'targetPosition'
redBlock.CFrame = CFrame.new(startPosition, targetPosition)
Antes
Después

Desactivar un CFrame

Para desviar un objeto por un número específico de espárragos desde su posición actual, agregue o restee un Vector3 a o desde un nuevo CFrame en la posición del objeto.


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

Puedes usar la misma técnica para desplazar un objeto de la posición de otro objeto. En el ejemplo siguiente, un Vector3 añade a un nuevo CFrame creado en la posición del cubo azul en lugar de la posición del bloques.


local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
redBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
Antes
Después

Orientación dinámica de CFrame

Los constructores CFrame.new() y CFrame.Angles() reposicionan o giran un objeto en una orientación específica dentro del mundo, pero a veces no puedes confiar en una posición y ángulo de rotación fijos. Por ejemplo:

  • Colocar un tesoro flotante directamente frente a un jugador que puede estar parado en cualquier lugar del mundo, frente a cualquier dirección.
  • Haciendo un genie mágico aparecer directamente por encima del hombro derecho de un jugador.

En estos casos, usa métodos CFrame en lugar de sus constructores.

Posición relativa

La función Datatype.CFrame:ToWorldSpace() transforma un objeto de su Datatype.CFrame —respetando su propia orientación local— a una nueva orientación de 1> mundo 1>. Esto lo hace ideal para desplazar una parte en relación con sí misma o con otro objeto, independientemente de cómo está actualmente posicionado/girado.

En el siguiente ejemplo, la parte redBlock se desplaza 2 espárragos en relación con la y-axis del cubo azul (la flecha verde que apunta a través de ella) y no en relación con la eje global apuntando hacia arriba.


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

Rotación relativa

También puede usar CFrame:ToWorldSpace() para rotar un objeto en relación con sí mismo. En el ejemplo siguiente, la parte redBlock gira 70 grados en contra de sí misma en su eje y 20 grados en contra de su eje.


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

Enfrentar una superficie específica hacia un punto

Puede hacer que la parte delantera de un objeto se enfrente a otro objeto proporcionando un punto de Vector3 como segundo parámetro de CFrame.new() . También puede usar la rotación relativa para hacer que cualquier cara del objeto se alinee con un punto de Vector3 . La siguiente ejemplo realiza dos operaciones de

  1. Apunte la superficie frontal frente , marcada por el círculo blanco, en el objetivo.
  2. Gira el CFrame para hacer que la superficie superior tenga la marca del círculo negro, apunte hacia el objetivo.

local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
-- Crear un Vector3 para la posición objetivo
local targetPosition = blueCube.Position
-- Apunta la superficie del bloque rojo a 'targetPosition'
redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)
-- Ahora la superficie del bloque rojo (círculo blanco) apunta hacia el blueCube
-- Gira CFrame de redBlock relativo a sí mismo para que su superficie superior (no frontal) apunte hacia el objetivo
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
Después

Encontrando un punto entre puntos

Puede usar interpretación lineal , o lerp , para posicionar un CFrame entre dos puntos. En el ejemplo siguiente, la parte 2> redBlock2> reposición entre el 5> greenCube


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