# Inertial and Local Vertical Local Horizontal reference frames using TikZ

How can I create a simple 3D diagram containing two reference frames using the TikZ package? For reference purpose, the diagram may look approximately like this one:

• Welcome to TeX.SX! On this site, a question should typically revolve around an abstract issue (e.g. "How do I get a double horizontal line in a table?") rather than a concrete application (e.g. "How do I make this table?"). Questions that look like "Please do this complicated thing for me" tend to get closed because they are either "off topic", "too broad", or "unclear". Please try to make your question clear and simple by giving a minimal working example (MWE): you'll stand a greater chance of getting help. – user36296 Dec 26 '16 at 14:27
• @samcarter I edited the comment as you suggested. Are the changes OK? – Lionel Dec 26 '16 at 14:38
• Have you tried anything yourself? If so, please add the code you have. (\draw [-latex] (0,0,0) -- (4,0,0) node [right] {$i_1$}; and similar will get you a long way I think.) – Torbjørn T. Dec 26 '16 at 14:48

TikZ lets you specify coordinates in three dimensions, which it projects onto the page. Importantly, you can specify (and locally change) that projection. If you want to use several coordinate systems in the same image, you might want to set styles for them.

\documentclass[tikz, border=5pt]{standalone}
\usetikzlibrary{calc}
\tikzset{
> = {stealth},
% specifying distances in cm puts them in the paper coordinates,
% without units puts them in these tikz xy(z) coordinates
inertial frame/.style = {x={(-20:2cm)}, y={(-160:2cm)}, z={(90:2cm)}},
local frame/.style = {shift={(local origin)}, x={(40:.7cm)}, y={(150:.7cm)}, z={(105:.7cm)}}
}

\begin{document}
\begin{tikzpicture}[scale=2, inertial frame]
% draw axes
\draw[->] (0,0,0) -- (1,0,0) node[above] {$i_1$};
\draw[->] (0,0,0) -- (0,1,0) node[above] {$i_2$};
\draw[->] (0,0,0) -- (0,0,1) node[left] {$i_3$};
% draw dashed lines and set the coordinate (local origin) which is used in the local frame style
\draw[dashed] (0,0,0) -- ++(15:1) coordinate (projection) -- ++(0,0,1) coordinate (local origin);

\draw[very thick, ->] (0,0,0) -- (local origin);
\draw[<->] (90:.5) arc (90:15:.5) node[below, pos=.5] {$\alpha$};
% arcs are drawn in the x-y plane, so locally set x and y to an orthonormal basis to the desired plane
\draw[y={(0,0,1)}, x={(projection)}, <->] (0:.4) arc (0:45:.4) node[right, pos=.5] {$\delta$};

\begin{scope}[local frame]
% draw local axes
\draw[->] (0,0,0) -- (1,0,0) node[above] {$l_1$};
\draw[->] (0,0,0) -- (0,1,0) node[above] {$l_2$};
\draw[->] (0,0,0) -- (0,0,1) node[left] {$l_3$};
% draw right angle
\draw[thin] (.2,0,0) -- (.2,.2,0) -- (0,.2,0);
\end{scope}\end{tikzpicture}
\end{document}


Since the above style for local frame refers to the coordinate (local origin), you need to define that coordinate before using the style.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows}
\pagestyle{empty}
\begin{document}
\begin{tikzpicture}[line cap=round,line join=round,>=triangle 45,x=1.0cm,y=1.0cm]
\clip(-3.52,-2.76) rectangle (7.36,5.76);
\draw (0,0) -- (-23.1:1.4) arc (-23.1:43.3:1.4) -- cycle;
\draw [->] (0.,0.) -- (0.,4.);
\draw [->] (0.,0.) -- (-2.84,-2.02);
\draw [->,line width=1.6pt] (0.,0.) -- (3.84,3.62);
\draw [dash pattern=on 4pt off 4pt] (3.84,3.62)-- (3.84,-1.64);
\draw [dash pattern=on 4pt off 4pt] (0.,0.)-- (3.84,-1.64);
\draw [shift={(-0.4,1.76)}] plot[domain=4.4:5.3,variable=\t]({1.*2.79*cos(\t r)+0.*2.79*sin(\t r)},{0.*2.79*cos(\t r)+1.*2.79*sin(\t r)});
\draw [->] (0.,0.) -- (5.34,-1.3);
\draw [->] (3.84,3.62) -- (2.2,4.42);
\draw [->] (3.84,3.62) -- (3.44,5.5);
\draw [->] (3.84,3.62) -- (5.28,4.78);
\draw (3.4,3.85)-- (3.8,4.22);
\draw (3.8,4.22)-- (4.28,4);
\draw (-0.54,4.74) node[anchor=north west] {$\mathbf{i_3}$};
\draw (-3.2,-1.4) node[anchor=north west] {$\mathbf{i_2}$};
\draw (0.08,-0.9) node[anchor=north west] {$\mathbf{\alpha}$};
\draw (1.4,0.8) node[anchor=north west] {$\mathbf{\delta}$};
\draw (5.48,-0.96) node[anchor=north west] {$\mathbf{i_1}$};
\draw (3.66,5.82) node[anchor=north west] {$\mathbf{i_3}$};
\draw (5.36,5.5) node[anchor=north west] {$\mathbf{i_1}$};
\draw (1.9,5.28) node[anchor=north west] {$\mathbf{i_2}$};
\begin{scriptsize}
\draw [fill=white] (0.,0.) circle (0.5pt);
\end{scriptsize}
\end{tikzpicture}
\end{document}