CFormes

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

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 CFrame
local newCFrame = CFrame.new(-2, 2, 4)
-- Écraser la CFrame actuelle de redBlock avec une nouvelle CFrame
redBlock.CFrame = newCFrame
Avant
Après

Alternativement, vous pouvez fournir une nouvelle position Vector3 à CFrame.new() et obtenir le même resultats:


local redBlock = workspace.RedBlock
-- Créer un nouveau CFrame
local newVector3 = Vector3.new(-2, 2, 4)
local newCFrame = CFrame.new(newVector3)
-- Écraser la CFrame actuelle de redBlock avec une nouvelle CFrame
redBlock.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 CFrame
redBlock.CFrame = newCFrame
Avant
Après

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.RedBlock
local blueCube = workspace.BlueCube
-- Créer un Vector3 pour la position de départ et la position cible
local 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)
Avant
Après

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.RedBlock
redBlock.CFrame = CFrame.new(redBlock.Position) + Vector3.new(0, 1.25, 0)
Avant
Après

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.RedBlock
local blueCube = workspace.BlueCube
redBlock.CFrame = CFrame.new(blueCube.Position) + Vector3.new(0, 2, 0)
Avant
Après

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.RedBlock
local blueCube = workspace.BlueCube
local offsetCFrame = CFrame.new(0, 2, 0)
redBlock.CFrame = blueCube.CFrame:ToWorldSpace(offsetCFrame)
Avant
Après

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.RedBlock
local rotatedCFrame = CFrame.Angles(0, math.rad(70), math.rad(20))
redBlock.CFrame = redBlock.CFrame:ToWorldSpace(rotatedCFrame)
Avant
Après

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

  1. Pointez la surface de devant , marquée par le cercle blanc, sur la cible.
  2. Pivoter le CFrame pour faire la surface de haut , marquée par le cercle noir, pointée vers la cible.

local redBlock = workspace.RedBlock
local blueCube = workspace.BlueCube
-- Créer un Vector3 pour la position cible
local 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 cible
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)
Avant
Après

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.RedBlock
local greenCube = workspace.GreenCube
local cyanCube = workspace.CyanCube
redBlock.CFrame = greenCube.CFrame:Lerp(cyanCube.CFrame, 0.7)
Avant
Après