I'm working with some basic 3D graphics stuff:
g1 =
CoordinateBoundsArray[
{
{0, 1},
{0, 1}
},
{.1, .1}
];
g2 = Map[# + {.05, .05} &, g1, {2}];
fullG = Join[Flatten[g1, 1], Flatten[g2, 1]];
substrate =
{
EdgeForm[None],
GrayLevel[.8],
Cuboid[{ -.05, -.05, -.1}, {1.1, 1.1, .01}]
};
$viewOptions =
{
Lighting -> "Neutral",
Boxed -> False,
PlotRange -> Transpose@{{ -.05, -.05, -.1}, {1.1, 1.1, .5}},
ViewVector -> 2.5*{1, .6, .3},
ViewCenter -> {0.5, 0.5, 0.5}
};
firstCylinders = Cylinder[{Append[#, 0], Append[#, .1]}, .03] & /@ fullG;
bigCylinderGraphics =
Graphics3D[
{
substrate,
{
EdgeForm[Hue[.15, 1, .9]],
Hue[.15, 1, 1],
firstCylinders
}
},
$viewOptions
]
And I find myself wishing it looked more like what one would do with, e.g. Google Drawings where it's composed of 2D primitives.
If the new toon-shading stuff were available in 12.0 I think that'd probably be good enough, but absent that I'm wondering if there's any good way to make the cylindrical components less well shaded and more "flat", e.g. like this (but perspective-correct and all that):
Here's an initial attempt with Inset that seems like it will not be able to work (but I'd love to be proved wrong):
cylinder2D =
Graphics[
{
White,
{
EdgeForm@Directive[AbsoluteThickness[1], Black],
Disk[{.5, .26}, {.5, .25}, {\[Pi], 2 \[Pi]}]
},
{
EdgeForm@Directive[AbsoluteThickness[1], White],
Rectangle[
{0, .25},
{1, 1.5}
],
Black,
AbsoluteThickness[2],
Line[{{0, .25}, {0, 1.5}}],
Line[{{1, .25}, {1, 1.5}}]
},
{
EdgeForm@Directive[AbsoluteThickness[1], Black],
Disk[{.5, 1.5}, {.5, .25}]
}
}
];
Graphics3D[
{
substrate,
Map[
Inset[
cylinder2D /. White -> Orange,
Append[#, .03],
{Center, Bottom},
{20, 20}
] &,
fullG
]
},
ImageSize -> 500,
$viewOptions
]



Lighting -> {{"Ambient", LightBlue}}but you will miss solid edges 'around' projections. So you could try to adapt: https://mathematica.stackexchange.com/q/45410/5478 for this purpose. – Kuba Jan 16 '20 at 08:49