It's difficult to explain. So I'll be using screenshots if that's fine.
Description: I've been making a dragon, fully animated and with a custom rigging. Though, it seems that the first wing being welded to the character displaces. Yet both the wing welding scripts are the same (Except for the Left/Right part) and the rigging is all fine too. Code paths fine as well. The weight is fine as well, because I sized the wings down earlier, and it had no effect.
What I've tried to fix it:
- Re-animating the entire rigging. (About 7 times)
- Re-rigging it (About 4 - 5 times)
- Sizing the wings down. (Followed by a re-animate & re-rigging)
- Re-doing/modifying some code
- Pasting it in a new place (In the hope it'd work...)
- Make the morph weld everything separately. (Walking on one button for each body piece)
All the above did not work. So I was hoping people would know how to fix it here.
What I found out:
- The first wing being welded to the character doesn't function correctly.
- The parts usually called 'Middle' are misplaced, together with the character's body parts the middles attach to.
- When I anchor any character's part, the misplaced objects all return to the right spot and the animation functions correctly. (This works best when anchoring the torso.) But after unchecking the anchor box, they all misplace again.
Screenshots and explanation: The Morph model: http://prntscr.com/9605k1 This is what the character should become. (Unanimated still)
After stepping on the button, the following parts/models are cloned into the character: http://prntscr.com/9605pe http://prntscr.com/9605sz Those will change the appearance of the character.
And this is how it looks when the torso is not anchored: http://prntscr.com/9605vc http://prntscr.com/9605xm
This is how it looks when the torso is anchored: http://prntscr.com/9605zv http://prntscr.com/960625
Some codes related to the issue: The Morphing script:
function onTouched(hit) if hit.Parent:findFirstChild("Humanoid") ~= nil and hit.Parent:findFirstChild("RightA1") == nil and hit.Parent:findFirstChild("RightA2") == nil and hit.Parent:findFirstChild("RightA3") == nil and hit.Parent:findFirstChild("LeftA1") == nil and hit.Parent:findFirstChild("LeftA2") == nil and hit.Parent:findFirstChild("LeftA3") == nil then -- Right Wings -- local g = script.Parent.Parent.RightA1:clone() g.Parent = hit.Parent local C = g:GetChildren() for i=1, #C do if C[i]:IsA("BasePart") then local W = Instance.new("Weld") W.Part0 = g.Middle W.Part1 = C[i] local CJ = CFrame.new(g.Middle.Position) local C0 = g.Middle.CFrame:inverse()*CJ local C1 = C[i].CFrame:inverse()*CJ W.C0 = C0 W.C1 = C1 W.Parent = g.Middle end local Y = Instance.new("Weld") Y.Part0 = hit.Parent["Right Arm"] Y.Part1 = g.Middle Y.C0 = CFrame.new(0, 0, 0) Y.Parent = Y.Part0 end local h = g:GetChildren() for i = 1, # h do if h[i]:IsA("BasePart") then h[i].Anchored = false h[i].CanCollide = false end end local g2 = script.Parent.Parent.RightA2:clone() g2.Parent = hit.Parent local C = g2:GetChildren() for i=1, #C do if C[i]:IsA("BasePart") then local W = Instance.new("Weld") W.Part0 = g2.Middle W.Part1 = C[i] local CJ = CFrame.new(g2.Middle.Position) local C0 = g2.Middle.CFrame:inverse()*CJ local C1 = C[i].CFrame:inverse()*CJ W.C0 = C0 W.C1 = C1 W.Parent = g2.Middle end local Y = Instance.new("Weld") Y.Part0 = hit.Parent["Right Arm 2"] Y.Part1 = g2.Middle Y.C0 = CFrame.new(0, 0, 0) Y.Parent = Y.Part0 end local h = g2:GetChildren() for i = 1, # h do if h[i]:IsA("BasePart") then h[i].Anchored = false h[i].CanCollide = false end end local g3 = script.Parent.Parent.RightA3:clone() g3.Parent = hit.Parent local C = g3:GetChildren() for i=1, #C do if C[i]:IsA("BasePart") then local W = Instance.new("Weld") W.Part0 = g3.Middle W.Part1 = C[i] local CJ = CFrame.new(g3.Middle.Position) local C0 = g3.Middle.CFrame:inverse()*CJ local C1 = C[i].CFrame:inverse()*CJ W.C0 = C0 W.C1 = C1 W.Parent = g3.Middle end local Y = Instance.new("Weld") Y.Part0 = hit.Parent["Right Arm 3"] Y.Part1 = g3.Middle Y.C0 = CFrame.new(0, 0, 0) Y.Parent = Y.Part0 end local h = g3:GetChildren() for i = 1, # h do if h[i]:IsA("BasePart") then h[i].Anchored = false h[i].CanCollide = false end end -- Left Wings -- local g4 = script.Parent.Parent.LeftA1:clone() g4.Parent = hit.Parent local C = g4:GetChildren() for i=1, #C do if C[i]:IsA("BasePart") then local W = Instance.new("Weld") W.Part0 = g4.Middle W.Part1 = C[i] local CJ = CFrame.new(g4.Middle.Position) local C0 = g4.Middle.CFrame:inverse()*CJ local C1 = C[i].CFrame:inverse()*CJ W.C0 = C0 W.C1 = C1 W.Parent = g4.Middle end local Y = Instance.new("Weld") Y.Part0 = hit.Parent["Left Arm"] Y.Part1 = g4.Middle Y.C0 = CFrame.new(0, 0, 0) Y.Parent = Y.Part0 end local h = g4:GetChildren() for i = 1, # h do if h[i]:IsA("BasePart") then h[i].Anchored = false h[i].CanCollide = false end end local g5 = script.Parent.Parent.LeftA2:clone() g5.Parent = hit.Parent local C = g5:GetChildren() for i=1, #C do if C[i]:IsA("BasePart") then local W = Instance.new("Weld") W.Part0 = g5.Middle W.Part1 = C[i] local CJ = CFrame.new(g5.Middle.Position) local C0 = g5.Middle.CFrame:inverse()*CJ local C1 = C[i].CFrame:inverse()*CJ W.C0 = C0 W.C1 = C1 W.Parent = g5.Middle end local Y = Instance.new("Weld") Y.Part0 = hit.Parent["Left Arm 2"] Y.Part1 = g5.Middle Y.C0 = CFrame.new(0, 0, 0) Y.Parent = Y.Part0 end local h = g5:GetChildren() for i = 1, # h do if h[i]:IsA("BasePart") then h[i].Anchored = false h[i].CanCollide = false end end local g6 = script.Parent.Parent.LeftA3:clone() g6.Parent = hit.Parent local C = g6:GetChildren() for i=1, #C do if C[i]:IsA("BasePart") then local W = Instance.new("Weld") W.Part0 = g6.Middle W.Part1 = C[i] local CJ = CFrame.new(g6.Middle.Position) local C0 = g6.Middle.CFrame:inverse()*CJ local C1 = C[i].CFrame:inverse()*CJ W.C0 = C0 W.C1 = C1 W.Parent = g6.Middle end local Y = Instance.new("Weld") Y.Part0 = hit.Parent["Left Arm 3"] Y.Part1 = g6.Middle Y.C0 = CFrame.new(0, 0, 0) Y.Parent = Y.Part0 end local h = g6:GetChildren() for i = 1, # h do if h[i]:IsA("BasePart") then h[i].Anchored = false h[i].CanCollide = false end end end end script.Parent.Touched:connect(onTouched)
Use Motor6D's with the character creator plugin which you must have a humanoidrootpart that links to every part then the animations should work.