great news that there’s a spline Ik as I was going to try to hack one together myself to improve some things in my character setups but hopefully now this can solve it.
I just tried it out a bit and am noticing some un-expected behavoiur so wanted to hear from you about it.
Basically the skinning to the skeleton bones seem to act in a different way when I add the SplineIk node to my Anim BP.
This is how it looks after I moved the points a bit in the AnimBP:AnimGraph,
See how the middle blue shape is looking rotated away from the spine bones?
I was expecting it to look more like when I just rotate the bones normally. Ie the spline Ik would affect the bones, but for a like-for-like bone pose it should look the same as with regular bone rotations, right?
This is how it looks when I just rotate bones in the skeleton window, to a similar pose to that of the Spline Ik picture above.
OK it looks like there are a few things happening here.
You can see from the debug rendering that your spline_01 bone’s rotation is aligned to the tangent of the spline, (look at its small XYZ axes) as expected. However due to the rigid skinning of much of the body to that bone combined with the high curvature provided by the offset location second control point, you see a perceived dislocation.
It’s worth noting that the child-parent rendering of the bone is not correlated with the bones rotation - they are just there to display the hierarchy between bone locations, and are not analogous to bones in say, Maya.
The spline also controls rotation, which will also interpolate along it, so if you rotate your control points so they roughly follow the spline tangent you will likely mitigate this issue.
I’m not doing a very extreme movement of the points though as you can see.
I don’t see why suddenly the skinning should not obey the bones, just as usual. The the rotation of the bones should affect the weighted mesh just as with regular bone transforms I think.
The SplineIk should control the bones, and the bones should control the mesh vertexes.
I don’t know really how you were thinking this should be used but I am not used to having to rotate the points to change the behaviour of the solution.
That’s coming from maya which uses nurbs splines for the splineIk.
What curve type is being used here in UE? By ‘rotating the point’ am I really rotating the tangents to the point?
Either way is seems like, again, that the spline should only affect the joints and not the mesh.
I did try to ‘rotate the point’ to change the solution. I rotated until it looked like what I would expected it to have done automatically and maybe the X axis is pointing backwards when the solution looks better?
Is that meant to be the rule? How would I generate a point rotation that gives a solution for the mesh to follow the bones?
Here’s a picture of a basic Maya Spline Ik. The points are just moved, no 'point rotations.
The skeleton follows the curve. The skinning doesn’t change because I’m using a spline ik.
OK, on investigation I’ve found that the issue is that the rotation provided by the spline IK controller was using the wrong bone vector to create its rotation. You can see this in your screenshots where the bone orientation is ‘aligned to the spline’ as I said earlier. It should have been aligned to the bone vector multiplied by any rotational offset that the bone provides.
I will look to get this fix into 4.16 ASAP. In the meantime, would it be possible for you to provide a test project so I can verify the fix with this content? It would expedite the fix.
Great yeas that looks correct now eh? Good findings.
Sorry I was not working yesterday let me know if you still need a sample project though it looks like you have it sorted. EDIT: oh I see you’re in the UK.
(and I’d prefer not to send out my assets)
Good news then I just have one question, would you be able to tell me what curve type you are using for the spline and what is actually happening when a point gets rotated?
I would need to understand this to be able to use the spline Ik.
The curve used is exactly the same as that which is used for the Spline Component (which is the same curve that Matinee uses too). It performs a cubic interpolation against (currently) auto-calculated tangents. The curve passes through its control points. Tangents are auto-calculated to be of uniform length and with no ‘breaks’.
Rotations are also interpolated in a similar fashion - this also performs a cubic interpolation, this time using Squad quaternion interpolation. If control points contain no rotation, then no rotation will be applied to bones controlled by the spline IK node.
Thanks Tom! I just tried out preview2 and it looks like your fix got in.
I tried playing with a really long joint chain to get a feel for how the curve react, as per your description.
Looks good I’m going to test integrate with my rig.
Cheers,
I’m working on trying to figure out how to rig this into my existing character rig and was wondering if you could clarify what coordinate space those spline point transforms are expected to be in? Looks like component space but I am not sure yet as I don’t have the setup ready yet. EDIT: I think iv’e got the translations working maybe but I can’t seem to be able to get the rotations correctly. Actually they seem to be relative/component too right? Maybe I’m just not passing the right thing. Basically I am trying to blend in regular keyframe animation from the pelvis downwards and have the splineIk go up to the sternum which will be controlled by user VR hmd+motion control. I just can’t seem to get the right rotation values to feed in to make a match with the keyframe animation for the pelvis side of the splineIk…
Would it make sense to add something so that it could take world space coords too? At the moment I seem to have to make a bit of a fiddly setup to pass those transforms, might be easier with world space?
It would be great if there was a debug draw tickbox that could show the curve in the PIE windows as you simulate the character.
EDIT2: I have done another experiment to try to figure out the rotations but Iv’e got a new post about it since it doesn’t fit OP.