[![enter image description here][1]][1] Using the approach from [this answer](https://mathematica.stackexchange.com/a/288473/125) to construct the polygons and lines: cp = Map[Prepend[0]]@Delete[{{3}, {6}}]@CirclePoints[{1, Pi/3}, 6]; coords = Table[Map[RotateRight[#, i - 1] &]@cp, {i, 3}]; colors = {RGBColor[1, .5, .5], RGBColor[1, 1, .5], RGBColor[.5, 1, .5]}; Transform text primitives to 3D coordinates by processing the output from `BoundaryDiscretizeGraphics`: ClearAll[textCoords] textCoords[string_, cbounds_ : {{-1/2, 1/2}, {1/2, 5/6}}, padding_ : .2] := Module[{tc = (MeshPrimitives[ BoundaryDiscretizeGraphics[Text[string], _Text], 1, Multicells -> True] /. Line[x_] :> Line[Join @@ x])[[All, 1]]}, Map[Map[Prepend[0] @* RescalingTransform[(1 + padding) CoordinateBounds @ tc, cbounds]]] @ tc]; labels = {"2nd Mathematical Olympiad", "B C M H K", "2023"}; textcoordinates = MapIndexed[{x, y} |-> Map[Map[RotateRight[#, -1 + First @ y] &]][ textCoords[Style[x, FontFamily -> "Times"]]]] @ labels; show = Show[Graphics3D @ Thread[{AbsoluteThickness[1/2], Black, Map[Line] @ textcoordinates, colors, Lighting -> {{"Ambient", White}}, Polygon /@ coords}], MeshConnectivityGraph @ ConvexHullRegion[Join @@ coords], SphericalRegion -> True, Boxed -> False, PlotRange -> 1, ImageSize -> Large, ImagePadding -> 5] [![enter image description here][2]][2] Animation above produced using rotate[angle_, axis_] := MapAt[Rotate[#, angle, UnitVector[3, axis]] &, {1}] frames = Join @@ Table[rotate[2 Pi t, a]@show, {a, 1, 3, 1}, {t, 0, 1, 1/18}]; Export["MathOlympiad.gif", frames] ***Notes:*** $Version "13.3.0 for Linux x86 (64-bit) (June 3, 2023)" Ignore the red syntax highlighting of `Multicells -> True`. [1]: https://i.sstatic.net/WpRRl.gif [2]: https://i.sstatic.net/xdWpR.png