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 CFramelocal newCFrame = CFrame.new(-2, 2, 4)-- Sobrescribir el CFrame actual de redBlock con un nuevo CFrameredBlock.CFrame = newCFrame
Alternativamente, puede proporcionar una nueva posición de Vector3 a CFrame.new() y obtener el mismo resultado:
local redBlock = workspace.RedBlock-- Crear nuevo CFramelocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- Sobrescribir el CFrame actual de redBlock con un nuevo CFrameredBlock.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 giratoriolocal newCFrame = CFrame.Angles(0, math.rad(45), 0)-- Sobrescribir el CFrame actual de redBlock con un nuevo CFrameredBlock.CFrame = newCFrame
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.RedBlocklocal blueCube = workspace.BlueCube-- Crea un Vector3 para ambas la posición de inicio y la posición de destinolocal 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)
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.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
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.RedBlocklocal blueCube = workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
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.RedBlocklocal blueCube = workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)
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.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
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
- Apunte la superficie frontal frente , marcada por el círculo blanco, en el objetivo.
- Gira el CFrame para hacer que la superficie superior tenga la marca del círculo negro, apunte hacia el objetivo.
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCube-- Crear un Vector3 para la posición objetivolocal 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 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)
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.RedBlocklocal greenCube = workspace.GreenCubelocal cyanCube = workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)