Pose
*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.
Eine Pose hält das CFrame , das auf den Motor6D angewendet wird, der mit seinem zugeordneten BasePart verbunden ist. Das Teil, das kontrolliert wird, hängt vom Namen der Pose ab.
Poses sind die grundlegenden Bausteine der Animationen und, mit Keyframes, bestehen KeyframeSequences.
Posen, Verbindungen und Hierarchien
Obwohl ein Pose einem BasePart durch seinen Namen zugewiesen ist, ist das Objekt, das während der Animation gespielt wird, tatsächlich das Motor6D , das mit diesem Teil verbunden ist. Animation Rigs verzweigen sich von der Wurzel des Modells durch solche Verzahnungen.
In einem R15-Charakter-Rig ist der Wurzelbereich die HumanoidRootPart. Der Untertorso wird mit dem HumanoidRootPart durch den Motor namens 'Root' verbunden. Daher würde der CFrame des Pose-Namens 'LowerTorso' in einem Keyframe angewendet, und nicht der Wurzelbereich selbst.
Posen werden in einem Keyframe basierend auf gemeinsamer Hierarchie zusammengestellt. Dies bedeutet, dass die Pose's CFrame auf den Motor angewendet wird, der mit der Pose verbunden ist. Siehe unten für ein visuelles Beispiel der Struktur der Posen auf einem R15-Charakter.
CFrame anlegen
Das Roblox-Animationssystem wendet Pose.CFrame auf das entsprechende Motor6D an, indem die relative Transformation des Motors manipuliert wird, die Motor6D.Transform Eigenschaften. Die ursprünglichen 1> Class.JointInstance
Code-Beispiele
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
Zusammenfassung
Eigenschaften
Dies gilt für das CFrame mit dem entsprechenden Motor6D und Pose, wenn der 2>Class.Motor6D.Transform2> geändert wird.
Die Entspannungsrichtung, die verwendet wird, um den nächsten Pose-Wert zu erreichen.
Der Stil der Linderung, der verwendet wird, um den nächsten Pose-Wert zu erreichen.
Methoden
Eigenschaften
CFrame
Dieser CFrame gilt für den Motor6D , der mit dem Pose übereinstimmt, wenn der 1>Class.Motor6D.Transform1> geändert wird. Die ursprünglichen 4>Class.Motor6D.C04> und
Pose Objekte sind in einem Keyframe basierend auf einer gemeinsamen Hierarchie. Dies bedeutet, dass das Pose.CFrame auf das Motor angewendet wird, der mit dem Teil, der mit der Pose verbunden ist, auf das übergeordnetes Teilangewendet wird.
Methoden
AddSubPose
Fügt einem Pose-Sub das Sub Pose hinzu, indem es das Sub in das Instance.Parent übergeordnet setzt. Es ist funktional identisch, das neue Pose's 2>Class.Instance.Parent2> an das Pose zu setzen.
Beachten Sie, dass diese Funktion nicht fehlerhaft ist, wenn eine Instanz andere als eine Pose als Pose-Parameter gegeben wird und sie erfolgreich übergeordnet wird.
Parameter
Rückgaben
Code-Beispiele
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
Rückgibt ein Array, das alle Sub Poses enthält, die zu einem Pose hinzugefügt wurden. Dies ist funktionell dasselbe als die Verwendung der Funktion Class.Instance:GetChildren() auf dem 2>Class.Pose2> .
Beachte: Diese Funktion gibt alle Kinder der Pose zurück, einschließlich nicht Pose , wenn vorhanden Instances .
Rückgaben
Ein Array von sub Poses .
Code-Beispiele
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
Entfernt ein sub Pose von dem Pose durch das Elternteilen, um es auf null zu setzen. Dies ist funktional identisch mit dem Einstellen des neuen Poses Instance.Parent auf null.
Beachte: Wenn ein Instance anders als Pose als Class.Pose-Parameter verwendet wird, entfernt diese Funktion diesen Pose und bietet keinen Fehler.
Parameter
Rückgaben
Code-Beispiele
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