Hi, we do support this. IKControls are NOT limited to R15 rigs, but work with ANY rig made out of parts+motors or bones.
The idea of detecting existing constraints from blender or other software is interesting, although the format and results would be different as the underlying solvers are. But I’ll have a look, thanks.
Hi, thanks for your report.
We are aware of the candy-wrap issue and working on it.
For the second issue, the “memory foam”, is because we don’t reset the pose between frames. We’re discussing exposing an option to do so. In the meantime, you can achieve the result by resetting your motors manually. Below a script.
Reset pose script
local function resetpose(character)
for _, obj in ipairs(character:GetDescendants()) do
if obj:IsA("Motor6D") then
obj.Transform = CFrame.new()
end
end
end
local function Update()
resetpose(script.Parent)
end
game:GetService("RunService").Stepped:Connect(Update)
When messing around with IKControls, I found a bug where using attachments as EndEffectors (when the Attachment is parented to the ChainRoot) would send the ChainRoot to NaN. This can be reproduced by setting the ChainRoot to R6.Left Arm and the EndEffector to Left Arm.LeftGripAttachment
Viewport:
Explorer:
Left Arm properties:
IKControl properties:
(Target is the green cube in the first image)
I’m pretty sure this is due to the arm trying to move with the attachment, and they keep pushing each other recursively. Whatever the case, this limits my use case for IKControls and forces me to go back to my old workaround of using parts instead. Hope to see a fix for this soon!
Yes, this is intentional. Originally Pole was exposed to the GUI as well, but we felt that we shouldn’t require devs to set the pole just to get realistic poses, and should instead work on improving the solver (still on it). We still have it available for advanced users however as script property.
Hi, this is for the old IK system in the Animation Clip Editor, which although uses the same name (IK) is not related to IK Controls. That system will be replaced with IK Controls. I’ve forwarded the report to the relevant people in the meantime, thanks!
Yes, we currently have a single pole which is used for the whole chain.
Performance was improved a lot during the beta, for reference a single IK control takes ~80 microseconds on average. Most of it it’s spent reading/writing to the rig, which we’ll improve further, but should be already fast enough.
If players/NPCs have their joints broken (which happens upon death) with IKControls active in their humanoid it will crash every single client (including the server & other players)
How to replicate this issue:
Create a new place + insert a rig
Insert an Animator & IKControl into the humanoid. Set the properties as you wish, as long as they are valid.
is their any plans on adding more poles? If not, would it be possible to make limbs with multiple joints going in opposite directions by using multiple IK’s?
Edit: I was able to do something like what I was talking about (with multiple joints going in different directions) but it acts a bit weird.
You can see in the video that the rig would sometimes snap to certain positions.
Also because you can’t specify which joint the pole should be affecting and the solver doesn’t find the best solution where the joint would be closest to the pole, you can get different cases like these even though everything is the same:
I don’t know what your use case is, but I was able to get it working on R6 fine, I used the shoulder and grip attachments of the arms for chain roots and end effectors respectively, with the LookAt type & an EndEffectorOffset and it works perfectly.
(I know something like this doesn’t really need IK at all, but the convenience of the arm pointing at an attachment automatically with no custom replication or messing with joints and animations is great)
CC @drewbluewasabi
I found a temporary solution if you want to test it out without fear of accidentally crashing until the issue’s fixed, you can destroy the IKControls when the humanoid dies. For example put this in StarterCharacterScripts on both client and server (so server and local script):
script.Parent:WaitForChild('Humanoid').Died:Once(function()
for _, v: IKControl in script.Parent:GetDescendants() do
if v:IsA('IKControl') then
v:Destroy()
end
end
end)