Maya API / 07 Oct 2016
Maya API: Stitch plugin

The Stitch plugin might not be a tool for everyday use but it’s better to have it and not need it, than need it and not have it.

I’ve spent last few months building car interiors in Maya. Because I mostly made models for initial sketch phase, I never cared about stitches. One day my colleague Alex showed me his model of a car seat. It had split lines and stitches all over it created with his own MEL script and my eyes almost popped out. I’ve immediately decided to take it to the next level and create something a bit more powerfull and elegant – the Stitch plugin. For those who’re looking for something reliable there’s Stitch from Ticket01. For those who want to save 249€ and have some fun there’s this article covering few challenges I had to face during the project.


The Stitch plugin is basicaly a bit more advaced tool for duplicating objects along a curve. Although I could simply model a single stitch and duplicate it along a curve I’ve decided to define the stitch parametricaly and use combination of mesh normal and curve tangent to define the stitch orientation. I also added the posibility to use an actual maya geometry instead of my predefined stitch. I’m planing to add more features in the future, so stay tuned.

Project Curve on Mesh

If we want the stitches to follow a curve on a surface, we first have to figure out how to project a nurbs curve on a mesh surface. Maya built-in function Project Curve on Mesh is out of question since it is based on unsmoothed mesh and also not available in API (except through MEL command). Let’s do it the hard way then.

Lets first smooth the base mesh to ensure the projected curve is going to follow it nicely. We’ll get the base mesh from a node’s input attribute and smooth it in-place with the following helper function.

As for the curve projection, it is actually pretty easy to project a single point on mesh via MFnMesh::getClosestPoint() function. So we’ll simply divide the curve and find the closest point on mesh to each sample point.

Project curve - perfect scenario
Project curve – perfect scenario


Unfortunately this only works when the mesh surface doesn’t have any gaps/holes and is larger than the original curve. To check whether the sampled point actually lies above the surface we first take the surface normal of the closest point and shoot a ray from the original point back to the surface.

If we ignore all the points that lie outside the surface, we end up with a projected curve that doesn’t start on the boundary of the mesh even though the original curve is crossing it. That’s why we keep the points that come immediately before or after the points lying inside the surface. This solution isn’t completely accurate though – points on the boundary are not exact projection of the curve.

Project curve – curve extends outside surface

In the source files I’m also using function MFnNurbsCurve::findLengthFromParam(), which is not available in versions older than Maya 2016 extension 2. If you’re writing your code for older version, you can get away with using parameter instead of length. This might result in uneven spacing of samples, which can be fixed by reparametrizing the input curve.

Stitch placement and orientation

Now the fun part…

For each stitch we need 3 vectors that will define orientation matrix. I learned this from a post from Chad Vernon (yes, THE Chad Vernon) in Aligning an object’s rotation to that of a vector discussion. For the vector T we use MFnNurbsCurve::tangent() or create a vector from two neighboring points. That way the stitch geometry will follow the direction of the curve. The vector N comes from MFnMesh::getClosestPointAndNormal() which will orient the stitch normal to the mesh surface. Finally the last vector is a simple cross product of the two.

3 vectors defining local space

Here you can see how it works in the code. First we have to get position of our samples on the projected curve. Then we find the closest point on mesh, surface normal and define the tangent vector. Finally we construct an orientation matrix and call helper function which builds the oriented stitch geometry.

Generating stitch geometry

This is the function that creates lists of points, vertex counts and vertex indices we need to to feed in MFnMesh::create() function. It looks a bit complicated but only because we’re defining a mesh from scratch. If you want to duplicate model you built in Maya, you simply call MFnMesh::getPoints() and MFnMesh::getVertices() to get these values. Note how we “multiply” the geoPoints with the orientation matrix and move them to the new position.


