# How can we color 3D objects in specific direction?

Update

I would like to control the direction of the color gradient to get similar to this plot but in 3D

Original

pol = {{1/2, 0, 0}, {1, 0, 0}, {5/4, Sqrt[3]/4, 0}, {1, Sqrt[3]/2,
0}, {1/2, Sqrt[3]/2, 0}, {1/4, Sqrt[3]/4, 0}, {1/2, 0, 0}};
Graphics3D[{Polygon[pol,
VertexColors -> {Red, Red, White, Black, Black, White}]},
Boxed -> False];


How can we make the gradient of color in a specific direction? for example along the green line in this fig or any arbitrary one such that it starts with red color from the bottom edge and white everywhere at the middle (white line) and smoothly goes to black at the top edge?

Updated

• We use {x - x0, y - y0} . AngleVector[t] to calculate the sign distance from the line through the center {x0,y0} of the polygon.

• Use Rescale to limit the range of the distance to the interval [0,1].

• Set the Blend color from Red to White then to Blue.

pol = {{1/2, 0, 0}, {1, 0, 0}, {5/4, Sqrt[3]/4, 0}, {1, Sqrt[3]/2,
0}, {1/2, Sqrt[3]/2, 0}, {1/4, Sqrt[3]/4, 0}, {1/2, 0, 0}};
{x0, y0, z0} = RegionCentroid@Polygon@pol;
t = π/2;
RegionPlot3D[Polygon@pol, PlotPoints -> 100, MaxRecursion -> 6,
Mesh -> None,
ColorFunction ->
Function[{x, y, z},
Blend[{{0, Red}, {.5, White}, {1, Blue}},
Rescale[{x - x0, y - y0} . AngleVector[t], {-(Sqrt[3]/4),
Sqrt[3]/4}]]], ColorFunctionScaling -> False,
Lighting -> {{"Ambient", White}}, PerformanceGoal -> "Quality",
Boxed -> False, Axes -> False]


Original

Maybe similar with this result.

• Along the y direction.
RegionPlot3D[Polygon@pol, PlotPoints -> 100, MaxRecursion -> 4,
ColorFunction ->
Function[{x, y, z}, Blend[{{0, Red}, {.5, White}, {1, Red}}, y]],
ColorFunctionScaling -> True, Boxed -> False]


• Or set the color function be the distance from the line through the center of polygon.
{x0, y0, z0} = RegionCentroid@Polygon@pol;
ani = Manipulate[
RegionPlot3D[Polygon@pol, PlotPoints -> 80, MaxRecursion -> 4,
Mesh -> None,
ColorFunction ->
Function[{x, y, z},
Blend[{{1, Red}, {0, White}},
2.5 Abs[{x - x0, y - y0} . AngleVector[t]]]],
ColorFunctionScaling -> False, Lighting -> "Neutral",
PerformanceGoal -> "Quality", Boxed -> False, Axes -> False], {t,
0, 2 Pi}]


• That is AWESOME!, can we have different colors around the white like red and blue? Sep 12, 2022 at 5:14
• @valarmorghulis pol = {{1/2, 0, 0}, {1, 0, 0}, {5/4, Sqrt[3]/4, 0}, {1, Sqrt[3]/2, 0}, {1/2, Sqrt[3]/2, 0}, {1/4, Sqrt[3]/4, 0}, {1/2, 0, 0}}; {x0, y0, z0} = RegionCentroid@Polygon@pol; t = \[Pi]/2; RegionPlot3D[Polygon@pol, PlotPoints -> 100, MaxRecursion -> 6, Mesh -> None, ColorFunction -> Function[{x, y, z}, Blend[{{0, White}, {.5, Blue}, {1, Red}}, 2.5 Abs[{x - x0, y - y0} . AngleVector[t]]]], ColorFunctionScaling -> False, Lighting -> {{"Ambient", White}}, PerformanceGoal -> "Quality", Boxed -> False, Axes -> False] ? Sep 12, 2022 at 8:33
• Not like this, kindly check my updates Sep 12, 2022 at 9:03

A rough approximation

\$Version

(* "13.1.0 for Mac OS X x86 (64-bit) (June 16, 2022)" *)

Clear["Global*"]

pol = {{1/2, 0, 0}, {1, 0, 0}, {5/4, Sqrt[3]/4, 0}, {1, Sqrt[3]/2, 0}, {1/2,
Sqrt[3]/2, 0}, {1/4, Sqrt[3]/4, 0}, {1/2, 0, 0}};

Manipulate[
pol2 = Insert[
Insert[pol, p*pol[[4]] + (1 - p)*pol[[5]], 5],
p*pol[[1]] + (1 - p)*pol[[2]], 2];
Graphics3D[{
Red,
Polygon[pol2,
VertexColors -> {
Blend[{Red, White}, 1/2 - p], Red, Blend[{Red, White}, p - 1/2], White,
Blend[{Black, White}, 1/2 - p], Black, Blend[{Black, White}, p - 1/2],
White}],
Thick,
Green, Line[{pol2[[2]], pol2[[6]]}]},
Boxed -> False],
{{p, 0.5}, 0, 1, 0.05, Appearance -> "Labeled"}]
`

• I need the color to be white a long the corners on the left and right of the green line which is not the case even in my orginal code. i.e. I need the color to change along x only while stays the same along y or vice versa. Sep 11, 2022 at 18:04