# r15 mirror

Mar 24th, 2020 (edited)
103
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. -- Table containing the paired names of the body parts, NOT the names of the joints
2. local bodyPartPairs = {
4. {"UpperTorso"},
5. {"LowerTorso"},
6. {"LeftUpperArm", "RightUpperArm"},
7. {"LeftLowerArm", "RightLowerArm"},
8. {"LeftHand", "RightHand"},
9. {"LeftUpperLeg", "RightUpperLeg"},
10. {"LeftLowerLeg", "RightLowerLeg"},
11. {"LeftFoot", "RightFoot"}
12. }
13.
14. -- Private
15. function MirrorPoseCFrame(cf)
16. local x, y, z, R00, R01, R02, R10, R11, R12, R20, R21, R22 = cf:components()
17. x = -x
18. -- R00, R10, R20 (x)
19. R10 = -R10
20. R20 = -R20
21. -- R01, R11, R21 (y)
22. R01 = -R01
23. -- R02, R12, R22 (z)
24. R02 = -R02
25.
26. return CFrame.new(x, y, z, R00, R01, R02, R10, R11, R12, R20, R21, R22)
27. end
28.
29. function GetKeyframeSequenceLength(keyframeSequence)
30. local keyframes = keyframeSequence:GetChildren()
31. local max = keyframes[1].Time
32. for i, v in pairs(keyframes) do
33. if v.Time > max then
34. max = v.Time
35. end
36. end
37. return max
38. end
39.
40. function MirrorKeyframe(keyframe)
41. for i, v in pairs(bodyPartPairs) do
42. if #v == 1 then
43. local pose = keyframe:FindFirstChild(v[1], true)
44. if pose then
45. pose.CFrame = MirrorPoseCFrame(pose.CFrame)
46. end
47. elseif #v == 2 then
48. local leftName = v[1]
49. local rightName = v[2]
50. local leftPose = keyframe:FindFirstChild(leftName, true)
51. local rightPose = keyframe:FindFirstChild(rightName, true)
52. if leftPose and rightPose then
53. leftPose.Name = rightName
54. rightPose.Name = leftName
55. leftPose.CFrame = MirrorPoseCFrame(leftPose.CFrame)
56. rightPose.CFrame = MirrorPoseCFrame(rightPose.CFrame)
57. elseif leftPose then
58. leftPose.Name = rightName
59. leftPose.CFrame = MirrorPoseCFrame(leftPose.CFrame)
60. elseif rightPose then
61. rightPose.Name = leftName
62. rightPose.CFrame = MirrorPoseCFrame(rightPose.CFrame)
63. end
64. end
65. end
66. end
67.
68. -- Public
69. -- Precondition: ONLY Keyframes to be flipped are in the KeyframeSequence
70. -- Postcondition: The Keyframes are flipped and appended to the end of the KeyframeSequence
71. local MIRROR_GAP = 0.1667 -- how far apart the unmirrored and mirrored parts are
72. function SymmetricKeyframeSequence(keyframeSequence)
73. local length = GetKeyframeSequenceLength(keyframeSequence)
74. for i, v in pairs(keyframeSequence:GetChildren()) do
75. local keyframeClone = v:Clone()
76. keyframeClone.Name = v.Name .. "_mirrored"
77. keyframeClone.Time = length + keyframeClone.Time + MIRROR_GAP
78. MirrorKeyframe(keyframeClone)
79. keyframeClone.Parent = keyframeSequence
80. end
81. end
82.
83. local dummy = game.Workspace.Player1
84. local animSaves = dummy.AnimSaves
85. local keyframeSequenceOrig = animSaves["mirrortest"]
86. local keyframeSequenceClone = keyframeSequenceOrig:Clone()
87. SymmetricKeyframeSequence(keyframeSequenceClone)
88. keyframeSequenceClone.Name = keyframeSequenceOrig.Name .. "_symmetric"
89. keyframeSequenceClone.Parent = animSaves
RAW Paste Data