PGF/TikZ Manual | PGFplots | TikZ Editor

TikZ and PGF Manual

Libraries

63 Three Point Perspective Drawing Library

by Max Snippe

63.1 Coordinate Systems
63.2 Setting the view
63.3 Defining the perspective

In this section, the following example cuboid will be used with various scaling. As a reference, the axes will be shown too, without perspective projection.

(-tikz- diagram)

\usetikzlibrary {perspective}
\newcommand\simplecuboid[3]{%
\fill[gray!80!white] (tpp cs:x=0,y=0,z=#3)
-- (tpp cs:x=0,y=#2,z=#3)
-- (tpp cs:x=#1,y=#2,z=#3)
-- (tpp cs:x=#1,y=0,z=#3) -- cycle;
\fill[gray] (tpp cs:x=0,y=0,z=0)
-- (tpp cs:x=0,y=0,z=#3)
-- (tpp cs:x=0,y=#2,z=#3)
-- (tpp cs:x=0,y=#2,z=0) -- cycle;
\fill[gray!50!white] (tpp cs:x=0,y=0,z=0)
-- (tpp cs:x=0,y=0,z=#3)
-- (tpp cs:x=#1,y=0,z=#3)
-- (tpp cs:x=#1,y=0,z=0) -- cycle;}
\newcommand{\simpleaxes}[3]{%
\draw[->] (-0.5,0,0) -- (#1,0,0) node[pos=1.1]{x};
\draw[->] (0,-0.5,0) -- (0,#2,0) node[pos=1.1]{y};
\draw[->] (0,0,-0.5) -- (0,0,#3) node[pos=1.1]{z};}

\begin{tikzpicture}[3d view]
\simplecuboid{2}{2}{2}
\simpleaxes{2}{2}{2}
\end{tikzpicture}
63.4 Shortcomings

Currently a number of things are not working, mostly due to the fact that PGF uses a 2D coordinate system underwater, and perspective projection is a non-linear affine transformation which needs to be aware of all three coordinates. These three coordinates are currently lost when processing a 3D coordinate. The issues include, but possibly are not limited to:

  • Keys like shift, xshift, yshift are not working

  • Keys like rotate around x, rotate around y, and rotate around z are not working

  • Units are not working

  • Most keys from the 3d library are unsupported, e.g. all the canvas is .. plane keys.

63.5 Examples

An r that lies ‘below’ your drawing can mimic a macro effect.

(-tikz- diagram)

\usetikzlibrary {perspective}
\begin{tikzpicture}[
isometric view,
perspective={
p = {(8,0,0)},
q = {(0,8,0)},
r = {(0,0,-8)}}
]

\simplecuboid{2}{2}{2}

\end{tikzpicture}

A peculiar phenomenon inherent to perspective drawing, is that however great your coordinate will become in the direction of the vanishing point, it will never reach it.

(-tikz- diagram)

\usetikzlibrary {perspective}
\begin{tikzpicture}[
isometric view,
perspective={
p = {(4,0,0)},
q = {(0,4,0)}}
]

\node[fill=red,circle,inner sep=1.5pt,label=above:p] at (4,0,0){};

\foreach \i in {0,...,100}{
\filldraw[fill = gray] (tpp cs:x=\i,y=0,z=0)
-- (tpp cs:x=\i+0.5,y=0,z=0)
-- (tpp cs:x=\i+0.5,y=2,z=0)
-- (tpp cs:x=\i,y=2,z=0)
-- cycle;}
\end{tikzpicture}

Even for simple examples, the added perspective might add another ‘dimension’ to your drawing. In this case, two vanishing points give a more intuitive result then three would.

(-tikz- diagram)

\usetikzlibrary {perspective}
\begin{tikzpicture}[
scale=0.7,
3d view,
perspective={
p = {(20,0,0)},
q = {(0,20,0)}}
]

\filldraw[fill=brown] (tpp cs:x=0,y=0,z=0)
-- (tpp cs:x=0,y=4,z=0)
-- (tpp cs:x=0,y=4,z=2)
-- (tpp cs:x=0,y=2,z=4)
-- (tpp cs:x=0,y=0,z=2) -- cycle;
\filldraw[fill=red!70!black] (tpp cs:x=0,y=0,z=2)
-- (tpp cs:x=5,y=0,z=2)
-- (tpp cs:x=5,y=2,z=4)
-- (tpp cs:x=0,y=2,z=4) -- cycle;
\filldraw[fill=brown!80!white] (tpp cs:x=0,y=0,z=0)
-- (tpp cs:x=0,y=0,z=2)
-- (tpp cs:x=5,y=0,z=2)
-- (tpp cs:x=5,y=0,z=0) -- cycle;
\end{tikzpicture}

With the vanishing points nearby, the distortion of parallel lines becomes very strong. This might lead to Dimension too large errors.

(-tikz- diagram)

\usetikzlibrary {perspective}
\begin{tikzpicture}[
3d view,
perspective={
p = {(2,0,0)},
q = {(0,2,0)},
r = {(0,0,2)}}
,
scale=4,
vanishing point/.style={fill,circle,inner sep=2pt}]

\simplecuboid{3}{1}{2}

\node[vanishing point,label = right:p] (p) at (2,0,0){};
\node[vanishing point,label = left:q] (q) at (0,2,0){};
\node[vanishing point,label = above:r] (r) at (0,0,2){};

\begin{scope}[dotted]
\foreach \y in {0,1}{
\foreach \z in {0,2}{
\draw (tpp cs:x=0,y=\y,z=\z) -- (p.center);}}
\foreach \x in {0,3}{
\foreach \z in {0,2}{
\draw (tpp cs:x=\x,y=0,z=\z) -- (q.center);}}
\foreach \x in {0,3}{
\foreach \y in {0,1}{
\draw (tpp cs:x=\x,y=\y,z=0) -- (r.center);}}
\end{scope}
\end{tikzpicture}