Pose
*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.
Une posture contient le CFrame appliqué au Motor6D connecté à son socle BasePart. La partie qui est contrôlée dépend du nom de la posture.
Les poses sont les blocs de construction de base des animations et, avec Keyframes, forment KeyframeSequences.
Poses, jointures et hiérarchie
Bien qu'une posture soit attribuée à un BasePart par nom, l'objet manipulé pendant la lecture d'animation est en fait le Motor6D connecté à cette partie. Les scripts d'animation se branchent à partir de la racine du modèlisationà travers ces jointures.
Dans un R15 character plateforme, la partie racine est la HumanoidRootPart. Le Torse inférieur est connecté à la partie racine par le moteur nommé « 根 »。 因此, CFrame 的 Pose nommé « LowerTorso » dans un Keyframe serait appliqué à la partie moteur nommée « 根»,而 non pas à la partie racine elle-même。
Les poses sont organisées dans un Keyframe basé sur la hiérarchie jointe. Cela signifie que la position CFrame de la position est appliquée au moteur qui connecte la partie associée à la position à la partie associée à la position de son parent. Voir ci-dessous pour un exemple visuel de la structure des poses sur un personnage R15.
Pose CFrame
Le système d'animation Roblox applique Pose.CFrame à l'équivalant de Motor6D en manipulant la transformation relative du moteur, la propriété Motor6D.Transform. Les valeurs d'origine 1> Class.JointInstance.C1|C0
Échantillons de code
local function generateKeyframe(model)
if not model.PrimaryPart then
warn("No primary part set")
return
end
local rootPart = model.PrimaryPart:GetRootPart()
if not rootPart then
warn("Root part not found")
return
end
local partsAdded = {}
partsAdded[rootPart] = true
local function addPoses(part, parentPose)
-- get all of the joints attached to the part
for _, joint in pairs(part:GetJoints()) do
-- we're only interested in Motor6Ds
if joint:IsA("Motor6D") then
-- find the connected part
local connectedPart = nil
if joint.Part0 == part then
connectedPart = joint.Part1
elseif joint.Part1 == part then
connectedPart = joint.Part0
end
if connectedPart then
-- make sure we haven't already added this part
if not partsAdded[connectedPart] then
partsAdded[connectedPart] = true
-- create a pose
local pose = Instance.new("Pose")
pose.Name = connectedPart.Name
parentPose:AddSubPose(pose)
-- recurse
addPoses(connectedPart, pose)
end
end
end
end
end
local keyframe = Instance.new("Keyframe")
-- populate the keyframe
local rootPose = Instance.new("Pose")
rootPose.Name = rootPart.Name
addPoses(rootPart, rootPose)
keyframe:AddPose(rootPose)
return keyframe
end
local character = script.Parent
local keyframe = generateKeyframe(character)
print(keyframe)
local function resetPoses(parent)
-- both functions are equivalent to GetChildren
local poses = parent:IsA("Keyframe") and parent:GetPoses() or parent:IsA("Pose") and parent:GetSubPoses()
for _, pose in pairs(poses) do
if pose:IsA("Pose") then
pose.CFrame = CFrame.new()
-- recurse
resetPoses(pose)
end
end
end
Résumé
Propriétés
Ceci CFrame s'applique à la Motor6D correspondant avec le Pose lorsque le 1> Class.Motor6D.Transform1> est changé.
La direction d'atténuation à utiliser pour atteindre la valeur de la prochaine posture.
Le style de facilitation à utiliser pour atteindre la valeur de la prochaine posture.
Méthodes
Propriétés
CFrame
Ceci CFrame s'applique à la Motor6D correspondant avec le Pose lorsque le 1> Class.Motor6D.Transform1> est changé. Les valeurs 4> Class.Motor6D
Pose objets sont rangés dans un Keyframe basé sur la hiérarchie jointe. Cela signifie que le Pose.CFrame est appliqué au moteur connectant la partie associée à la position à la partie associée à la position de la parent.
Méthodes
AddSubPose
Ajoute un sub Pose à la position Pose par le biais de son parent. Il est fonctionnellement identique à la définition du nouvel emplacement de la position Instance.Parent à la position.
Remarquez que cette fonction ne se produira pas d'erreur lorsqu'une instance autre qu'une Pose sera donnée comme paramètre de pose et le parentera avec succès.
Paramètres
Retours
Échantillons de code
local keyframe = Instance.new("Keyframe")
keyframe.Parent = workspace
local pose = Instance.new("Pose")
pose.EasingStyle = Enum.PoseEasingStyle.Cubic
pose.EasingDirection = Enum.PoseEasingDirection.Out
local pose2 = Instance.new("Pose")
pose2.EasingStyle = Enum.PoseEasingStyle.Cubic
pose2.EasingDirection = Enum.PoseEasingDirection.Out
keyframe:AddPose(pose) -- pose.Parent = keyframe
task.wait(2)
keyframe:RemovePose(pose) -- pose.Parent = nil
task.wait(2)
keyframe:AddPose(pose) -- pose.Parent = keyframe
task.wait(2)
pose:AddSubPose(pose2) -- pose2.Parent = pose
task.wait(2)
pose:RemoveSubPose(pose2) -- pose2.Parent = nil
GetSubPoses
Retourne un tableau contenant tous les sub Poses qui ont été ajoutés à un Pose . Ce est fonctionnellement la même chose que d'utiliser la fonction Instance:GetChildren() sur le 1> Class.Pose1> .
Remarque : cette fonction renvoie tous les enfants de la Pose, y compris les non Pose, et Instances si nécessaire.
Retours
Un tableau de sous- Poses .
Échantillons de code
local function resetPoses(parent)
-- both functions are equivalent to GetChildren
local poses = parent:IsA("Keyframe") and parent:GetPoses() or parent:IsA("Pose") and parent:GetSubPoses()
for _, pose in pairs(poses) do
if pose:IsA("Pose") then
pose.CFrame = CFrame.new()
-- recurse
resetPoses(pose)
end
end
end
RemoveSubPose
Supprime un sub Pose du Pose par le biais de sa parenté zéro. Ceci est fonctionnellement identique à la définition de la nouvelle posture de Instance.Parent à zéro.
Remarque : Si un Instance autre que Pose est utilisé comme un Pose paramètre, cette fonction supprime que 2>Class.Instance2> et ne fournit pas d'erreur.
Paramètres
Retours
Échantillons de code
local keyframe = Instance.new("Keyframe")
keyframe.Parent = workspace
local pose = Instance.new("Pose")
pose.EasingStyle = Enum.PoseEasingStyle.Cubic
pose.EasingDirection = Enum.PoseEasingDirection.Out
local pose2 = Instance.new("Pose")
pose2.EasingStyle = Enum.PoseEasingStyle.Cubic
pose2.EasingDirection = Enum.PoseEasingDirection.Out
keyframe:AddPose(pose) -- pose.Parent = keyframe
task.wait(2)
keyframe:RemovePose(pose) -- pose.Parent = nil
task.wait(2)
keyframe:AddPose(pose) -- pose.Parent = keyframe
task.wait(2)
pose:AddSubPose(pose2) -- pose2.Parent = pose
task.wait(2)
pose:RemoveSubPose(pose2) -- pose2.Parent = nil