Pose
*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.
Sebuah Pose mengandung CFrame yang diterapkan pada Motor6D yang terhubung ke BasePart nya. Bagian yang dikendalikan bergantung pada nama Pose.
Poses adalah blok pembangunan dasar animasi dan, dengan Keyframes , membuat KeyframeSequences .
Pos, join, dan hierarki
Meskipun Pose ditetapkan ke Class.BasePart dengan nama, objek yang dimanipulasi selama playback animasi sebenarnya adalah BasePart yang terhubung ke bagian ini. Rig animasi cabang dari bagian akar model melalui koneksi seperti ini.
Dalam R15 karakter rig, bagian akar adalah HumanoidRootPart. Bagian bawah tubuh terhubung ke HumanoidRootPart oleh motor bernama 'Root'. Oleh karena itu, CFrame dari Pose nama 'LowerTorso' di Class.Keyframe akan diterapkan ke motor bernama 'Root', bukan tubuh bawah itu sendiri.
Poses diatur dalam satu Keyframe berdasarkan hierarki bersama. Ini berarti, Pose's CFrame diterapkan ke motor yang menghubungkan bagian yang terkait dengan posisi ke bagian yang terkait dengan posisi's parent. Lihat di bawah ini untuk contoh visual dari struktur Poses pada karakter R15.
Tempatkan CFrame
Sistem animasi Roblox menerapkan Pose.CFrame kepada Class.Motor6D</Class.Motor6D> dengan menipu transformasi relatif motor, property Motor6D asli. Valori asli Class.JointInstance.C1|C0
Contoh Kode
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
Rangkuman
Properti
Ini CFrame berlaku untuk Motor6D yang sesuai dengan Pose ketika 1> Class.Motor6D.Transform1> diubah.
Arah mudah untuk digunakan untuk mencapai nilai Pose berikutnya.
Gaya penyederhanaan untuk digunakan untuk mencapai nilai Pose berikutnya.
Metode
Properti
CFrame
Ini CFrame berlaku untuk Motor6D yang sesuai dengan Pose ketika 1> Class.Motor6D.Transform1> diubah. Val asli 4> Class.Motor6D
Pose objek dibagi dalam satu Keyframe berdasarkan hierarki bersama. Ini berarti bahwa Pose.CFrame diterapkan ke motor yang menghubungkan bagian dengan posisi ke bagian yang dihubungkan dengan posisi orang tua.
Metode
AddSubPose
Menambahkan sub Pose ke Pose dengan menambahkannya ke dalam. Ini secara fungsional sama dengan menetapkan posisi baru Instance.Parent ke posisi.
Catatan, fungsi ini tidak akan mengalami kesalahan saat instansi selain Pose diberikan sebagai parameter posisi dan akan menjadikannya orang tua dengan sukses.
Parameter
Memberikan nilai
Contoh Kode
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
Mengembalikan array yang berisi semua sub Poses yang telah ditambahkan ke Pose . Ini secara fungsional sama dengan menggunakan fungsi Instance:GetChildren() di 1> Class.Pose1> .
Catatan: fungsi ini mengembalikan semua anak dari Pose, termasuk anak-anak non-Pose , jika ada.
Memberikan nilai
Sebuah matriks阵 sub Poses .
Contoh Kode
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
Menghapus sub Pose dari Pose dengan menetapkannya ke nol. Ini secara fungsional sama dengan menetapkan posisi baru Instance.Parent ke nol.
Catatan: Jika Instance selain Pose digunakan sebagai parameter Pose, fungsi ini menghapus bahwa 2>Class.Instance2> dan tidak menyediakan kesalahan.
Parameter
Memberikan nilai
Contoh Kode
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