summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-perspective.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-perspective.tex')
-rw-r--r--Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-perspective.tex418
1 files changed, 0 insertions, 418 deletions
diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-perspective.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-perspective.tex
deleted file mode 100644
index 61ed10179ec..00000000000
--- a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-perspective.tex
+++ /dev/null
@@ -1,418 +0,0 @@
-\section{Three Point Perspective Drawing Library}
-
-\noindent\emph{by Max Snippe}
-
-\begin{tikzlibrary}{perspective}
- This library provides tools for perspective drawing with one, two, or three
- vanishing points.
-\end{tikzlibrary}
-
-\subsection{Coordinate Systems}
-
-\begin{coordinatesystem}{three point perspective}
- The |three point perspective| coordinate system is very similar to the |xyz|
- coordinate system, save that it will display the provided coordinates with a
- perspective projection.
- %
- \begin{key}{/tikz/cs/x=\meta{number} (initially 0)}
- The $x$ component of the coordinate. Should be given \emph{without} unit.
- \end{key}
- %
- \begin{key}{/tikz/cs/y=\meta{number} (initially 0)}
- Same as |x|.
- \end{key}
- %
- \begin{key}{/tikz/cs/z=\meta{number} (initially 0)}
- Same as |x|.
- \end{key}
-\end{coordinatesystem}
-
-\begin{coordinatesystem}{tpp}
- The |tpp| coordinate system is an alias for the |three point perspective|
- coordinate system.
-\end{coordinatesystem}
-
-\subsection{Setting the view}
-
-\begin{key}{/tikz/3d view=\marg{azimuth}\marg{elevation}
- (default \{-30\}\{15\})}
- With the |3d view| option, the projection of the 3D coordinates on the 2D page
- is defined. It is determined by rotating the coordinate system by
- $-\meta{azimuth}$ around the $z$-axis, and by \meta{elevation} around the
- (new) $x$-axis, as shown below.
-
- \begin{tikzpicture}[
- viewpoint/.pic={
- \draw (22.5:0.45) -- (0,0) -- (-22.5:0.45);
- \draw (0,0) ++ (22.5:0.35) arc (22.5:-22.5:0.35);
- \draw (0.225,0) circle (0.02 and 0.09);
- }]
- \begin{scope}[3d view={-20}{20}]
- \draw[->] (-3,0,0) -- (3,0,0) node[pos=1.05]{x};
- \draw[->] (0,-3,0) -- (0,3,0) node[pos=1.05]{y};
- \draw[->] (0,0,-1) -- (0,0,3) node[pos=1.05]{z};
-
- \pgfmathsetmacro\az{50}
- \begin{scope}[canvas is xy plane at z=0]
- \draw[->] (0,0) ++(0,-2) arc (-90:-90+\az:2) coordinate[pos=0.5](az);
- \draw (az) -- ++(-90+\az/2:1) node[below]{\meta{azimuth}};
- \draw[dashed] (0,0) -- ++(-90+\az:3);
- \end{scope}
- \begin{scope}[rotate around z=\az]
- \pgfmathsetmacro\el{50}
- \begin{scope}[canvas is yz plane at x=0]
- \draw[->] (0,0) ++(-2.5,0) arc (180:180-\el:2.5)
- coordinate[pos=0.5](el);
- \draw (el) -- ++(180-\el/2:1) node[above]{\meta{elevation}};
- \draw[dashed] (0,0) --
- pic[solid,sloped,transform shape,pos=1.2]{viewpoint} ++(180-\el:3);
- \end{scope}
- \end{scope}
- \end{scope}
- \end{tikzpicture}
-
- For example, when both \meta{azimuth} and \meta{elevation} are 0$^\circ$,
- $+z$ will be pointing upward, and $+x$ will be pointing right. The default is
- as shown below.
-\begin{codeexample}[]
-\begin{tikzpicture}[3d view]
- \draw[->] (-1,0,0) -- (1,0,0) node[pos=1.1]{x};
- \draw[->] (0,-1,0) -- (0,1,0) node[pos=1.1]{y};
- \draw[->] (0,0,-1) -- (0,0,1) node[pos=1.1]{z};
-\end{tikzpicture}
-\end{codeexample}
-\end{key}
-
-\begin{stylekey}{/tikz/isometric view}
- A special kind of |3d view| is isometric, which can be set with the
- |isometric view| style. It simply sets |3d view={-45}{35.26}|. The value for
- \meta{elevation} is determined with $\arctan(1/\sqrt{2})$. In isometric
- projection the angle between any pair of axes is 120$^\circ$, as shown below.
-\begin{codeexample}[]
-\begin{tikzpicture}[isometric view]
- \draw[->] (-1,0,0) -- (1,0,0) node[pos=1.1]{x};
- \draw[->] (0,-1,0) -- (0,1,0) node[pos=1.1]{y};
- \draw[->] (0,0,-1) -- (0,0,1) node[pos=1.1]{z};
-\end{tikzpicture}
-\end{codeexample}
-\end{stylekey}
-
-\subsection{Defining the 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};}
-
-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.
-\begingroup
-\let\simplecuboid\relax
-\let\simpleaxes\relax
-\begin{codeexample}[]
-\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}
-\end{codeexample}
-\endgroup
-
-\begin{key}{/tikz/perspective=\meta{vanishing points}
- (default p=\{(10,0,0)\},q=\{(0,10,0)\},r=\{(0,0,20)\})}
- The `strength' of the perspective can be determined by setting the location of
- the vanishing points. The default values have a stronger perspective towards
- $x$ and $y$ than towards $z$, as shown below.
-\begin{codeexample}[]
-\begin{tikzpicture}[3d view,perspective]
- \simplecuboid{2}{2}{2}
- \simpleaxes{2}{2}{2}
-\end{tikzpicture}
-\end{codeexample}
- From this example it also shows that the maximum dimensions of the cuboid are
- no longer 2 by 2 by 2. This is inherent to the perspective projection.
- %
- \begin{key}{/tikz/perspective/p=\marg{x,y,z} (initially (0,0,0))}
- The location of the vanishing point that determines the `strength' of the
- perspective in $x$-direction can be set with the |p| key.
-\begin{codeexample}[]
-\begin{tikzpicture}[
- 3d view,
- perspective={
- p = {(5,0,0)}}]
- \simplecuboid{2}{2}{2}
- \simpleaxes{2}{2}{2}
-\end{tikzpicture}
-\end{codeexample}
- Note also that when only |p| is provided, the perspective in $y$ and $z$
- direction is turned off.
-
- To turn of the perspective in $x$-direction, one must set the $x$ component
- of |p| to \texttt{0} (e.g. |p={(0,a,b)}|, where \texttt{a} and \texttt{b}
- can be any number and will be ignored). Or one can provide |q| and |r| and
- omit |p|.
-
- By changing the $y$ and $z$ components of |p|, one can achieve various
- effects.
-\begin{codeexample}[]
-\begin{tikzpicture}[
- 3d view,
- perspective={
- p = {(5,0,1)}}]
- \simplecuboid{2}{2}{2}
- \simpleaxes{2}{2}{2}
-\end{tikzpicture}
-\end{codeexample}
-\begin{codeexample}[]
-\begin{tikzpicture}[
- 3d view,
- perspective={
- p = {(5,1,0)}}]
- \simplecuboid{2}{2}{2}
- \simpleaxes{2}{2}{2}
-\end{tikzpicture}
-\end{codeexample}
-\begin{codeexample}[]
-\begin{tikzpicture}[
- 3d view,
- perspective={
- p = {(5,1,1)}}]
- \simplecuboid{2}{2}{2}
- \simpleaxes{2}{2}{2}
-\end{tikzpicture}
-\end{codeexample}
- \end{key}
- %
- \begin{key}{/tikz/perspective/q=\marg{x,y,z} (initially (0,0,0))}
- Similar to |p|, but can be turned off by setting its $y$ component to
- \texttt{0}.
-\begin{codeexample}[]
-\begin{tikzpicture}[
- 3d view,
- perspective={
- q = {(0,5,0)}}]
- \simplecuboid{2}{2}{2}
- \simpleaxes{2}{2}{2}
-\end{tikzpicture}
-\end{codeexample}
- \end{key}
- %
- \begin{key}{/tikz/perspective/r=\marg{x,y,z} (initially (0,0,0))}
- Similar to |p|, but can be turned off by setting its $z$ component to
- \texttt{0}.
-\begin{codeexample}[]
-\begin{tikzpicture}[
- 3d view,
- perspective={
- r = {(0,0,5)}}]
- \simplecuboid{2}{2}{2}
- \simpleaxes{2}{2}{2}
-\end{tikzpicture}
-\end{codeexample}
- \end{key}
-\end{key}
-
-\subsection{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:
- \begin{itemize}
- \item Keys like |shift|, |xshift|, |yshift| are not working
- \item Keys like |rotate around x|, |rotate around y|, and |rotate around z|
- are not working
- \item Units are not working
- \item Most keys from the |3d| library are unsupported, e.g. all the
- |canvas is .. plane| keys.
- \end{itemize}
-
-\subsection{Examples}
-An |r| that lies `below' your drawing can mimic a macro effect.
-\nopagebreak
-\begin{codeexample}[]
-\begin{tikzpicture}[
- isometric view,
- perspective={
- p = {(8,0,0)},
- q = {(0,8,0)},
- r = {(0,0,-8)}}]
-
- \simplecuboid{2}{2}{2}]
-
-\end{tikzpicture}
-\end{codeexample}
-
-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.
-\nopagebreak
-\begin{codeexample}[]
-\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}
-\end{codeexample}
-
-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.
-\nopagebreak
-\begin{codeexample}[]
-\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}
-\end{codeexample}
-
-With the vanishing points nearby, the distortion of parallel lines becomes very
-strong. This might lead to \texttt{Dimension too large} errors.
-\nopagebreak
-\begin{codeexample}[]
-\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}
-\end{codeexample}
-
-% A more complex example.
-\iffalse
-Of course these examples can become as complex as desired, but as with any 3D
-drawing using \tikzname, the order of drawing commands is important and can
-become increasingly more complex.
-\nopagebreak
-\begin{codeexample}[]
-\begin{tikzpicture}[
- cycle of vertices/.style 2 args={
- insert path={
- foreach \i [count=\j,evaluate=\j as \k using
- {ifthenelse(\j==1,"","-- "}] in {#2}{\k (vert-#1-\i)} -- cycle}},
- scale=0.7,
- line join=round,
- bottom/.style={draw=white!50!black,fill=white!40!black},
- front/.style={draw=white!50!black,fill=black},
- side/.style={draw=white!50!black,fill=white!80!black},
-]
- \begin{scope}[
- 3d view={-20}{0},
- perspective={
- p = {(20,0,0)},
- q = {(0,20,0)},
- r = {(5,1,50)},
- }]
- \path foreach \x/\y/\z [count=\i] in {
- 3.5/2.0/0.0,3.5/2.0/4.0,6.0/2.0/4.0,6.5/2.0/3.5,6.5/2.0/0.5,6.0/2.0/0.0,
- 4.5/2.0/1.0,4.5/2.0/3.0,5.5/2.0/3.0,5.5/2.0/1.0,3.5/0.0/0.0,3.5/0.0/4.0,
- 6.0/0.0/4.0,6.5/0.0/3.5,6.5/0.0/0.5,6.0/0.0/0.0,4.5/0.0/1.0,4.5/0.0/3.0,
- 5.5/0.0/3.0,5.5/0.0/1.0%
- }{(tpp cs:x=\x,y=\y,z=\z) coordinate[name=vert-D-\i]};
- \filldraw[front,cycle of vertices={D}{1,...,6},
- cycle of vertices={D}{7,10,9,8}];
- \filldraw[side,cycle of vertices={D}{10,9,19,20}];
- \filldraw[bottom,cycle of vertices={D}{8,9,19,18}];
- \filldraw[front,cycle of vertices={D}{11,...,16},
- cycle of vertices={D}{17,20,19,18}];
- \filldraw[side,cycle of vertices={D}{1,2,12,11}];
- % '3'
- \path foreach \x/\y/\z [count=\i] in {
- 0.0/2.0/0.0,0.0/2.0/1.0,2.0/2.0/1.0,2.0/2.0/1.5,0.0/2.0/1.5,0.0/2.0/2.5,
- 2.0/2.0/2.5,2.0/2.0/3.0,0.0/2.0/3.0,0.0/2.0/4.0,3.0/2.0/4.0,3.0/2.0/0.0,
- 0.0/0.0/0.0,0.0/0.0/1.0,2.0/0.0/1.0,2.0/0.0/1.5,0.0/0.0/1.5,0.0/0.0/2.5,
- 2.0/0.0/2.5,2.0/0.0/3.0,0.0/0.0/3.0,0.0/0.0/4.0,3.0/0.0/4.0,3.0/0.0/0.0%
- }{(tpp cs:x=\x,y=\y,z=\z) coordinate[name=vert-3-\i]};
- \filldraw[front,cycle of vertices={3}{1,...,12}];
- \filldraw[side,cycle of vertices={3}{3,4,16,15}];
- \filldraw[side,cycle of vertices={3}{7,8,20,19}];
- \filldraw[side,cycle of vertices={3}{1,2,14,13}];
- \filldraw[side,cycle of vertices={3}{5,6,18,17}];
- \filldraw[side,cycle of vertices={3}{9,10,22,21}];
- \filldraw[bottom,cycle of vertices={3}{4,5,17,16}];
- \filldraw[bottom,cycle of vertices={3}{8,9,21,20}];
- \filldraw[front,cycle of vertices={3}{13,...,24}];
- \end{scope}
-\end{tikzpicture}
-\end{codeexample}
-\fi \ No newline at end of file