Wolfram Research

Function Repository Resource:

Graphics3DSketch

Source Notebook

Convert an ordinary Graphics3D object to a sketch-styled raster image

Contributed by: Silvia Hao

ResourceFunction["Graphics3DSketch"][expr]

converts expr to a sketch-styled raster image.

ResourceFunction["Graphics3DSketch"][expr,f]

converts expr to a sketch-styled raster image, applying f to lines that are obscured.

Details and Options

The first argument to Graphics3DSketch should be a Graphics3D expression.
f should be a function accepting an Image as input, producing another Image as output.
The following options can be given:
ResourceFunction["Graphics3DSketch"] accepts Graphics3D options ViewAngle, ViewPoint, ViewVertical, Lighting, and ImageSize with the same default values. In addition, it takes the option:
"DashStyle" {Dashing[0.01], AbsoluteThickness[2]} style to use for obscured lines

Examples

Basic Examples

Create a Graphics3D expression with various primitives (supported types include Polygon, Cuboid, Cone, Cylinder, Sphere, etc.):

In[1]:=
basegraph = Graphics3D[{
   RGBColor[0.5, 0.5, 1.], Cylinder[{{0, 0, -1}, {0, 0, 1}}]
   , RGBColor[1, 0, 0], Sphere[{0, 0, 2}]
   , GrayLevel[0], Line[{{-2, 0, 2}, {2, 0, 2}, {0, 0, 4}, {-2, 0, 2}}]
   , RGBColor[1, 1, 0], Polygon[{{-3, -3, -2}, {-3, 3, -2}, {3, 3, -2}, {3, -3, -2}}]
   , RGBColor[0, 1, 0], Cuboid[{-2, -2, -2}, {2, 2, -1}]
   }, Boxed -> False]
Out[1]=

Graphics3DSketch will convert all obscured lines to dashed lines:

In[2]:=
ResourceFunction["Graphics3DSketch"][basegraph]
Out[2]=

An additional image effect function can be used on lines in "shadow region":

