使用 tikz-3dplot 绕轴旋转

使用 tikz-3dplot 绕轴旋转

我对以下代码有点困惑。我认为下面的代码会产生一个围绕 x、y 和 z 轴旋转 90 度的动画,但动画的第一部分看起来像是围绕 z 轴而不是 x 轴旋转。有什么想法吗?

\documentclass[xcolor=dvipsnames]{beamer}
\usepackage{tikz}
\usepackage[english]{babel}
\usepackage{animate}  % Animations
\usepackage{tikz-3dplot}

\usepgflibrary{arrows}
\usetikzlibrary{decorations.markings, arrows, decorations.pathmorphing,
   backgrounds, positioning, fit, shapes.geometric}

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

\begin{document}
\begin{frame}
  \begin{center}
    \begin{animateinline}[autoplay, controls, poster=first]{60}
      \multiframe{90}{iFrame=0+1}{
        \tdplotsetmaincoords{0}{0}
        \begin{tikzpicture}[tdplot_main_coords]
          \draw (-5cm, -3cm) rectangle (5cm, 3cm);

          \tdplotsetrotatedcoords{\iFrame}{0}{0}
          \begin{scope}[color=red,
                        tdplot_rotated_coords,
                        xshift=-3cm,scale=0.25]
            \drawaxes
          \end{scope}

          \tdplotsetrotatedcoords{0}{\iFrame}{0}
          \begin{scope}[color=red,tdplot_rotated_coords,scale=0.25]
            \drawaxes
          \end{scope}

          \tdplotsetrotatedcoords{0}{0}{\iFrame}
          \begin{scope}[color=red,
                        tdplot_rotated_coords,
                        xshift=3cm,scale=0.25]
            \drawaxes
          \end{scope}
        \end{tikzpicture}
      }
    \end{animateinline}
  \end{center}
\end{frame}
\end{document}

答案1

您陈述的问题是由于 Jeff Hein 在 tikz-3dplot 中采用的惯例造成的。

正如他所解释的那样,他选择了欧拉 zyz 约定(我猜这是天体物理学中使用最广泛的约定)。

语法:\tdplotsetrotatedcoords{α}{β}{γ}

参数:α 旋转框架绕世界 z 轴旋转的角度(以度为单位)。β 旋转框架绕世界 y 轴旋转的角度(以度为单位)。γ 旋转框架绕世界 z 轴旋转的角度(以度为单位)。

您想要围绕 z、y 和 x 轴进行旋转,通常称为航海角(或 Tait-Bryan、Cardan 或 zyx 欧拉角...)。

改变所用约定的一个好方法是重新定义 \tdplotsetrotatedcoords 使用的旋转矩阵,如tikz-3dplot 中的导航系统坐标

答案2

如果其他人遇到同样的问题,这里有一个解决方法。使用\tdplotsetmaincoords{rotationX}{0},绘制旋转,然后切换回\tdplotsetmaincoords{0}{0}正常绘制。例如,在我上面发布的代码中,替换

      \tdplotsetrotatedcoords{0}{\iFrame}{0}
      \begin{scope}[color=red,tdplot_rotated_coords,scale=0.25]
        \drawaxes
      \end{scope}

      \tdplotsetmaincoords{\iFrame}{0}
      \begin{scope}[color=red,tdplot_main_coords,scale=0.25]
        \drawaxes
      \end{scope}
      \tdplotsetmaincoords{0}{0}

它可能不是最优雅的解决方案,但它似乎对我试图制作的动画起了作用。

相关内容