Thanks!
@niverik2k:
it’s still ongoing “research” …
I use ShrinkWrap and Cast to “skin” the muscle system - ShrinkWrap for muscles, Cast for some rigid elements (bones).
Muscles are very simple mesh objects controlled by the character armature, with rotational symmetry around Y-axis where possible, to minimize bone roll problems (it just goes unnoticed, if such a muscle rolls around Y-axis). To simulate muscle contraction, I use bones with StretchTo constraints, and, at the moment in just one case shape keys: the “six pack” swell of rectus abdomini is modelled via shape key. Maybe, I’ll switch to something shape-key-based for the deltoides as well, because the current mechanical solution still annoys me with bone-roll issues (I ‘hate’ that silly bone roll!!!).
In the muscle sim for the last incarnation of the character, I used soft bodies on the muscle objects to achieve jiggle, to some degree. It worked, but is extremely cumbersome to animate, because each muscle has a softbody cache of it’s own, which needs to be managed.
In the future, I hope to implement jiggle for the whole system by a single softbody with vertex groups representing anatomical elements, which will be targetted by bones via StretchTo.
However, one big drawback of shrinkwrap-based muscle sim is, that the shrinkwrap modifier tends to project vertices in directions you don’t want. Here are some sketches, which illustrate the problem, and the solution I’ve found:
This is, what we’d like to happen: a skin vertex is pushed away by the muscle, and translated in outward direction:
However, if the muscle is positioned in a disadvantageous way, related to the skin, the vertex may be “sucked in” instead, and will be projected to the opposite side of the muscle object. This happens just, because the vertices on the opposite side are closer to the skin vertex:
Another problem arising when using “Nearest Surface Point” shrinkwrap mode is, that vertices may also be translated sideways, because the muscle object’s lateral bounds are closer to the skin vertex, than it’s outwards bounds:
The solution is simple, but somewhat brute force: just eliminate back sides, by joining up a common target object, which has no “inner” bounds, using booleans. This, of course, has a performance penalty, but on the other hand even reduces the count of ShrinkWrap modifiers on the character mesh itself. Before CarveLib integration, Boolean operations have been to buggy to produce results good enough for this solution (as booleans tended to create additional, redundant, disconnected vertices or even mesh parts, which confused ShrinkWrap), but as of now, this seems to be a good way:
This also allows to give muscle groups common influence over much larger parts of the skin mesh - you don’t need to fit influence areas for, say, biceps brachii, tightly around the muscle, but, as you now use a common target for biceps and triceps brachii, allow biceps deformation around the whole upper arm area, which greatly improves deformation and skin slide effect, because now biceps deformation effects do not require the armature to “prepare” the respective, biceps-only skin area by pulling it to a proper position.
Here are front & back images of the muscle system:
These two show front & back view of the merged upper arm, forearm, torso, thigh and shin target objects:
Concerning additional detail layer “over” the muscle system: I plan to use (driven) displacement for that purpose.
Additionally, there are several means to reduce/increase muscle system influence: one is (driven) Smooth, which I already use, and another one is provided by the VertexWeight-Modifiers, which are also a great addition in the toolset available for anatomy simulation.
Here is an animated test of the standing splits (also showing trouble with damn hair dynamics …):
http://www.thalion-graphics.de/portfolio/anim/spagat.avi