Un CFrame , abreviado como marco de coordenadas , es un tipo de dato utilizado para rotar y posicionar objetos 3D.Como propiedad de un objeto o como unidad independiente, un CFrame contiene coordenadas globales x-, y-, y z- para cada eje, así como datos de rotación.Además, CFrames contienen funciones útiles para trabajar con objetos en el espacio 3D.
Algunos ejemplos de CFrame aplicaciones en un juego podrían ser:
- Encontrar un punto de objetivo lejano para un proyectil, como la posición de un enemigo objetivo por un láser blaster de un jugador.
- Mover la cámara para que se centre en NPCs específicos a medida que un jugador interactúa con ellos.
- Colocar un indicador de estado directamente sobre la cabeza de un jugador para mostrar si está paralizado, potenciado, envenenado, etc.
Bases de CFrame
Posiciona un marco C
Puedes crear un vacío CFrame en la posición predeterminada de (0, 0, 0) usando CFrame.new().Para posicionar un CFrame en un punto específico, proporcione x-, y- y z-coordinadas como argumentos a CFrame.new() .En el siguiente ejemplo, las propiedades de la parte de la siguiente parte cambian a , reubicándose a (-2, 2, 4).
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Crear nuevo marco CFramelocal newCFrame = CFrame.new(-2, 2, 4)-- Reemplazar el marco actual de redBlock con un nuevo marco de CredBlock.CFrame = newCFrame


Alternativamente, puedes proporcionar una nueva posición Vector3 a CFrame.new() y obtener el mismo resultado:
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Crear nuevo marco CFramelocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- Reemplazar el marco actual de redBlock con un nuevo marco de CredBlock.CFrame = newCFrame
Rotar un marco CFrame
Para crear un rotado CFrame, use el constructor CFrame.Angles(), proporcionando un ángulo de rotación en radianes para los ejes deseados.Los parámetros para CFrame.Angles() están en radianes, no en grados.Si prefiere grados, use math.rad() para convertir grados en radianes.En el siguiente ejemplo, la parte redBlock gira 45 grados en sentido contrario en su eje y.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Crear nuevo marco girado CFramelocal newCFrame = CFrame.Angles(0, math.rad(45), 0)-- Reemplazar el marco actual de redBlock con un nuevo marco de CredBlock.CFrame = newCFrame


Enfrentar un marco hacia un punto
Puedes usar CFrame.new() para apuntar la superficie frontal de un CFrame a un punto específico en el mundo.En el siguiente ejemplo, redBlock posiciona las partes en (0, 3, 0) y apunta su superficie frontal, marcada por el círculo blanco, a la parte blueCube.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- Crear un Vector3 para la posición de inicio y la posición objetivolocal startPosition = Vector3.new(0, 3, 0)local targetPosition = blueCube.Position-- Pon el bloque rojo en 'startPosition' y apunta su superficie frontal en 'targetPosition'redBlock.CFrame = CFrame.new(startPosition, targetPosition)


Desplazar un marco C
Para desplazar un objeto por un número específico de tachuelas desde su posición actual, añade o resta un Vector3 a o desde una nueva CFrame en la posición del objeto.Para obtener una posición de objeto bien formateada , como se ve aquí, su propiedad ( ) es un atajo conveniente.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)


Puedes usar la misma técnica para desplazar un objeto desde la posición de otro objeto.En el siguiente ejemplo, un Vector3 se agrega a un nuevo CFrame creado en la posición del cubo azul en lugar de la posición del bloques.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)


Orientación dinámica del marco CFrame
Los constructores CFrame.new() y CFrame.Angles() reubican 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 en el mundo.Por ejemplo:
- Colocar un tesoro flotante directamente frente a un jugador que puede estar de pie en cualquier parte del mundo, enfrentando cualquier dirección.
- Hacer que un genio mágico aparezca directamente sobre el hombro derecho de un jugador.
En estos casos, utilice métodos CFrame en lugar de sus constructores.
Posición relativa
La función CFrame:ToWorldSpace() transforma la orientación de un objeto CFrame —respetando su propia orientación local— a una nueva orientación mundo .Esto lo hace ideal para compensar una parte con respecto a sí misma o a otro objeto, independientemente de cómo esté actualmente posicionada/rotada.
En el siguiente ejemplo, la parte redBlock desplaza 2 espárragos relativos al eje y del cubo azul (la flecha verde que atraviesa) y no relativos al eje global que apunta hacia arriba.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)


Rotación relativa
También puedes usar CFrame:ToWorldSpace() para rotar un objeto relativo a sí mismo.En el siguiente ejemplo, la parte redBlock gira 70 grados en sentido contrario a las manecillas en su eje y 20 grados en sentido horario en su eje 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)


Enfrentar una superficie específica hacia un punto
Puedes hacer que el frente de un objeto se enfrente a otro objeto al proporcionar un punto Vector3 como segundo parámetro de CFrame.new().También puedes usar rotación relativa para hacer que cualquier cara del objeto se dirija a un punto Vector3 .El siguiente ejemplo realiza dos operaciones consecutivas CFrame :
- Apunta la superficie delantera frontal marcada por el círculo blanco, al objetivo.
- Gira el CFrame para hacer que la superficie superior marcada por el círculo negro apunte hacia el objetivo.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCube-- Crear un Vector3 para la posición objetivolocal targetPosition = blueCube.Position-- Apunta la superficie frontal del bloque rojo a 'targetPosition'redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)-- Ahora la superficie frontal del bloque rojo (circulo blanco) apunta hacia el cubo azul-- Rotar el marco relativo del bloque rojo con respecto a sí mismo para que su superficie superior (no frontal) apunte hacia el objetivolocal 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)


Encuentra un punto entre puntos
Puedes usar interpolación lineal o lerp para posicionar un entre dos puntos.En el siguiente ejemplo, la parte redBlock reposiciona entre las partes greenCube y cyanCube.El valor de 0.7 lo coloca a 70% de distancia del 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)

