12

I'm trying to create a simple spherical quadrant grid using the tikz-3dplot package. The longitudinal grid lines look fine but when I try to create the latitudinal lines I get really strange results that I don't understand. I was expecting to see a series of latitude arcs rotating around the x-axis (so they're not quite the same as latitude lines). Instead, it appears that my attempt to rotate around the x-axis is rotating around all three axes. I'm not sure what I'm doing wrong.

\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-3dplot}

\begin{document}
\tdplotsetmaincoords{60}{155}
\usetikzlibrary{3d}

\begin{tikzpicture}[scale=5,tdplot_main_coords]
\tikzstyle{grid}=[thin,color=red,tdplot_rotated_coords]

\draw[thick,->] (0,0,0) -- (1,0,0) node[anchor=north east]{$x$};
\draw[thick,->] (0,0,0) -- (-1,0,0);
\draw[thick,->] (0,0,0) -- (0,1,0) node[anchor=north west]{$y$};
\draw[thick,->] (0,0,0) -- (0,0,1) node[anchor=south]{$z$};

\foreach \rot in {0, 30, 60, 90} {
    \tdplotsetrotatedcoords{\rot}{0}{0};
    \tdplotdrawarc[grid]{(0,0,0)}{1}{0}{180}{}{};
}

\foreach \rot in {-90, -60, -30, 0, 30, 60, 90} {
    \tdplotsetrotatedcoords{\rot}{90}{0};
    \tdplotdrawarc[grid]{(0,0,0)}{1}{90}{180}{}{};
}

\end{tikzpicture}
\end{document}

Results shown in QTikz

Edit:

After more investigation it appears that attempting to rotate around the x-axis actually rotates around the z-axis, as can be clearly seen in this image. Placing the \rot in the x- or z-position has the same effect.

Image with only x rotated and shortened arcs.

2
  • For the code formatting it is best to select the code and hit the {} symbol which will apply the code formatting (which is just indentation) rather then enter HTML. Also, while code snippets are useful in explanations, it is always best to compose a fully compilable MWE that illustrates the problem including the \documentclass and the appropriate packages so that those trying to help don't have to recreate it. This is especially important for tikz as there are numerous libraries. Mar 23, 2013 at 22:35
  • Oops that's embarrassing, I normally do include a complete example but I forgot to include my QTikz template. The code should now work with pdflatex.
    – asm
    Mar 23, 2013 at 22:41

3 Answers 3

6

Actually,this is not a bug. The rotations are not xyz rotations but rather zyz rotations. To make a 90 degree rotation around the x-axis you can make a 90 degree rotation around the z-axis, followed by a 90 degree rotation around the rotated y-axis, and finaly a 270 degree rotation around the rotated z-axis. These rotations are called Euler rotations. You can read more about Euler rotations on Wikipedia or tikz-3dplot documention.

1
  • I did read that Wikipedia article, but it's still not clear to me how to compute the rotations in order to get a rotation about the x-axis. Say I want the picture to rotate by α about the x-axis. What is the proper sequence of the three angles?
    – Andyc
    Apr 25, 2022 at 15:26
5

This really seems to be a bug, rotations about the y and z axis work as expected, but around the x axis appears to be also to rotate about the z axis. So I think it would be best if you filed a bug report. If you can't wait for it to be fixed, you could use this much slower TikZ version, which uses only a little goniometry and approximating an arc by drawing 180 line segments:

Code

\documentclass[tikz,border=2mm]{standalone}
\usepackage{tikz-3dplot}

\begin{document}

\tdplotsetmaincoords{60}{155}
\usetikzlibrary{3d}
\begin{tikzpicture}[scale=5,tdplot_main_coords]
\tikzstyle{grid}=[thin,color=red,tdplot_rotated_coords]
    \foreach \a in {0,1,...,9}
    {   \draw (1,0,0)
        \foreach \b in  {1,...,180}
        { -- ({cos(\b)},{sin(\b)*cos(10*\a)},{sin(\b)*sin(10*\a)})
        }
        ;
    }
    \foreach \rot in {-90,-80,...,90} {
    \tdplotsetrotatedcoords{\rot}{90}{0};
    \tdplotdrawarc[grid]{(0,0,0)}{1}{90}{180}{}{};
    }
    \draw[thick,->] (-1,0,0) -- (1,0,0) node[anchor=north east]{$x$};
    \draw[thick,->] (0,0,0) -- (0,1,0) node[anchor=north west]{$y$};
    \draw[thick,->] (0,0,0) -- (0,0,1) node[anchor=south]{$z$};
\end{tikzpicture}

\end{document}

Outputenter image description here

4

A solution with PSTricks. Run it with xelatex:

\documentclass{article}
\usepackage{pst-3dplot}
\begin{document}

\begin{pspicture}(-5,0)(15,10)
\psset{unit=3cm,Alpha=45, Beta=15,linecolor=blue!60,linewidth=1.5pt}
\parametricplotThreeD[xPlotpoints=500, yPlotpoints=10](0,180)(0,90){
    /r 1.0 def
    r t cos mul u sin mul 
    r t sin mul u sin mul 
    r u cos  mul }
\parametricplotThreeD[xPlotpoints=500, yPlotpoints=8](0,90)(0,180){
    /r 1.0 def
    r u cos mul t sin mul 
    r u sin mul t sin mul 
    r t cos  mul }
\pstThreeDCoor[xMin=-2,xMax=2.0,yMin=-.5,yMax=2.0, zMin=-.5,zMax=1.5,linecolor=black,linewidth=0.6pt]
\end{pspicture}
\end{document}

enter image description here

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .