Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

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?

share|improve this question
    
Maybe this will help getting started: texample.net/tikz/examples/cuboid –  Count Zero Jul 2 '13 at 15:27
    
@CountZero Thanks, interesting, I should have googled harder. –  Shuhao Cao Jul 2 '13 at 15:28

1 Answer 1

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

share|improve this answer
    
I think there is a misunderstanding. That's not what is asked here. –  percusse Jul 13 '13 at 8:38
    
@percusse he asked at the bottom if there is any trick or tweak to setting it. My tweak is the {60}{130}. So I feel that is answer. –  dustin Jul 13 '13 at 8:41
    
That's a camera view angle not a projection. The camera projection is specifically asked here. That is the reason why OP's image looks funny in your code. –  percusse Jul 13 '13 at 8:42

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.