In[3]:=
imgFilter = RightComposition[
   Blur[#, 3] &
   , EdgeDetect[#, 1] &
   ];

ResourceFunction["Graphics3DSketch"][basegraph, imgFilter]
Out[3]=

Scope

Graphics3D expressions generated by various 3D-plotting functions can be fed into Graphics3DSketch directly:

In[4]:=
basegraph = Show[{
   SphericalPlot3D[
    1, {\[Theta], 0.24 \[Pi], \[Pi]/2}, {\[Phi], 0, 1.8 \[Pi]},
    PlotStyle -> White,
    PlotPoints -> 50, Mesh -> None, BoundaryStyle -> Black]
   ,
   SphericalPlot3D[
    1, {\[Theta], 0, \[Pi]/5}, {\[Phi], \[Pi]/4, 2.1 \[Pi]},
    PlotStyle -> FaceForm[Lighter[Blue, .5], GrayLevel[.9]],
    PlotPoints -> 50, Mesh -> None, BoundaryStyle -> Black]
   ,
   Graphics3D[{FaceForm[Lighter[Pink, .8], GrayLevel[.8]], Cylinder[{{0, 0, 0}, {0, 0, .8 Cos[\[Pi]/5.]}}, Sin[\[Pi]/5.]]}]
   }
  ,
  PlotRange -> 1.2 {{-1, 1}, {-1, 1}, {0, 1}}, AxesOrigin -> {0, 0, 0}, Boxed -> False,
  SphericalRegion -> True]
Out[4]=
In[5]:=
ResourceFunction["Graphics3DSketch"][basegraph]
Out[5]=

Any image effect can be used on the "shadow region". It will only affect the style of lines:

In[6]:=
basegraph = ParametricPlot3D[
  {u Cos[v], u Sin[v], Im[(u Exp[I v]^5)^(1/5)]},
  {u, 0, 2}, {v, 0, 2 \[Pi]},
  PlotPoints -> 100, Mesh -> {2, 5}, MeshStyle -> Red, Boxed -> False,
  BoundaryStyle -> Black, ExclusionsStyle -> {None, Black},(*PlotStyle\[Rule]White,*)
  Lighting -> "Neutral"
  , PlotStyle -> Directive[
    Texture[ImageAdd[ExampleData[{"TestImage", "Ruler"}], .5]]]
  , TextureCoordinateFunction -> ({#4, 4 #5} &)
  ]
Out[6]=
In[7]:=
ResourceFunction["Graphics3DSketch"][basegraph, ViewPoint -> {3, -1, 0.5}, ImageSize -> 1000]
Out[7]=
In[8]:=
ResourceFunction["Graphics3DSketch"][basegraph
 , Blur[#, 5] &
 , ViewPoint -> {3, -1, 0.5}, ImageSize -> 1000
 ]
Out[8]=
In[9]:=
ResourceFunction["Graphics3DSketch"][basegraph
 , RightComposition[
  ImageEffect[Blur[#, 10], {"OilPainting", 5}] &
  , ImageAdjust
  , ImageAdjust[#, {0, 0, 2}] &
  ]
 , ViewPoint -> {3, -1, 0.5}, ImageSize -> 1000
 ]
Out[9]=

Options

Create a base graphic:

The option "DashStyle"{style1,style2,} can be given to alter the style of the lines in the "shadow region":

In[10]:=
ResourceFunction["Graphics3DSketch"][basegraph, ViewPoint -> {3, -1, 0.5}, "DashStyle" -> {Dashing[.005]}]
Out[10]=
In[11]:=
ResourceFunction["Graphics3DSketch"][basegraph, ViewPoint -> {3, -1, 0.5}, "DashStyle" -> {Dashing[.01], Orange}]
Out[11]=

The option Lighting can be given to alter the simulated lighting used for coloring the 3D surfaces:

In[12]:=
ResourceFunction["Graphics3DSketch"][basegraph, ViewPoint -> {3, -1, 0.5}, Lighting -> "Neutral"]
Out[12]=
In[13]:=
ResourceFunction["Graphics3DSketch"][basegraph, ViewPoint -> {3, -1, 0.5}, Lighting -> Automatic]
Out[13]=

Possible Issues

The result of Graphics3DSketch is a raster image rather than an interactive 3D object.

In[14]:=
Head[ResourceFunction["Graphics3DSketch"][Graphics3D[Sphere[]]]]
Out[14]=

Due to the image-processing based working principle of Graphics3DSketch, lines in the "shadow region" are not necessarily hidden ones in 3D rendering sense:

In[15]:=
ResourceFunction["Graphics3DSketch"][Show[{
   SphericalPlot3D[
    1, {\[Theta], 0.24 \[Pi], \[Pi]/2}, {\[Phi], 0, 1.8 \[Pi]},
    PlotStyle -> White,
    PlotPoints -> 50, Mesh -> None, BoundaryStyle -> Black]
   ,
   SphericalPlot3D[
    1, {\[Theta], 0, \[Pi]/5}, {\[Phi], \[Pi]/4, 2.1 \[Pi]},
    PlotStyle -> FaceForm[Lighter[Blue, .5], GrayLevel[.9]],
    PlotPoints -> 50, Mesh -> None, BoundaryStyle -> Black]
   ,
   Graphics3D[{FaceForm[Lighter[Pink, .8], GrayLevel[.8]], Cylinder[{{0, 0, 0}, {0, 0, .8 Cos[\[Pi]/5.]}}, Sin[\[Pi]/5.]]}]
   }
  ,
  PlotRange -> 1.2 {{-1, 1}, {-1, 1}, {0, 1}}, AxesOrigin -> {0, 0, 0}, Boxed -> False,
  SphericalRegion -> True], "DashStyle" -> {Dashing[.01], Red, AbsoluteThickness[3]}]
Out[15]=

Resource History

Source Metadata

Related Resources

Author Notes

Graphics3DSketch is a revision of DashedGraphics3D from the Sketch-type graphics with transparency and dashed hidden lines post in the linked reference.

License Information