Un CFrame, court pour cadre de coordination, est un type de données utilisé pour faire pivoter et positionner les objets 3D. En tant que propriété d'objet ou d'unité autonome, un CFrame contient des coordonnées globales x-, y- et z- ainsi que des données de
Certains exemples d'applications CFrame dans un jeu peuvent être :
- Rechercher un point de cible éloigné pour un projectile, comme la position d'un ennemi ciblé par le laser d'un joueur.
- Déplacer la caméra pour qu'elle se place sur des NPC spécifiques pendant que le joueur interagit avec eux.
- Placer un indicateur de statut directement au-dessus d'une tête de joueur pour montrer s'ils sont paralysés, boostés, empoisonnés, etc.
CFrame Basics
Positionner un CFrame
Vous pouvez créer un CFrame à l'emplacement par défaut de (0, 0, 0) en utilisant Datatype.CFrame
local redBlock = workspace.RedBlock-- Créer un nouveau CFramelocal newCFrame = CFrame.new(-2, 2, 4)-- Écraser la CFrame actuelle de redBlock avec une nouvelle CFrameredBlock.CFrame = newCFrame
Alternativement, vous pouvez fournir une nouvelle position Vector3 à CFrame.new() et obtenir le même resultats:
local redBlock = workspace.RedBlock-- Créer un nouveau CFramelocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- Écraser la CFrame actuelle de redBlock avec une nouvelle CFrameredBlock.CFrame = newCFrame
Rotation d'un CFrame
Pour créer un CFrame pivoté, utilisez le constructeur CFrame.Angles(), qui fournit un angle de rotation en radians pour les axes souhaités. Les paramètres à CFrame.Angles()
local redBlock = workspace.RedBlock-- Créer un nouveau CFrame pivotélocal newCFrame = CFrame.Angles(0, math.rad(45), 0)-- Écraser la CFrame actuelle de redBlock avec une nouvelle CFrameredBlock.CFrame = newCFrame
Visage vers un point
Vous pouvez utiliser CFrame.new() pour poindre la surface avant d'un CFrame à un point spécifique dans le monde. Dans l'exemple suivant, les positions de redBlock dans la partie 1> Datatype.CFrame1> sont à (0, 3, 0) et indiquent sa surface avant, marquée par le cer
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCube-- Créer un Vector3 pour la position de départ et la position ciblelocal startPosition = Vector3.new(0, 3, 0)local targetPosition = blueCube.Position-- Mettez le bloc rouge à « startPosition » et pointez sa surface avant à « targetPosition »redBlock.CFrame = CFrame.new(startPosition, targetPosition)
Désactivé un CFrame
Pour compenser un objet par un nombre spécifique de studs de sa position actuelle, ajouter ou soustraire un Vector3 à ou depuis un nouveau CFrame à la position de l'objet.
local redBlock = workspace.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
Vous pouvez utiliser la même technique pour déplacer un objet de la position d'un autre objet. Dans l'exemple suivant, un Vector3 ajoute à un nouveau CFrame créé à la position du cube bleu au lieu de la position du bloc.
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
Orientation dynamique CFrame
Les CFrame.new() et CFrame.Angles() constructeurs réPositionner ou tourner un objet dans une orientation spécifique dans le monde, mais vous ne pouvez pas toujours compter sur un angle de rotation et une position fixe dans le monde. Par exemple :
- Placer un trésor flottant directement devant un joueur qui peut être debout n'importe où dans le monde, face à n'importe quelle direction.
- Faire apparaître un génie magique directement au-dessus de l'épaule droite d'un joueur.
Dans ces cas, utilisez les méthodes CFrame au lieu de leurs constructeurs.
Position relative
La fonction Datatype.CFrame:ToWorldSpace() transforme un objet en Datatype.CFrame — en respectant son propre orientation locale — en un nouveau 1> monde1> orienté. Cela rend idéal pour décalquer une partie par rapport à elle-même ou à un autre objet, indépendamment de la façon dont il est actuellement positionné/rotaté.
Dans l'exemple suivant, le redBlock décalage de partie décalage 2 studs par rapport à l'axe y du cube bleu (la flèche verte qui le pointe) et pas par rapport à l'axe global pointé directement vers le haut.
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCubelocal offsetCFrame = CFrame.new(0, 2, 0)redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)
Rotation relative
Vous pouvez également utiliser CFrame:ToWorldSpace() pour faire pivoter un objet par rapport à lui-même. Dans l'exemple suivant, la partie redBlock tourne 70 degrés à l'envers sur son axe y et 20 degrés à l'envers sur son axe z.
local redBlock = workspace.RedBlocklocal rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
Affronter une surface spécifique vers un point
Vous pouvez faire la face avant d'un objet face à un autre objet en fournissant un point Vector3 comme deuxième paramètre de CFrame.new() . Vous pouvez également utiliser la rotation relative pour faire en sorte que n'importe quelle face de l'objet point vers un point Vector3. L'exemple suivant effectue deux opérations de
- Pointez la surface de devant , marquée par le cercle blanc, sur la cible.
- Pivoter le CFrame pour faire la surface de haut , marquée par le cercle noir, pointée vers la cible.
local redBlock = workspace.RedBlocklocal blueCube = workspace.BlueCube-- Créer un Vector3 pour la position ciblelocal targetPosition = blueCube.Position-- Pointez la surface avant du bloc rouge à « targetPosition »redBlock.CFrame = CFrame.new(redBlock.Position, targetPosition)-- Maintenant, la surface avant du bloc rouge (cercle blanc) pointe vers le blueCube-- Faire pivoter le CFrame de redBlock par rapport à lui-même afin que sa surface supérieure (non frontale) pointe vers la ciblelocal 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)
Rechercher un point entre les points
Vous pouvez utiliser l'interpolation linéaire , ou lerp , pour positionner un CFrame entre deux points. Dans l'exemple suivant, la partie 1> redBlock1> se déplace entre les parties 4> greenCube
local redBlock = workspace.RedBlocklocal greenCube = workspace.GreenCubelocal cyanCube = workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)