25

In the below image

  • top: rectangles

  • Bottom: isometric views. How to do it in TikZ?

enter image description here

Similar result but not correct...

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\draw (0,0) -- (1,0)--(1,1)--(0,1)--cycle;
\end{tikzpicture}

\begin{tikzpicture}[rotate=30]
\draw (0,0) -- (1,0)--(1,1)--(0,1)--cycle;
\end{tikzpicture}
\end{document}
  • 6
    You have to put x={(0.86cm,0.5cm)},y={(-0.86cm,0.5cm)} into your tikzpicture options to get an isometric perspective. If you want to use 3D coordinates, you also have to specify z={(0cm,1cm)}, and use three dimensional coordinates (like \draw (0,0,1) -- (2,1,3)). – Jake Jun 11 '12 at 7:26
  • For the record: Jake's patch is now incorporated in v3.1 of TikZ. – Stefan Pinnow Jan 15 at 18:51
33

Like Andrew wrote, 3d is not in the documentation. I updated my answer because I introduced some mistakes and complications. First we need to define the vectors for the xyz system, then with the 3dlibrary options, we can work in a specific plane.

 canvas is xy plane at z=0

I design the plane xy with z=0, I made a mistake with yx because in this case I exchange the vectors x and y.

Here a list of the options in 3d

coordinate system  xyz cylindrical
coordinate system  xyz spherical

/tikz/cs/longitude/
/tikz/cs/latitude/

 plane origin
 plane x
 plane y

 canvas is plane
 canvas is xy plane at z
 canvas is yx plane at z
 canvas is xz plane at y
 canvas is zx plane at y
 canvas is yz plane at x
 canvas is zy plane at x

The code :

 \documentclass{scrartcl}
 \usepackage{tikz}
 \usetikzlibrary{arrows,3d}

 % see the explanation below
 \makeatletter
 \tikzoption{canvas is xy plane at z}[]{%
   \def\tikz@plane@origin{\pgfpointxyz{0}{0}{#1}}%
   \def\tikz@plane@x{\pgfpointxyz{1}{0}{#1}}%
   \def\tikz@plane@y{\pgfpointxyz{0}{1}{#1}}%
   \tikz@canvas@is@plane
 }
 \makeatother 

\begin{document}
\begin{tikzpicture}
 [x={(0.866cm,0.5cm)}, y={(-0.866cm,0.5cm)}, z={(0cm,1cm)}, scale=2]
  \draw[->,red] (0,0,0) --  (1,0,0);
  \draw[->,red] (0,0,0) --  (0,1,0);    
  \draw[->,red] (0,0,0) --  (0,0,1);    
  \begin{scope}[canvas is xy plane at z=0]
      \draw[blue,shift={(1.5,0)}] (0,0) -- (1,0)--(1,1)--(0,1)--cycle;
      \draw[blue,shift={(3,0)}] (0,0) -- (1,0)--(1,1)--(0,1)--cycle;
  \end{scope}  
  \end{tikzpicture}

  \end{document}

The code for the option used in my example is

  \tikzoption{canvas is xy plane at z}{%
    \tikz@addtransform{\pgftransformshift{\pgfpointxyz{0}{0}{#1}}}%
  } 

This is only a shift transformation.

Update

As Jake noticed in this answer grid in 3d

The implementation of canvas is xy plane at z in tikzlibrary3d.code.tex is incorrect, it merely sets a coordinate shift, but doesn't activate the full transformation code necessary. You can redefine the key correctly within your document:

 \makeatletter
 \tikzoption{canvas is xy plane at z}[]{%
   \def\tikz@plane@origin{\pgfpointxyz{0}{0}{#1}}%
   \def\tikz@plane@x{\pgfpointxyz{1}{0}{#1}}%
   \def\tikz@plane@y{\pgfpointxyz{0}{1}{#1}}%
   \tikz@canvas@is@plane
 }
 \makeatother  

I forgot this and it is why I use yxinstead of xy in my first attempt.

enter image description here

  • @Jake Yes you are right, I forgot to modify my example – Alain Matthes Jun 11 '12 at 7:51
  • 1
    Given that the 3d library is not (yet, as I understand it) documented, I think it worth highlighting its use here particularly as it makes life so easy for this. (Also worth pointing out that there are lots of other examples on this site of its use so its lack of documentation is partially made up for here.) – Loop Space Jun 11 '12 at 8:22
  • Sadly, I can't upvote again ... excellent additions - Thanks! – Loop Space Jun 11 '12 at 8:54
  • 1
    To obtain values with good precision, you may use x={({cos(30)*1cm},{sin(30)*1cm})},y={({cos(150)*1cm},{sin(150)*1cm})},z={(0,1cm)} – Paul Gaborit Jun 11 '12 at 11:39
  • 1
    @PolGab yes you are right, I'm influenced by the data of PGF (-3.85mm,-3.85mm) for the z vector. Very strange value, sqrt(2)/4 seems to be more natural. – Alain Matthes Jun 11 '12 at 12:27
17

As @Jake pointed out in a comment, you can specify the coordinate system of your choice as an option of the tikzpicture environment. Here is an example:

\documentclass[a4paper,11pt]{article}

\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[y={(-1cm,0.5cm)},x={(1cm,0.5cm)}, z={(0cm,1cm)}]
% coordinate system
\coordinate (O) at (0, 0, 0);
\draw[-latex] (O) -- +(1, 0,  0) node [right] {$x$};
\draw[-latex] (O) -- +(0,  1, 0) node [left] {$y$};
\draw[-latex] (O) -- +(0,  0, 1) node [above] {$z$};
% rectangles
\draw (3,-1.5,0) -- (3,1.5,0) -- (5,1.5,0) -- (5,-1.5,0) -- cycle;
\draw (6,-1.5,0) -- (6,1.5,0) -- (8,1.5,0) -- (8,-1.5,0) -- cycle;

\end{tikzpicture}
\end{document}

enter image description here

  • 1
    I took the liberty of adding the resulting image; I hope you don't mind. – Gonzalo Medina Jun 12 '12 at 2:42
11

Instead of giving the base vectors as a (x,y) tuple [y={(-1cm,0.5cm)},x={(1cm,0.5cm)}, z={(0cm,1cm)}], I prefer to use (angle:length)

\begin{tikzpicture}[x={(90:1cm)}, y={(0:1cm)}, z={(45:0.7cm)}]

This gives you a better understanding of the vector directions.

  • Your command gives a totally different axis system. Am I missing something or was that your intention? – Saaru Lindestøkke Oct 8 '18 at 9:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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