Un CFrame , abrégé pour Cadre de coordonnées 3D , est un type de données utilisé pour tourner et positionner des objets 3D.En tant que propriété d'objet ou en tant qu'unité autonome, un CFrame contient les coordonnées globales x-, y-, et z- ainsi que les données de rotation pour chaque axe.En outre, CFrames contiennent des fonctions utiles pour travailler avec des objets dans l'espace 3D.
Quelques exemples d'applications CFrame dans un jeu pourraient être :
- Trouver un point cible lointain pour un projectile, comme la position d'un ennemi visé par le laser d'un joueur.
- Déplacer la caméra afin qu'elle se focalise sur des PNJ spécifiques lorsqu'un joueur interagit avec eux.
- Placer un indicateur de statut directement au-dessus de la tête d'un joueur pour montrer s'il est paralysé, boosté, empoisonné, etc.
Base de CFrame
Positionner un CFrame
Vous pouvez créer un vide CFrame à la position par défaut de (0, 0, 0) en utilisant CFrame.new().Pour positionner un CFrame à un point spécifique, fournissez des coordonnées x-, y- et z- comme arguments à CFrame.new() .Dans l'exemple suivant, les propriétés de la partie redBlock de la partie CFrame changent en newCFrame, les répositionnant à (-2, 2, 4).
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Créer un nouveau CFramelocal newCFrame = CFrame.new(-2, 2, 4)-- Écraser le CFrame actuel de redBlock par un nouveau CFrameredBlock.CFrame = newCFrame


Alternativement, vous pouvez fournir une nouvelle position Vector3 à CFrame.new() et obtenir le même resultats:
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Créer un nouveau CFramelocal newVector3 = Vector3.new(-2, 2, 4)local newCFrame = CFrame.new(newVector3)-- Écraser le CFrame actuel de redBlock par un nouveau CFrameredBlock.CFrame = newCFrame
Faire pivoter un CFrame
Pour créer un rotatif CFrame, utilisez le constructeur CFrame.Angles(), en fournissant un angle de rotation en radians pour les axes souhaités.Les paramètres à CFrame.Angles() sont en radians, pas en degrés.Si vous préférez les degrés, utilisez math.rad() pour convertir les degrés en radians.Dans l'exemple suivant, la partie redBlock tourne de 45 degrés vers la gauche sur son axe y.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlock-- Créer un nouveau CFrame rotatiflocal newCFrame = CFrame.Angles(0, math.rad(45), 0)-- Écraser le CFrame actuel de redBlock par un nouveau CFrameredBlock.CFrame = newCFrame


Face à un CFrame vers un point
Vous pouvez utiliser CFrame.new() pour orienter la surface frontale d'un CFrame à un point spécifique du monde.Dans l'exemple suivant, redBlock les positions des parties à (0, 3, 0) et pointe sa surface avant, marquée par le cercle blanc, à la partie blueCube.
local Workspace = game:GetService("Workspace")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-- Placez le bloc rouge à 'startPosition' et pointez sa surface frontale à 'targetPosition'redBlock.CFrame = CFrame.new(startPosition, targetPosition)


Décaler un CFrame
Pour compenser un objet par un nombre spécifique de studs de sa position actuelle, ajoutez ou soustrayez un Vector3 à ou de une nouvelle CFrame à la position de l'objet.Pour obtenir une position Vector3 correctement formatée d'un objet à utiliser avec CFrame.new() , comme on le voit ici, sa propriété Position ( redBlock.Position ) est un raccourci pratique.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlockredBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)


Vous pouvez utiliser la même technique pour compenser un objet à partir 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 Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal blueCube = Workspace.BlueCuberedBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)


Orientation CFrame dynamique
Les constructeurs CFrame.new() et CFrame.Angles() répositionnent ou tournent un objet à une orientation spécifique dans le monde, mais vous ne pouvez pas toujours compter sur une position et un angle de rotation fixes dans le monde.Par exemple :
- Placer un trésor flottant directement devant un joueur qui peut se trouver n'importe où dans le monde, face à n'importe quelle direction.
- Faire apparaître un génie magique directement au-dessus du épaule droite d'un joueur.
Dans ces cas, utilisez les méthodes CFrame au lieu de leurs constructeurs.
Position relative
La fonction CFrame:ToWorldSpace() transforme l'orientation d'un objet CFrame — en respectant son orientation locale — en une nouvelle orientation monde .Cela le rend idéal pour compenser une partie par rapport à elle-même ou à un autre objet, indépendamment de la manière dont elle est actuellement positionnée/rotée.
Dans l'exemple suivant, la partie redBlock décalée de 2 studs par rapport à l'axe y du cube bleu (la flèche verte qui le traverse) et pas par rapport à l'axe y global qui pointe vers le haut.
local Workspace = game:GetService("Workspace")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 de 70 degrés vers la gauche sur son axe y et de 20 degrés vers la droite sur son axe 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)


Face à une surface spécifique vers un point
Vous pouvez faire face à l'avant d'un objet à un autre objet en fournissant un point Vector3 comme deuxième paramètre de CFrame.new().Vous pouvez également utiliser une rotation relative pour faire en sorte que n'importe quel visage de l'objet pointe vers un point Vector3.L'exemple suivant effectue deux opérations consécutives CFrame :
- Pointez la surface avant front marquée par le cercle blanc, à la cible.
- Faites pivoter le CFrame pour faire en sorte que la surface supérieure , marquée par le cercle noir, pointe vers la cible
local Workspace = game:GetService("Workspace")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 cadre rouge 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)


Trouver un point entre des points
Vous pouvez utiliser l'interpolation linéaire ou lerp pour positionner un entre deux points.Dans l'exemple suivant, la partie redBlock répositionne entre les parties greenCube et cyanCube.La valeur de 0.7 la place à 70% de la distance du cube vert.
local Workspace = game:GetService("Workspace")local redBlock = Workspace.RedBlocklocal greenCube = Workspace.GreenCubelocal cyanCube = Workspace.CyanCuberedBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)

