[Tex/LaTex] Setting camera projection angle in tikz to enhance the depth perception when drawing 3D figures

3dtikz-3dplottikz-pgf

First please see the following example using MATLAB drawing command

 >>surf(membrane);

We can adjust the camera angle using MATLAB's built-in command camproj, the effects are as follows:

ortho

persp2

It is like the effect of adjusting the camera angle in Paraview, not just adjust the viewpoint's polar angle and azimuthal angle. This is more like human's visual perception whereas the farther the object is from our viewpoint, the smaller that object appears.

For example, for the following figure:

\documentclass{minimal}
\usepackage{tikz,tikz-3dplot}    
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{2mm}

\begin{document}
\tdplotsetmaincoords{70}{200}
\begin{tikzpicture}[scale = 2.5,thick,tdplot_main_coords]
\coordinate (A1) at (0,0,0);
\coordinate (A2) at (2,0,0);
\coordinate (A3) at (2,2,0);
\coordinate (A4) at (0,2,0);

\coordinate (S) at (0.5,0.5,0);
\coordinate (E) at (0.5,3,1.5);
\coordinate (P) at (1.15,1.15,0);
\fill[fill=blue!20] (A1) -- (A2) -- (A3)  -- (A4) -- cycle;
\draw[black, -latex] (S) -- (E);
\draw[black!80, -latex] (S) -- (P);
\draw[black!50,dashed] (E) -- (P);
\node[above] at (E) {$\mathbf{v}$};
\node[below] at (P) {$\mathrm{Proj}_H\mathbf{v}$};

\draw[red!70] (2,2.3,1.2) node[above] 
 {Projection using inner product} to [out=-90,in=180] ($0.5*($(E)+(P)$)$);

 \draw[red!70] (2.3,2.3,0.4) node[above] 
 {Hilbert space H} to [out=-90,in=90] ($(A3)+(-0.2,-0.2,0)$);
 \end{tikzpicture}

 \end{document}

Above is a figure I drew sometime ago for a presentation:

proj

Despite the fact that \tdplotsetmaincoords being used to set the camera viewing angle, the picture still does not look like that it is in a real 3d space. It does not have any depth perspective effect like the first staircase picture in the Wikipedia entry of perspective, the parallelogram above should not appear as a parallelogram to our visual perception.

I looked in the documents of tikz-3dplot, \tdplotsetmaincoords is rather a trick of setting camera angle using coordinate transformation, not a real camera angle setting.

So my question is: Is there any trick or tweaking to set the camera projection in tikz so that the 3d figure looks we are observing it in a real perspective?

Best Answer

I always set it to \tdplotsetmaincoords{60}{130}. I feel this gives the best view. Your plot is designed for your coordinate so it looks funny with my settings. Therefore, here is a plot I made with mine.

\documentclass[convert = false]{standalone}
\usepackage{tikz, tikz-3dplot}
\usetikzlibrary{arrows, decorations.markings}
\begin{document}
\tdplotsetmaincoords{60}{130}
\begin{tikzpicture}[line join = round, line cap = round, >=triangle 45,
  tdplot_main_coords]
  \coordinate (O) at (0, 0, 0);
  \coordinate (Y) at (0, 6, 0);
  \coordinate (Z) at (0, 0, 5);
  \coordinate (X) at (6, 0, 0);
  \coordinate (M1) at (-3, 0, 0);
  \coordinate (M2) at (4, 0, 0);
  \coordinate (M) at (3, 4, 5);

  \draw[-latex] (O) -- (Y) node[right, font = \tiny] {\(y\)};
  \draw[-latex] (O) -- (Z) node[above, font = \tiny] {\(z\)};
  \draw[dashed] (M1) -- (O);
  \draw[-latex] (O) -- (X) node[below, font = \tiny] {\(x\)};

  \shadedraw[opacity = .5] (M1) circle (.22cm);
  \shadedraw[opacity = .6] (M2) circle (.3cm);
  \shadedraw[blue, opacity = .8] (M) circle (.1cm);

  \draw[dashed] (M) -- (3, 4, 0);
  \draw[dashed] (3, 4, 0) -- (3, 0, 0);
  \draw[dashed] (3, 4, 0) -- (0, 4, 0);
  \draw[dashed] (M1) -- (-3, -3, 0);
  \draw[dashed] (M2) -- (4, -3, 0);
  \draw[latex-latex] (4, -2, 0) -- (-3, -2, 0) node[font = \tiny, fill = white,
  inner sep = 0cm, pos = .5] {\(r_{12}\)};
  \draw[-latex] (M2) -- (M) node[font = \tiny, fill = white,
  inner sep = 0cm, pos = .5] {\(\mathbf{r}_2\)};
  \draw[-latex] (M1) -- (M) node[font = \tiny, fill = white,
  inner sep = 0cm, pos = .5] {\(\mathbf{r}_1\)};
  \draw[-latex] (O) -- (M) node[font = \tiny, fill = white,
  inner sep = 0cm, pos = .5] {\(\mathbf{r}\)};
  \node[right, font = \tiny] at (-3, -.2, -0.6) {\(m_1\)}
  node[font = \tiny, fill = white, inner sep = 0cm] at (-3, 1.2, 0.5)
  {\((x_1,0,0)\)};
  \node[scale = .75] at (3, 4, 5.25) {\(m\)} node[font = \tiny]
  at (3, 5, 5.4) {\((x,y,z)\)};
  \node[right, scale = .75] at (4, 0.35, 0) {\(m_2\)} node[font = \tiny]
  at (4.25, 0.15, -0.5) {\((x_2,0,0)\)};
\end{tikzpicture}

\end{document}

enter image description here