Issue with ik animations (I'm new to it)

So, I’m making a spider and for some reason the leg keeps going to its default position.

local function Reach(CurrentJoint: BasePart, EndJoint:BasePart, Arm:BasePart)
	local Distance = (EndJoint.Position - CurrentJoint.Position).Magnitude
	local ArmLength = Arm.Size.Z
	if CurrentJoint.Name == "1" then
		Joints[1].Position = script.Parent["Back Right Leg"].WorldCFrame.Position
	end
	CurrentJoint.CFrame = CFrame.lookAt(CurrentJoint.Position, EndJoint.Position)
	CurrentJoint.CFrame *= CFrame.new(-Vector3.zAxis * (Distance - ArmLength))
	
	Arm.CFrame = CFrame.lookAt(CurrentJoint.Position, EndJoint.Position)
	Arm.CFrame *= CFrame.new(-Vector3.zAxis * (ArmLength/2))
	Joints[1].Position = script.Parent["Back Right Leg"].WorldCFrame.Position
	Torso.Position = Torso.Position
end

function RayCast(Origin: Vector3, Direction: Vector3, Ignore: {Instance})
	local Raycast = workspace:Raycast(Origin, Direction, RaycastParams.new())
	if Raycast then
		if table.find(Ignore, Raycast.Instance) then
			Raycast = RayCast(Raycast.Position, Direction, Ignore)
		end
	end
	return Raycast
end


RunService.Heartbeat:Connect(function(deltaTime: number)
	if (Target.Position - Torso["Back Right Leg"].Relax.WorldCFrame.Position).Magnitude > 10 or (Target.Position - Model["Back Right Leg"].Joints["3"].Position).Magnitude > 5 and moving == false then
		local Cast = RayCast(Torso["Back Right Leg"].Relax.WorldCFrame.Position,Vector3.new(0,-15,0),Model:GetDescendants())
		if Cast.Instance then
			local Tween = TweenService:Create(Target,TweenInfo.new(.25),{Position = Cast.Position + Vector3.new(0,5,0)})
			Tween:Play()
		else
			local Tween = TweenService:Create(Target,TweenInfo.new(.25),{Position = Torso["Back Right Leg"].Relax.WorldCFrame.Position + Vector3.new(0,-5,0)})
			Tween:Play()
		end
		wait(.15)
		if Cast.Instance then
			TweenService:Create(Target,TweenInfo.new(.25),{Position = Cast.Position}):Play()
		else
			TweenService:Create(Target,TweenInfo.new(.25),{Torso["Back Right Leg"].Relax.WorldCFrame.Position - Vector3.new(0,-15,0)}):Play()
		end
		wait(.25)
	end
	if (Target.Position - LastPos).Magnitude < .1 and (Joints[1].Position - LastPos2).Magnitude < .1 then return end
	
	LastPos = Target.Position
	Torso.Position = Torso.Position
	local EndJoint = Joints[#Joints]
	local RootJoint = Joints[1]
	
	
	EndJoint.Position = Target.Position + Vector3.new(0,10,0)
	for i = #Joints - 1, 1, -1 do
		Reach(Joints[i], Joints[i + 1], Arms[i])
	end
	EndJoint.Position = Target.Position
	for i = #Joints - 1, 1, -1 do
		Reach(Joints[i], Joints[i + 1], Arms[i])
	end
	
	
	RootJoint.Position = script.Parent["Back Right Leg"].WorldCFrame.Position
	Torso.Position = Torso.Position
	for i = 2, #Joints do
		Reach(Joints[i], Joints[i - 1], Arms[i - 1])
	end
end)

whats happening


it is breaking left, right and center so I have no idea whats going on.

fixed

new code: (turns out the moving variable was not being used at all :confused:

local RunService = game:GetService('RunService')

local Model = script.Parent.Parent
local Torso = script.Parent
local Target = workspace.Target

local LastPos = Target.Position
local MaxLeg = 3

local TweenService = game:GetService("TweenService")
local moving = false

local Joints = {}
local Arms = {}

for _, joint in pairs(Model["Back Right Leg"].Joints:GetChildren()) do
	Joints[tonumber(joint.Name)] = joint
end

for _, arm in pairs(Model["Back Right Leg"].Arms:GetChildren()) do
	Arms[tonumber(arm.Name)] = arm
end

local LastPos2 = Joints[1].Position

local function Reach(CurrentJoint: BasePart, EndJoint:BasePart, Arm:BasePart)
	local Distance = (EndJoint.Position - CurrentJoint.Position).Magnitude
	local ArmLength = Arm.Size.Z
	
	CurrentJoint.CFrame = CFrame.lookAt(CurrentJoint.Position, EndJoint.Position)
	CurrentJoint.CFrame *= CFrame.new(-Vector3.zAxis * (Distance - ArmLength))
	
	if CurrentJoint.Name == "1" or EndJoint.Name == "1" then
		Joints[1].Position = script.Parent["Back Right Leg"].WorldCFrame.Position
	end
	Arm.CFrame = CFrame.lookAt(CurrentJoint.Position, EndJoint.Position)
	Arm.CFrame *= CFrame.new(-Vector3.zAxis * (ArmLength/2))
	Joints[1].Position = script.Parent["Back Right Leg"].WorldCFrame.Position
	Torso.Position = Torso.Position
end

function RayCast(Origin: Vector3, Direction: Vector3, Ignore: {Instance})
	local Raycast = workspace:Raycast(Origin, Direction, RaycastParams.new())
	if Raycast then
		if table.find(Ignore, Raycast.Instance) then
			Raycast = RayCast(Raycast.Position, Direction, Ignore)
		end
	end
	return Raycast
end


RunService.Heartbeat:Connect(function(deltaTime: number)
	Torso.Position = Torso.Position + Vector3.new(-.1,0,0)
	if (Target.Position - Torso["Back Right Leg"].Relax.WorldCFrame.Position).Magnitude > 10 or (Target.Position - Model["Back Right Leg"].Joints["3"].Position).Magnitude > 5 and moving == false then
		spawn(function()
			moving = true
			local Cast = RayCast(Torso["Back Right Leg"].Relax.WorldCFrame.Position,Vector3.new(0,-15,0),Model:GetDescendants())
			if Cast.Instance then
				local Tween = TweenService:Create(Target,TweenInfo.new(.25),{Position = Cast.Position + Vector3.new(0,5,0)})
				Tween:Play()
			else
				local Tween = TweenService:Create(Target,TweenInfo.new(.25),{Position = Torso["Back Right Leg"].Relax.WorldCFrame.Position + Vector3.new(0,-5,0)})
				Tween:Play()
			end
			wait(.15)
			if Cast.Instance then
				TweenService:Create(Target,TweenInfo.new(.25),{Position = Cast.Position}):Play()
			else
				TweenService:Create(Target,TweenInfo.new(.25),{Torso["Back Right Leg"].Relax.WorldCFrame.Position - Vector3.new(0,-15,0)}):Play()
			end
			wait(.25)
			spawn(function()
				wait(.25)
				moving = false
			end)
		end)
	end
	if (Target.Position - LastPos).Magnitude < .1 and (Joints[1].Position - LastPos2).Magnitude < .1 and (Joints[1].Position - Torso["Back Right Leg"].WorldCFrame.Position).Magnitude > 1 then  return end
	print("update")
	
	LastPos = Target.Position
	LastPos2 = Joints[1].Position
	
	local EndJoint = Joints[#Joints]
	local RootJoint = Joints[1]
	
	EndJoint.Position = Target.Position + Vector3.new(0,10,0)
	for i = #Joints - 1, 1, -1 do
		Reach(Joints[i], Joints[i + 1], Arms[i])
	end
	EndJoint.Position = Target.Position
	for i = #Joints - 1, 1, -1 do
		Reach(Joints[i], Joints[i + 1], Arms[i])
	end
	
	
	RootJoint.Position = script.Parent["Back Right Leg"].WorldCFrame.Position
	Torso.Position = Torso.Position
	for i = 2, #Joints do
		Reach(Joints[i], Joints[i - 1], Arms[i - 1])
	end
end)

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.