Yes we can. The following `DashedGraphics3D[ ]` function is designed to convert ordinary `Graphics3D` object to the "line-drawing" style raster image. Clear[DashedGraphics3D] DashedGraphics3D::optx = "Invalid options for Graphics3D are omitted: `1`."; Options[DashedGraphics3D] = {ViewAngle -> 0.4, ViewPoint -> {3, -1, 0.5}, ViewVertical -> {0, 0, 1}, ImageSize -> 800}; DashedGraphics3D[basegraph_, effectFunction_: Identity, opts : OptionsPattern[]] /; ! MatchQ[Flatten[{effectFunction}], {(Rule | RuleDelayed)[__] ..}] := Module[{exceptopts, fullopts, frontlayer, dashedlayer, borderlayer, face3DPrimitives = {Polygon, Cuboid, Cone, Cylinder, Sphere, Tube, BSplineSurface} }, exceptopts = FilterRules[{opts}, Except[Options[Graphics3D]]]; If[exceptopts =!= {}, Message[DashedGraphics3D::optx, exceptopts] ]; fullopts = Join[FilterRules[Options[DashedGraphics3D], Except[#]], #] &@ FilterRules[{opts}, Options[Graphics3D]]; frontlayer = Show[ basegraph /. Line[pts__] :> {Thick, Line[pts]}, fullopts, Lighting -> {{"Ambient", White}} ] // Rasterize; dashedlayer = Show[ basegraph /. {Polygon[__] :> {}, Line[pts__] :> {Dashed, Line[pts]}} /. h_[pts___] /; MemberQ[face3DPrimitives, h] :> {FaceForm[], EdgeForm[{Dashed, Black}], h[pts]}, fullopts ] // Rasterize; borderlayer = Show[basegraph /. RGBColor[__] :> Black, ViewAngle -> (1 - .001) OptionValue[ViewAngle], fullopts, Lighting -> {{"Ambient", Black}}, Axes -> False, Boxed -> False ] // Rasterize // GradientFilter[#, 1] & // ImageAdjust; ImageSubtract[frontlayer, dashedlayer] // effectFunction // ImageAdd[frontlayer // ColorNegate, #] & // ImageAdd[#, borderlayer] & // ColorNegate // ImageCrop ] Usage: - `DashedGraphics3D[ ]` has three kinds of arguments. The `basegraph` is the `Graphics3D[ ]` you want to convert. The `effectFunction` is an optional argument, which when used will perform corresponding image effect to the hiden part. The `opts` are options intended for internal `Graphics3D[ ]`, which are mainly used to determine the posture of the final output. When omitted, it takes values as defined by `Options[DashedGraphics3D]`. Example: - graph1 = Show[{ SphericalPlot3D[ 1, {θ, 1/5 1.2 π, π/2}, {ϕ, 0, 1.8 π}, PlotPoints -> 50, Mesh -> None, BoundaryStyle -> Black], SphericalPlot3D[ 1, {θ, 0, π/5}, {ϕ, π/4, 2.1 π}, PlotStyle -> FaceForm[Lighter[Blue, .9], GrayLevel[.9]], PlotPoints -> 50, Mesh -> None, BoundaryStyle -> Black], Graphics3D[{FaceForm[Lighter[Pink, .8], GrayLevel[.8]], Cylinder[{{0, 0, 0}, {0, 0, .8 Cos[π/5]}}, Sin[π/5]]}] }, PlotRange -> 1.2 {{-1, 1}, {-1, 1}, {0, 1}}, AxesOrigin -> {0, 0, 0}, Boxed -> False, SphericalRegion -> True]; DashedGraphics3D[graph1] ![hemisphere][1] **Sidenote:** The hiden border of the cylinder's side-wall can not be extracted by the shaow method (described below) used in `DashedGraphics3D[ ]`, so `ParametricPlot3D[ ]`-akin functions are needed instead of simply `Cylinder[ ]`. graph2 = ParametricPlot3D[ {u Cos[v], u Sin[v], Im[(u Exp[I v]^5)^(1/5)]}, {u, 0, 2}, {v, 0, 2 π}, PlotPoints -> 20, Mesh -> {2, 5}, MeshStyle -> Red, Boxed -> False, BoundaryStyle -> Black, ExclusionsStyle -> {None, Black}]; DashedGraphics3D[graph2] ![fan][2] Add an oil-painting effect: DashedGraphics3D[graph2, ImageAdjust[ImageEffect[Blur[#, 3], {"OilPainting", 3}]] & ] ![fan with special image effect][3] As for OP's example: graph3 = Show[{ ContourPlot3D[(4 - z)^2 == x^2 + y^2, {x, -3, 3}, {y, -3, 3}, {z, 2, 4}, Mesh -> None, BoundaryStyle -> Black, PlotPoints -> 20], ContourPlot3D[x^2 + y^2 == 4, {x, -3, 3}, {y, -3, 3}, {z, -2, 2}, Mesh -> None, BoundaryStyle -> Black] }, PlotRange -> {{-3, 3}, {-3, 3}, {-2, 4}}] DashedGraphics3D[graph3, ViewAngle -> .6, ViewPoint -> {3, 2, 1}] ![OP's graphics][4] Explanation: - Take `graph1` as example. The `frontlayer` generate a solid style graphics using `{"Ambient", White}` lighting, where every object supposed to be hiden are all invisible: ![frontlayer][5] The `dashedlayer` does the opposite to the `frontlayer`. It set all faces transparent, and all edges and lines `Dashed`: ![dashedlayer][6] Apparently, subtracting `frontlayer` from `dashedlayer`, we can extract the hiden part with dashed-style (On which `effectFunction` is applied.), then we add it back to `frontlayer`: ![innerlines][7] Now the only missed part is the outline contour. We solve this problem by first using `{"Ambient", Black}` lighting to generate the shadow of the whole graphics, then using `GradientFilter` to extract the outline, which is the `borderlayer`: ![borderlayer][8] Combine `frontlayer`, `dashedlayer` and `borderlayer` properly, we get our final result. [1]: https://i.sstatic.net/35jfH.png [2]: https://i.sstatic.net/dNU9K.png [3]: https://i.sstatic.net/z2v3e.png [4]: https://i.sstatic.net/VNqiO.png [5]: https://i.sstatic.net/aufwp.png [6]: https://i.sstatic.net/An9fy.png [7]: https://i.sstatic.net/pgH6K.png [8]: https://i.sstatic.net/4VdK1.png