How to project 3d image in the planes xy, xz, yz?
Update 2: The function projectToWalls
does not work in version 12.0 because the function PlotRange
no longer works. To fix the issue, replace PlotRange
with plotRange
where
plotRange = PlotRange/.AbsoluteOptions[#, PlotRange] &;
in the definition of projectToWalls
.
Original answer:
You can post-process a Graphics3D
object to project the lines to the left, back and bottom planes using a function like:
ClearAll[projectToWalls]
projectToWalls = Module[{pr = PlotRange[#]},
Normal[#] /. Line[x_, ___] :>
{Line[x], Line[x /. {a_, b_, c_} :> {pr[[1, 1]], b, c}],
Line[x /. {a_, b_, c_} :> {a, pr[[2, 2]], c}],
Line[x /. {a_, b_, c_} :> {a, b, pr[[3, 1]]}]}] &;
Examples:
pp1 = ParametricPlot3D[{{4 + (3 + Cos[v]) Sin[u],
4 + (3 + Cos[v]) Cos[u], 4 + Sin[v]}, {8 + (3 + Cos[v]) Cos[u],
3 + Sin[v], 4 + (3 + Cos[v]) Sin[u]}}, {u, 0, 2 Pi}, {v, 0, 2 Pi},
PlotStyle -> {Red, Green}];
projectToWalls @ pp1
projectToWalls @
Graphics3D[{White, MeshPrimitives[Tetrahedron[], 1],
MeshPrimitives[Cuboid[{0, 1/2, 0}], 1]},
PlotRange -> {{-1, 2}, {-1, 2}, {-1, 2}}, Background -> Black]
Update: Taking Roman's idea a step further using Texture
d polygons:
SeedRandom[1234];
P = Graphics3D[{Hue@RandomReal[], #} & /@ Cuboid @@@ RandomReal[{0, 1}, {10, 2, 3}]];
pr = PlotRange[P];
rect = {#, {#2[[1]], #[[-1]]}, #2, {#[[1]], #2[[-1]]}} & @@ Transpose[pr[[{##}]]] &;
texturedPoly = {Texture[Rasterize[#, Background -> None]],
Polygon[#2, VertexTextureCoordinates -> {{0, 0}, {1, 0}, {1, 1}, {0, 1}}]} &;
{left, back, bottom} = Show[P, ViewPoint -> #, Boxed -> False, Axes -> False,
Lighting -> "Neutral"] & /@ {Right, Front, Top};
leftWall = Prepend[#, pr[[1, 1]] - 1] & /@ rect[2, 3];
backWall = Insert[#, pr[[2, 1]] + 2, 2] & /@ rect[1, 3];
bottomWall = Append[#, pr[[3, 1]] - 1] & /@ rect[1, 2];
Graphics3D[{Opacity[.2], P[[1]], EdgeForm[None], Opacity[1],
MapThread[texturedPoly, {{left, back, bottom}, {leftWall, backWall, bottomWall}}]},
BoxRatios -> 1, PlotRange -> {{-1, 1.5}, {-.5, 2.1}, {-1, 1.5}}]
If you only need the 2D projection images, you can just project the 3D image from the six cardinal directions:
SeedRandom[1234];
P = Graphics3D[{RandomColor[], #} & /@ Cuboid @@@ RandomReal[{0, 1}, {10, 2, 3}]]
Show[P, ViewPoint -> #] & /@ {{∞,0,0}, {-∞,0,0}, {0,∞,0}, {0,-∞,0}, {0,0,∞}, {0,0,-∞}}
Working with the ViewVertical
option might also help.