# Extrusion of a parametric surface with different face and boundary colours

## Problem statement

I want to extrude a parametric surface and colour its front faces, back faces and boundaries differently.

Define plot options

opts =
{Axes -> False,
Boxed -> False,
ImageSize -> 400,
Lighting -> "ThreePoint",
PlotPoints -> 64,
ViewPoint -> {2, 0, 0.5}};


Steinbach surface

Steinbach = {v Cos[u], v Sin[u], 1/2 u Cos[v]};


## Plots without extrusion

Red front faces

front =
ParametricPlot3D[
Steinbach, {u, 0, 2 Pi}, {v, -4, 4},
Evaluate @ opts,
PlotLabel -> "Front",
PlotStyle -> Directive[FaceForm[Red, Yellow]]];


Red back faces

back =
ParametricPlot3D[
Steinbach, {u, 0, 2 Pi}, {v, -4, 4},
Evaluate @ opts,
PlotLabel -> "Back",
PlotStyle -> Directive[FaceForm[Yellow, Red]]];


Yellow boundary

boundary =
ParametricPlot3D[
Steinbach, {u, 0, 2 Pi}, {v, -4, 4},
Evaluate @ opts,
BoundaryStyle -> Directive[Yellow, Thickness[0.01]],
PlotLabel -> "Edges",
PlotStyle -> Red];


Display together

GraphicsRow[{front, back, boundary},
Dividers -> All,
FrameStyle -> LightGray]


## Plots with extrusion

Unfortunately, when I extrude the surface (using the undocumented options Method -> {"Extrusion" -> 0.1} or PlotTheme -> "ThickSurface", the different face colours vanish:

ParametricPlot3D[
Steinbach, {u, 0, 2 Pi}, {v, -4, 4},
Evaluate @ opts,
Method -> {"Extrusion" -> 0.1},
PlotStyle -> Directive[FaceForm[Red, Yellow]]]


I don't have this problem with my Blender / Python application which extrudes ("solidifies") respecting face colour directives:

## Question

How can I extrude with different face and boundary colours like in the above Blender image collage?

• At first we can set the PlotRange->{-3,3} to cut the surface to see that although the outisde of the thick surface is red, the inside of such thick surface is yellow.
ParametricPlot3D[Steinbach, {u, 0, 2  Pi}, {v, -4, 4}, Evaluate@opts,
Method -> {"Extrusion" -> 1},
PlotStyle -> Directive[FaceForm[Red, Yellow], Opacity[.9]],
PlotRange -> {-3, 3}]


• We take some code from VertexNormals.( Application, normalsShow)
• We Cases the VertexNormals and Polygon and Line from the plot.We move the vertex along the VertexNormals to get another surface and Thread the Line to get the body side.
Clear["Global*"];
opts = {Axes -> False, Boxed -> False, ImageSize -> 400,
Lighting -> "ThreePoint", PlotPoints -> 64,
ViewPoint -> {2, 0, 0.5}};
g = ParametricPlot3D[{v Cos[u], v Sin[u], 1/2 u Cos[v]}, {u, 0,
2 Pi}, {v, -4, 4}, PlotStyle -> Directive[FaceForm[Red, Yellow]],
BoundaryStyle -> Transparent, Mesh -> None, Evaluate@opts];
{pl, vl, prims} =
First@Cases[g,
GraphicsComplex[pl_, prims_, VertexNormals -> vl_,
opts___?OptionQ] :> {pl, vl, prims}, Infinity];
thickness = .1;
h = thickness/2;
lineindexs = Cases[prims, _Line, -1][[1, 1]];
Graphics3D[{GraphicsComplex[pl + h*vl, prims, VertexNormals -> vl],
GraphicsComplex[pl - h*vl, prims, VertexNormals -> vl],
GraphicsComplex[
Join[pl + h*vl, pl - h*vl], {Red, EdgeForm[],
Polygon[Join[#1, Reverse@#2]] &, {Partition[lineindexs, 2, 1, 1],
Partition[lineindexs + Length@vl, 2, 1, 1]}]}]},
Boxed -> False, ViewPoint -> {2, 0, 0.5}]
% // DiscretizeGraphics // Area


299.88.

This is rather an workaround that creates a separate "extruded" surface (there might be a much more direct way to do it)

opts = {Axes -> False, Boxed -> False, ImageSize -> 400, Lighting -> "ThreePoint"
, PlotPoints -> 64, ViewPoint -> {-2, 0, 0.5}, MeshStyle -> None};

steinbach = {v Cos[u], v Sin[u], 1/2 u Cos[v]};
steinbachExtruded = steinbach + 0.06 Normalize[Cross[D[steinbach, u], D[steinbach, v]]];

plotYellow =
ParametricPlot3D[steinbachExtruded, {u, 0, 2 Pi}, {v, -4, 4},
Evaluate@opts, PlotStyle -> Directive[FaceForm[Yellow]]];

plotRed =
ParametricPlot3D[steinbach, {u, 0, 2  Pi}, {v, -4, 4}
, Evaluate@opts, Method -> {"Extrusion" -> 0.1}, PlotStyle -> Directive[FaceForm[Red]]];

Show[plotRed, plotYellow]
`