The Stitch plugin is a great tool to add detail to your model. Although the projection method works quite nicely, it is somewhat primitive and definitely needs improvements. Let me know if you have any questions or suggestions. As always the displayed code is just a scoup from the plugin. For the complete code check the source files.


  1. John

    30 Aug 2021 - 8:56 am


    how do i put it in shelf? i cant figure it out, is there a shelf file or something to copy in the script editor?


    • Stepan Jirka

      30 Aug 2021 - 9:18 am

      Hi John,

      this one doesn’t seem to have a shelf file included but you can add buttons to your shelf by typing the command in the Maya command line and dragging it from there to your shelf with the middle mouse button. The command is simply “stitch” (without apostrophes)


  2. Thisara Yasasvi Jayasekara

    22 Mar 2021 - 6:02 pm

    Awesome, I’m a student CGI artist from Sri Lanka. This plugin helps me a lot. I will donate some money soon.

    • Stepan Jirka

      23 Mar 2021 - 6:08 pm

      Thank you!

  3. seungnamyang

    30 Apr 2020 - 9:24 am

    Hello Stepan.

    I really want to buy stitch node 2020 version.

    Do you have a plan to selling this plugin?

    • Stepan Jirka

      11 May 2020 - 8:23 pm

      Honestly, I’m not planning to update StitchNode for 2020. Sorry

  4. Hamed Mousavi

    14 Feb 2020 - 8:48 am

    Hi Stepan

    Do you have plans of updating the script for Maya 2020?

  5. matthew stevens

    29 Mar 2019 - 11:25 pm


    first off thanks for giving away your scripts. A true community spirit. I have been using seameasy for a while now and i love it. Just installed this plugn as i need to do more complex stitch pattern but i have noticed unlike seameasy there are no uvs on the generated stitches. Am i missing something?

    thanks in advance


    • Stepan Jirka

      01 Apr 2019 - 8:58 am

      Hi Matthew

      this plug-in is an older one and unfortunately I never programmed the UV part of it. If I ever find the time and motivation I’d like to just add possibility to use curves in the StitchEasy.



      • Matthew Stevens

        01 Apr 2019 - 9:29 am

        Hi Stepan,

        Thanks for your feedback i managed to get around the problem but transfering uvs from seameasy geo to stitch geo. Thanks for you reply. You really must be rewarded for your efforts! Please let me know how, if you dont want to take money let me know a prefered charity and i will donate to it on your behalf

        thanks for you amazing contribution to the community



        • Stepan Jirka

          01 Apr 2019 - 12:23 pm

          Hi Matt,

          I’m glad you found a workaround for the UV issue!

          As for the donation – I have always admired volunteers who make 3d printed arm prosthetics, so if you really mean it, a donation to e-NABLE foundation would mean a lot to me.


  6. Josh

    17 Dec 2018 - 11:39 pm

    Hi Stepan

    Awesome work on the script, been using it on a pretty regular basis! Would this script work on linux?

    • Stepan Jirka

      20 Dec 2018 - 10:22 am

      Hi Josh,

      I’m glad you find it helpful. You could try to compile it for linux from the source code but I myself have no experience compiling for linux.


  7. GooDroN

    29 May 2018 - 1:34 pm

    Good day!!! \~/
    I’m wildly sorry!
    StitchNode does not work!!! (Maya 2018.3)

    SEAMS EASY works fine!!! (Maya 2018.3)

    Will you advise something?
    Thank you!!!

    • Stepan Jirka

      29 May 2018 - 5:54 pm


      I’m glad the SeamsEasy works. As for the StitchNode, it unfortunately doesn’t work in 2018 at the moment. I’ll see if I can at some point transfer the functionality of StitchNode in the SeamsEasy plugin.


      • GooDroN

        29 May 2018 - 8:21 pm

        That would be wonderful !!!
        And thank you very much for the tool !!! \ ~ /

  8. Simon

    01 Mar 2018 - 2:29 pm

    Hi Stepan,

    I have a beginner question. Which part of the Shelfbutton.mel has to be copied into the script editor ?
    The content of the mel is:

    // The stitch command can be called with following flags
    // -d or -distance, takes double
    // -c or -count, takes int
    // -l or -length, takes double
    // -th or -thickness, takes double
    // -sk or -skew, takes double
    // -t or -translate, takes double double double
    // -r or -rotate, takes double double double
    // -s or -scale, takes double double double

    if(pluginInfo -q -l "stitchNode.mll"==0)
    loadPlugin “stitchNode”;

    stitch -d 5 -th 0.5 -sk 0.2;

    source AEstitchNodeTemplate;

    Sorry for another noob question 😉

    • Stepan Jirka

      01 Mar 2018 - 2:33 pm

      Hi Simon,

      You can copy the whole thing. But only the line with “stitch” is actually important.

      Best regards


      • Simon

        01 Mar 2018 - 2:57 pm

        Thanks very much for your super quick answer 😉 Work perfectly. Tool is amazing.

  9. Seb James

    24 Feb 2017 - 2:53 pm

    Hi again,

    Any chance you could just say where to install the parts of the download? (Noob question, sorry!)



    • Stepan Jirka

      24 Feb 2017 - 3:48 pm

      Hi Seb,

      here’s example:

      Load the plugin through Plug-in manager, simply copy content of shelfButton.mel in script editor and drag on your shelf and assign icon if you want. shelfButton.mel also contains short list of flags u can use with “stitch” command.

      • Seb James

        24 Feb 2017 - 3:50 pm

        Perfect, thanks very much!

  10. Sascha

    21 Feb 2017 - 10:31 am

    This looks great man, thanks for sharing 🙂
    Is it only for Maya2017?

    • Stepan Jirka

      21 Feb 2017 - 10:37 am

      Hi Sascha,

      I can compile it for 2016 EXT 2 if that helps, but as I’m using some functions from the latest API I’d have to rewrite the code to make it work in 2016 or lower. In few days I expect to release another plugin with stitches distributed along edges rather that projected curve, that one will be for 2016, 2016.5, 2017

  11. Seb James

    16 Feb 2017 - 1:38 pm

    Many thanks for giving this away for free, it looks great! I’m looking forward to checking out your seam plug-in; I do quite a lot of modelling of seats for aircraft, and this will save SO much time.

    • Stepan Jirka

      16 Feb 2017 - 6:29 pm

      Hi Seb. I’m currently working on a car seat project and its already a huge time and ass saver. I still want to optimize few things, but it shoudn’t take long.

  12. Fan

    15 Feb 2017 - 7:02 pm

    Great work! Thank you for sharing all your excellent scripts.

Post your Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.