I have to confess that I see this as a proper challenge, as I am usually quite creative in finding/combining functions to provide a desired behavior. So I will give it another try.
which is generated using
box[x_, x1_, x2_, a_, b_] := Tanh[a (x - x1)] + Tanh[-b (x - x2)];
ex[z_, z0_, s_] := Exp[-(z - z0)^2/s]
(*and*)
r[z_, x_] := (*body*).4 (1.0 - .4 ex[z, .8, .15] +
Sin[2 π x]^2 + .6 ex[z, .8, .25] Cos[2 π x]^2 + .3 Cos[2 π x]) 0.5 (1 + Tanh[4 z]) +
(*legs*)
(1 - .2 ex[z, -1.3, .9]) 0.5 (1 + Tanh[-4 z]) (.5 (1 + Sin[2 π x]^2 +
.3 Cos[2 π x])*((Abs[Sin[2 π x]])^1.3 + .08 (1 + Tanh[4 z]) ) ) +
(*improve butt*)
.13 box[Cos[π x], -.45, .45, 5, 5] box[z, -.5, .2, 4, 2] -
0.1 box[Cos[π x], -.008, .008, 30, 30] box[z, -.4, .25, 8, 6] -
.05 Sin[π x]^16 box[z, -.55, -.35, 8, 18]
(*and finally*)
ParametricPlot3D[
(*shift butt belly*)
{.1 Exp[-(z-.8)^2/.6] - .18 Exp[-(z -.1)^2/.4], 0, 0} + {r[z, x] Cos[2 π x], r[z, x] Sin[2 π x],z},
{x, 0, 1}, {z, -1.5, 1.5},
PlotPoints -> {150, 50}, Mesh -> None,
AxesLabel -> {"x", "y", "z"}]
Edit What was the strategy in generating the graph (answering the comment of @mcb)
Inspired by some of the solutions here and the fact that the original question seems to head direction Plot3D[]
or ParametricPlot3D[]
, the idea is to use a cylinder as base. I remembered from other work that a parametric curve of type 1+Cos[t]
gives something butt-shaped and 1+ a Cos[t]
can give something like a torso cross section. To make it a little bit more elliptical I added a 1+Sin[t]^2
type.
Combining this already goes in the right direction.
Legs are also not very complicated. Just fold the cylinder into two by,e.g, Abs[Sin[t]]
. To make the transition from legs to torso I use a soft step based on Tanh[]
.
Next step is to push it in and out in the correct way (belly and butt), so there is a shift to the cylinder based on Gaussians.
At the end one adds features like waist, etc. using Gaussians or adjustable smooth box-like functions.
Done, overall not too complicated.
ExampleData[{"Geometry3D", "Beethoven"}]
was a full-body model, a judicious use ofPlotRange
would do it. $\endgroup$