CFrames

*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 , 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 CFrame
local newCFrame = CFrame.new(-2, 2, 4)
-- Reemplazar el marco actual de redBlock con un nuevo marco de C
redBlock.CFrame = newCFrame
Antes de
Después de

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 CFrame
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- Reemplazar el marco actual de redBlock con un nuevo marco de C
redBlock.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 CFrame
local newCFrame = CFrame.Angles(0, math.rad(45), 0)
-- Reemplazar el marco actual de redBlock con un nuevo marco de C
redBlock.CFrame = newCFrame
Antes de
Después de

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.RedBlock
local blueCube = Workspace.BlueCube
-- Crear un Vector3 para la posición de inicio y la posición objetivo
local 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)
Antes de
Después de

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.RedBlock
redBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
Antes de
Después de

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.RedBlock
local blueCube = Workspace.BlueCube
redBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
Antes de
Después de

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.RedBlock
local blueCube = Workspace.BlueCube
local offsetCFrame = CFrame.new(0, 2, 0)
redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)
Antes de
Después de

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.RedBlock
local rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
Antes de
Después de

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 :

  1. Apunta la superficie delantera frontal marcada por el círculo blanco, al objetivo.
  2. 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.RedBlock
local blueCube = Workspace.BlueCube
-- Crear un Vector3 para la posición objetivo
local 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 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 de
Después de

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.RedBlock
local greenCube = Workspace.GreenCube
local cyanCube = Workspace.CyanCube
redBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)
Antes de
Después de