# Rigged doll with "3D" foreshortening

**URL:** <https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191>\
**Category:** Assets & Templates\
**Created:** [July 19, 2026, 2:44am UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191 "2026-07-19T02:44:56Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [July 19, 2026, 2:44am UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/1 "2026-07-19T02:44:56Z")

</div>

[![](https://img.youtube.com/vi/t1vPKvFocUk/maxresdefault.jpg "mujer articulada 05") ](https://www.youtube.com/watch?v=t1vPKvFocUk)

In this new version of my rigged gym girl, I am converting everything to Synfig, taking advantage of Synfig features that aren’t possible in Inkscape:

- partial line visibility with Width Point position
- Using the MapRange Converter to modify the partial line visibility
- nesting transforms for a “Faux 3D” in the leg

[mujer articulada 03.sifz](https://forums.synfig.org/uploads/short-url/hdXhBmyCryRhVjCDJbp8YSf4FoA.sifz) (30.4 KB)

Its still a work in progress. I need to redo it because I don’t work with the Skeleton foreshortening feature, and that’s important to get the knee, shank, foot, in the correct place. … and do all the limbs.

Thank you Rodolfo for making and correcting the MapRange function!!!

The previous version:

[https://forums.synfig.org/t/gym-girl-rig-with-22-bones/17084/8](https://forums.synfig.org/t/gym-girl-rig-with-22-bones/17084/8)

For some reason, the video is only visible in Firefox  
_ **Edit BobSynfig: Working fine on Brave and Chrome on Linux** _

Update: I corrected the thigh side and bottom visibility and continuity at high flexion angles.

Still need to work on negative abduction angles

Update Jul 21: negative abduction and thigh outline visibility corrected as much as possible.

 ![Topic_thumbnail](https://forums.synfig.org/uploads/default/original/2X/d/d4195842637804d620389d89ce4e0ecabd7d0ef9.jpeg)

---

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [July 23, 2026, 4:31am UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/2 "2026-07-23T04:31:35Z")

</div>

I wanted to continue working on my project, but I got this error:

 ![image](https://forums.synfig.org/uploads/default/original/2X/2/292c9786ada2592a20dc6ca64a790c83530d8a48.png)

Is it just a matter of fixing something in the xml file?

At least the older version still works. Attached

[mujer articulada 05.sifz](https://forums.synfig.org/uploads/short-url/bB8WskDUyfsnuyL2q0o1khvREg3.sifz) (34.3 KB)

[mujer articulada 04.sifz](https://forums.synfig.org/uploads/short-url/5ly8w6TGKL2dJxi5DAcCwWZuM56.sifz) (33.3 KB)

At least my plan was to re-do some of this leg, because it needs to work with bones

update: ufff. I detected that the "animated…id=“right thigh flexion” block was moved a few lines under where it should be. Here’s the version 5 that works:

[mujer articulada 05b.sif](https://forums.synfig.org/uploads/short-url/5Dl5trd2njdg4myUbaCExGR3CVs.sif) (729.0 KB)

This happened after I deleted one waypoint for “thigh flexion”, and unexpectedly all waypoints got deleted.

---

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [July 25, 2026, 7:58am UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/3 "2026-07-25T07:58:08Z")

</div>

For future reference: this is how the end foreshortening is implemented.

fs=bone\_local\_length\_scale

If the limb end is a ball, or a shape that should stay the same length as the limb foreshortens, I calculate the “anti-foreshortening”=afs=1/fs and apply it as the x or y scale that is parallel to the bone.

If the end is a flat surface, I calculate the “co-foreshortening”=cfs=sqrt(1-fs^2)/fs=sqrt(1/fs^2-1)=sqrt(afs^2-1) and apply it to the x or y scale of that group that will become the end cross section. This way, the end starts looking like a line when the limb is 100% length, but it appears 100% towards the viewer, when the limb is 0% length.

This “co-foreshortening” is also applicable to circles that wrap around the cylindrical (or conical) surface anywhere in the middle.

If the bone local length is greater than 1, then the flat end will continue to look like a line.

![](https://img.youtube.com/vi/uxGWLPbsSaY/maxresdefault.jpg)https://www.youtube.com/embed/uxGWLPbsSaY?feature=oembed&wmode=opaque

[foreshortening 1.sifz](https://forums.synfig.org/uploads/short-url/zKVmoA5fkxJvVIfyZSglTqOPPRl.sifz) (8.1 KB)

---

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [July 26, 2026, 7:10am UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/4 "2026-07-26T07:10:56Z")

</div>

I created a valuenode named “Pythag\_Compl\_Prop”, which calculates the sqrt(1/x^2-1). I need this for perpendicular surface foreshortening. It’s based on the valuenode\_angle and pow.cpp/h.

[pythag\_compl\_prop demo.zip](https://forums.synfig.org/uploads/short-url/s35YaX5AjyE1Nn2z4D5Bt0HePYa.zip) (7.9 KB)

Included sifz which only works with this new valuenode:

 ![image](https://forums.synfig.org/uploads/default/original/2X/7/7a9b844858d04e2da4999d4ff091807c6c6ea4b4.png)

It works. It is still a work in progress. I don’t even know if the name should be “Pyhtag\_Compl\_Prop”

---

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [July 29, 2026, 10:43pm UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/5 "2026-07-29T22:43:34Z")

</div>

Look at what they need to do to emulate this power

[![](https://i.ytimg.com/vi/Dt6uMr6gV0A/hqdefault.jpg "Rigging MOHO Arms and Legs with Pin Bones AND Rotation!") ](https://www.youtube.com/watch?v=Dt6uMr6gV0A&t=1293)

the rigging master (mistress?) tutorial that was referenced

[![](https://img.youtube.com/vi/6QdzlMUuzgY/maxresdefault.jpg "【MOHO】手臂绑定 ~ 新思路 | Arm rigging ~ new ideas") ](https://www.youtube.com/watch?v=6QdzlMUuzgY)

manual section curve manipulation

[![](https://img.youtube.com/vi/3khJZtA_0WY/maxresdefault.jpg "Moho Tutorial: Easy Arm Rig Setup + Sleeve Controls for Curve, Length & Sway (Beginner-Friendly)") ](https://www.youtube.com/watch?v=3khJZtA_0WY&t=506)

---

<div class="post-metadata">

**Author:** ![zainal](https://forums.synfig.org/user_avatar/forums.synfig.org/zainal/32/8504_2.png) [@zainal](https://forums.synfig.org/u/zainal)\
**Post date:** [July 30, 2026, 12:46pm UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/6 "2026-07-30T12:46:28Z")

</div>

> [@robertojguerra](#):
>
> I created a valuenode named “Pythag\_Compl\_Prop”, which calculates the sqrt(1/x^2-1). I need this for perpendicular surface foreshortening. It’s based on the valuenode\_angle and pow.cpp/h.

Your formula can actually be built using several existing converters. However, it requires quite a lot of them. I ran into the same issue when I created the IK Bone setup using many converters, and the result was that Synfig became noticeably slower.

 ![tangent](https://forums.synfig.org/uploads/default/original/2X/a/a34ce9183404a81c3b906607416536547fd7f55e.png)

---

<div class="post-metadata">

**Author:** ![zainal](https://forums.synfig.org/user_avatar/forums.synfig.org/zainal/32/8504_2.png) [@zainal](https://forums.synfig.org/u/zainal)\
**Post date:** [July 30, 2026, 12:54pm UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/7 "2026-07-30T12:54:56Z")

</div>

Pin bones are actually possible in Synfig as well, but the functionality is quite limited. It may need something like SmartBone to make it more practical. Based on what I’ve seen in Moho, I’m not sure whether their implementation also relies on SmartBone as an additional component.

[pin bone.sifz](https://forums.synfig.org/uploads/short-url/iRJ2xrQHpBh36VlIKWfPwWNHs3S.sifz) (5.5 KB)

---

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [July 30, 2026, 4:46pm UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/8 "2026-07-30T16:46:15Z")

</div>

Is “pin bone” what is needed so that the region above the joint doesn’t get stretched with the rest of the limb?

In the video I linked, it seems like the rigger is using 7 bones with non trivial connections, to obtain this result.

The way I did it is to make the top of the limb a nested group, and apply an “anti foreshortening” factor, so it remains un-stretched.

I created the new converter to make “Pythagorean complement foreshortening”

---

<div class="post-metadata">

**Author:** ![zainal](https://forums.synfig.org/user_avatar/forums.synfig.org/zainal/32/8504_2.png) [@zainal](https://forums.synfig.org/u/zainal)\
**Post date:** [July 31, 2026, 10:44am UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/9 "2026-07-31T10:44:10Z")

</div>

> [@robertojguerra](#):
>
> Is “pin bone” what is needed so that the region above the joint doesn’t get stretched with the rest of the limb?

As far as I know, pin bones don’t involve any stretching. The bones only translate and rotate, with each bone following the position of its corresponding pin.

To rotate a bone toward a target, you can use the **Vector Angle** and **Subtract** converters. You can refer to the example files for how they’re used. If you need the position of a bone that has a parent, you can use the **Bone Link** converter.

[pin BONES new.sifz](https://forums.synfig.org/uploads/short-url/wb3i7q2WFuzw4B5EDJ3weykOlS4.sifz) (3.9 KB) demo file donwload

Here’s a new pin bone setup I created, similar to the one shown in the first YouTube video.

---

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [August 1, 2026, 4:52pm UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/10 "2026-08-01T16:52:29Z")

</div>

Thank you! I will try that. I am trying to find a way to make these bones creation more streamlined, because I will need many of them

---

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [August 3, 2026, 5:04am UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/11 "2026-08-03T05:04:29Z")

</div>

Hello Zainal,

I looked at the way that you keep the limb end shape constant, when the bone rotates and shortens. I see there’s a difference to how we apply the skeleton to the body parts:

Mine: all my limbs are a separate group, each with its own “Transformation” property. When I link the limb to the bone, the limb’s “Transformation” gets converted to a function of the bone status. This way the whole limb get’s stretched when the bone is stretched… even that end part that doesn’t need to be stretched. I mitigate this with the “anti-foreshortening method”.

Yours: the limbs are not grouped separately. The region vertices were converted to “Bone Link”. I have never seen that 😃 I still don’t know how it works, but it may solve my problem with limb foreshortening.

I didn’t find documentation about Bone Links applied to Vertices… but I figured out how you do it. I also figured out that there are two skeletons:

“Pin bone” skeleton with bones Target, Knee, and Bone 24. This skeleton can be controlled directyl by the animator.

“Bone Bind” skeleton, with bones Bone 27 (thigh top),28 (thigh bottom),29 (shank top),30 (shank bottom). These bones should not be manipulated directly by the animator. It will mess the skeleton. It seems that there are functions that make these bones follow the bones in the “Pin Bone” skeleton, but maintain their length.

The limb vertices that must only rotate with the bone, should be linked to the correct Bone Bind bone.

The limb vertices that should stretch with the bone length, should be linked to a bone in the “Pin Bone” skeleton.

---

<div class="post-metadata">

**Author:** ![zainal](https://forums.synfig.org/user_avatar/forums.synfig.org/zainal/32/8504_2.png) [@zainal](https://forums.synfig.org/u/zainal)\
**Post date:** [August 3, 2026, 6:04am UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/12 "2026-08-03T06:04:28Z")

</div>

Yes, your approach is quite different. I’m still trying to understand how it is intended to be used as well, but I think it’s worth continuing to develop it and make it as practical and appealing as possible.

My approach started because I was challenged by a demo I saw in Moho. I spent quite a bit of time studying how the pin bone system works, then tried to recreate the same behavior in Synfig. After many experiments, I managed to get something similar working, although it’s still not perfect.

The Moho demo was in Chinese, so I couldn’t fully understand all the explanations, but it gave me enough insight to experiment and develop the idea further.

---

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [August 13, 2026, 4:32pm UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/13 "2026-08-13T16:32:00Z")

</div>

I am trying this way of linking outline vertices to bones, and making some “pin bones” (constant length bones).

I noticed that when a vertex is linked to a bone, I lose the ability to change “split tangents” to/from “merge tangents” by right clicking a node.

But I can still change node positions and tangents by dragging the ducks.

I need to temporarily unlink the vertex from the bone, to change the corner from smooth to cusp.

---

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [August 16, 2026, 10:16pm UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/14 "2026-08-16T22:16:41Z")

</div>

This is just a reminder for myself and anyone who wants to open the sifz, the MapRange converter feature is needed for the outlines to appear and erase at the appropriate times, and there’s this “Pull Request” that solved a bug to make it work 100% right.

> <https://github.com/synfig/synfig/pull/3776>
>
> When \`clamp\` is on/true, and \`to\_min\` is greater than \`to\_max\`, the computed val…ue is wrong. With \`clamp\` off/false, it works properly.
> 
> This PR fix this behavior, computing the correct value when \`clamp\` is on and the target range is reverted (the starting value is greater than the ending one).
> 
> Reported-by: robertojguerra
> Reported-via: https://forums.synfig.org/t/how-to-fit-a-list-range-to-another/12583/9

There are instructions in that discussion above, to build it yourself. More reference below.

> **[Building Synfig using Autotools — Synfig developers docs documentation](https://synfig-docs-dev.readthedocs.io/en/latest/building/Building%20using%20Autotools.html)**

This is needed, until the next synfig release is released… to work with my character sifz.

---

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [August 17, 2026, 9:04am UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/15 "2026-08-17T09:04:20Z")

</div>

I got a new reference and starting to try the bone linking with vertices.

 ![segmented doll 5](https://forums.synfig.org/uploads/default/original/2X/3/379480076cbe9f518a7740410ab8d75dd2b5fd1c.jpeg)

 ![girl proportions](https://forums.synfig.org/uploads/default/original/2X/5/506617993ca11af8ee48bf98b0a2a9f96f689c5f.png)

[segmented doll 5.sifz](https://forums.synfig.org/uploads/short-url/hnDGyEjtLigrC4HU7gTkz1gKk53.sifz) (23.6 KB)

---

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [August 18, 2026, 8:24pm UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/16 "2026-08-18T20:24:41Z")

</div>

I avoided the problem of undesired foreshortening in the joints, by:

- Making the joint a separate circle, layered under forearm and arm (this way its also simpler to maintain)
- linking only the _origin_ green points of the circle and outline, instead of the vertices

Does the torso lateral flexion look natural? 🙂

Is there a way to push a button, and all the bone angles return to the initial state?

 ![image](https://forums.synfig.org/uploads/default/original/2X/7/7f84f6d5141beffb49721fdb47424f399e418e05.png)

 ![image](https://forums.synfig.org/uploads/default/original/2X/1/128139a1e1a914eacf878310c668c3cc732b508f.png)

I still need to work with the knee angle logic

 ![image](https://forums.synfig.org/uploads/default/original/2X/e/e6e647b3b037b2eb5f6582a64221b267ab79c3a4.png)

 ![image](https://forums.synfig.org/uploads/default/original/2X/6/690a3a8716363a24cf3792a509e310170060f533.png)

> **[Spinal Mobility – Routines To Ensure You Target All Aspects Of The Core. -...](https://fatchfitness.com/spinal-mobility-routines-to-ensure-you-target-all-aspects-of-the-core/)**
>
> Please see accompanying video highlighting many of these exercises (40+ Spinal Mobility 1).

[segmented doll 8.sifz](https://forums.synfig.org/uploads/short-url/ddDa73VBoHLzxba2GRLAvrgOZ3E.sifz) (29.3 KB)

[![](https://img.youtube.com/vi/l69rgo2Je8c/maxresdefault.jpg "segmented doll 11") ](https://www.youtube.com/watch?v=l69rgo2Je8c)

---

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [August 20, 2026, 7:59am UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/17 "2026-08-20T07:59:54Z")

</div>

![image](https://forums.synfig.org/uploads/default/original/2X/d/d67de50f2ab52c3f59105e14eb3f4f210cf3e28a.png)

 ![image](https://forums.synfig.org/uploads/default/original/2X/8/85130536cc599724cd9eaca4f842b512126f0fe8.png)

I am open sourcing them, because I want to see others make animations with it. Give credit if you use it.

Tell me if you make improvements.

> **[GitHub - robertojguerra/synfig-action-figures: My public repository of synfig characters](https://github.com/robertojguerra/synfig-action-figures)**
>
> My public repository of synfig characters

Time to sleep 😃

I realized I don’t need to link vertices to bones, if I have the stuff I don’t want foreshortened, separate and only the origin linked to bones.

And I need to return to using groups, because that’s the only way I think I can morph it to 3/4 view and side view.

In this new version, only one line has the RangeMap feature: inner thigh section, so 1 line it may or may not work.

I didn’t use my new math converter. It wasn’t needed.

Foreshortening of arms only look nice up to 50% (shown below at 20%)

 ![image](https://forums.synfig.org/uploads/default/original/2X/a/a5032ec281bfdd3f12649749d44427b85038b6f1.png)

---

<div class="post-metadata">

**Author:** ![ktim](https://forums.synfig.org/letter_avatar_proxy/v4/letter/k/7ab992/32.png) [@ktim](https://forums.synfig.org/u/ktim)\
**Post date:** [August 23, 2026, 9:19am UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/18 "2026-08-23T09:19:36Z")

</div>

Thanks for this contribution

---

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [August 23, 2026, 9:29am UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/19 "2026-08-23T09:29:53Z")

</div>

Update: now limbs and head are linked files, so they can be improved separately:

\*make male torso

\*make variations

\*make different views

 ![image](https://forums.synfig.org/uploads/default/original/2X/7/77fa31aa8a3079bb751cbb996dcecca769a00bf9.png)

 ![image](https://forums.synfig.org/uploads/default/original/2X/0/09ad8d5066c4524cd2c18451a1f76246f2c88bb8.png) ![image](https://forums.synfig.org/uploads/default/original/2X/8/854e1f7fd0d41831abdaff42371b31bbffe18adf.png) ![image](https://forums.synfig.org/uploads/default/original/2X/a/a61db87da1e27957ffd6fd35add293f0e7d5541c.png)

Get the files in my github

---

<div class="post-metadata">

**Author:** ![robertojguerra](https://forums.synfig.org/user_avatar/forums.synfig.org/robertojguerra/32/8271_2.png) [@robertojguerra](https://forums.synfig.org/u/robertojguerra)\
**Post date:** [August 30, 2026, 4:44am UTC](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191/20 "2026-08-30T04:44:48Z")

</div>

Torso version 2.12 (in my github) is the last one, with only front view.

I will be working in side and 3/4 view. I am not sure if there will be a control joystick in the next version.

[![](https://img.youtube.com/vi/29WcMdqB8EY/maxresdefault.jpg "female doll 2 12 unposed") ](https://www.youtube.com/watch?v=29WcMdqB8EY)

[Next page](https://forums.synfig.org/t/rigged-doll-with-3d-foreshortening/17191.md?page=2)
