Announcement

Collapse
No announcement yet.

The new 4.16 Spline Ik and skinning

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    The new 4.16 Spline Ik and skinning

    Hello,

    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,
    Click image for larger version

Name:	spineIk.png
Views:	1
Size:	322.2 KB
ID:	1217187

    This is my setup,
    Click image for larger version

Name:	spineIk_AnBP.png
Views:	1
Size:	66.2 KB
ID:	1217188


    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.
    Click image for larger version

Name:	pure_skinning.png
Views:	1
Size:	485.5 KB
ID:	1217189


    Would anyone be able to explain what is going on here?

    Cheers
    Fred

    #2
    Could you post a screenshot of the settings you are using for the Spline IK node? Specifically how many control points?

    What does the spline debug rendering show with the node selected?

    Also, do you experience the same deformation when you just run the spline IK vs the bind pose (i.e. don't pipe an animation into it)?
    Tom Sarkanen | Unreal Engine Developer | Epic Games UK

    Comment


      #3
      Hi Tom,

      here's the settings and how the points themselves are placed.
      Click image for larger version

Name:	settings.png
Views:	1
Size:	29.1 KB
ID:	1126972
      Click image for larger version

Name:	points.png
Views:	1
Size:	292.6 KB
ID:	1126973


      I disconnected the in-pose and recompiled the bp but that made no difference.
      Click image for larger version

Name:	test.png
Views:	1
Size:	41.4 KB
ID:	1126974

      Cheers
      Fred

      Comment


        #4
        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.
        Tom Sarkanen | Unreal Engine Developer | Epic Games UK

        Comment


          #5
          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?
          Click image for larger version

Name:	rotated_point.png
Views:	1
Size:	434.1 KB
ID:	1126975


          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.
          Click image for larger version

Name:	mayaSplineIk.png
Views:	1
Size:	8.4 KB
ID:	1126976


          In summary my questions/comments would be:

          1. Why have you chosen to have 'point rotations' affect the solution?
          2. What curve type are you using and what do the point rotations actually do?
          3. Could there be a tick box that did away with the need for point rotations and just automatically aligned the solution in an expected way?
          4. Can the Spline IK *not* affect the weighted points of the mesh directly, but just affect the joints?
          5. Could you please describe a rig setup that you generally would use with the current SplineIk design?


          Cheers
          Fred

          Comment


            #6
            We are not doing skinning any differently when using Spline IK. After looking at your findings, I think that this may be a bug. I'll get back to you!
            Tom Sarkanen | Unreal Engine Developer | Epic Games UK

            Comment


              #7
              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.
              Tom Sarkanen | Unreal Engine Developer | Epic Games UK

              Comment


                #8
                I've submitted a fix for the issue and it should be with you in the next preview release.

                Previously the Spline IK looked like this:

                Click image for larger version

Name:	SplineIKIncorrect.png
Views:	1
Size:	257.9 KB
ID:	1127041

                Now it looks like this with the same pose:

                Click image for larger version

Name:	FixedSplineIK.png
Views:	1
Size:	278.4 KB
ID:	1127045

                Which is similar to a manual pose:

                Click image for larger version

Name:	ManualSpinePose.png
Views:	1
Size:	306.2 KB
ID:	1127046
                Attached Files
                Last edited by Tom Sarkanen; 04-28-2017, 07:34 AM.
                Tom Sarkanen | Unreal Engine Developer | Epic Games UK

                Comment


                  #9
                  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.

                  Cheers
                  Fred
                  Last edited by Fredrum; 04-28-2017, 05:02 PM.

                  Comment


                    #10
                    Originally posted by Fredrum View Post
                    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.
                    Tom Sarkanen | Unreal Engine Developer | Epic Games UK

                    Comment


                      #11
                      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, Fred

                      Comment


                        #12
                        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.



                        Originally posted by Tom Sarkanen View Post
                        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.
                        Last edited by Fredrum; 05-03-2017, 03:40 PM.

                        Comment

                        Working...
                        X