Я новичок в tikz. Я пытаюсь воспроизвести следующее изображение с помощью tikz-3dplot:
Вот что у меня получилось на данный момент. Выглядит не очень, потому что я не могу понять, как правильно параметризовать относительное положение каждого объекта.
\documentclass{article}
\usepackage{tikz,tikz-3dplot}
\begin{document}
\tdplotsetmaincoords{60}{50}
\begin{tikzpicture}[tdplot_main_coords]
% F0
\draw[->] (0,0,0) -- (3.5,0,0) node[anchor=north east]{$x_0$};
\draw[->,>=latex'] (0,0,0) -- (0,0,1) node[anchor=south]{$z_0$};
% F1
\pgfmathsetmacro{\a}{3.5}
\pgfmathsetmacro{\y}{0}
\pgfmathsetmacro{\d}{3}
\pgfmathsetmacro{\theta}{0}
\pgfmathsetmacro{\alpha}{0}
\coordinate (F1) at (\a,\y,\d);
\tdplotsetrotatedcoords{90}{30}{-30};
\tdplotsetrotatedcoordsorigin{(F1)};
% F0 to F1 - length
\draw[dashed] (2.15,0,-1) -- (2.15,0,1);
\draw[->] (0.7,0,0.2) -- (1.5,0,0.2) node[anchor = south]{$a_1$};
\draw[tdplot_rotated_coords,->] (0.15,0,-1.2) -- (0.15,0,-0.7) node[anchor = north west]{$d_1$};
% F1 - Frame
\draw[tdplot_rotated_coords,->] (0,0,0) -- (3,0,0) node[anchor=north west]{$x_1$};
\draw[dashed] (F1) -- (2+\a,\y,\d);
\draw[tdplot_rotated_coords,->] (0,0,-3) -- (0,0,1) node[anchor=south west]{$z_1$};
% F2
\draw[dashed,tdplot_rotated_coords] (2,0,-0.5) -- (2,0,0.5);
\draw[tdplot_rotated_coords] (2,-0.365,-0.5) -- (2,1.5,2);
\end{tikzpicture}
\end{document}
Чего бы мне хотелось добиться, так это настроить систему множественных координат, чтобы было проще рисовать дуги с правильной перспективой, и иметь возможность добавлять больше кадров без необходимости тонкой настройки всего, чтобы пересечение совпадало.
Как настроить множественную 3D-систему координат?
решение1
Я интерпретирую вопрос как определение новых систем координат, которые возникают из старых систем координат путем вращения вокруг некоторых осей. Это обсуждалосьздесь, и я использую один из ответов там. Вращения вокруг осей x, y и z, соответственно, могут быть достигнуты с помощью клавиш roll
, pitch
и
yaws
. Я использую это для воспроизведения больших частей вашего снимка экрана. Вы можете использовать библиотеку 3d
, которая автоматически загружается tikz-3dplot
, чтобы переключиться на одну из координатных плоскостей.
\documentclass[tikz,border=3mm]{standalone}
\usepackage{tikz-3dplot}
\usetikzlibrary{arrows.meta,bending}
\makeatletter
%from https://tex.stackexchange.com/a/375604/121799
%along x axis
\define@key{x sphericalkeys}{radius}{\def\myradius{#1}}
\define@key{x sphericalkeys}{theta}{\def\mytheta{#1}}
\define@key{x sphericalkeys}{phi}{\def\myphi{#1}}
\tikzdeclarecoordinatesystem{x spherical}{% %%%rotation around x
\setkeys{x sphericalkeys}{#1}%
\pgfpointxyz{\myradius*cos(\mytheta)}{\myradius*sin(\mytheta)*cos(\myphi)}{\myradius*sin(\mytheta)*sin(\myphi)}}
%along y axis
\define@key{y sphericalkeys}{radius}{\def\myradius{#1}}
\define@key{y sphericalkeys}{theta}{\def\mytheta{#1}}
\define@key{y sphericalkeys}{phi}{\def\myphi{#1}}
\tikzdeclarecoordinatesystem{y spherical}{% %%%rotation around x
\setkeys{y sphericalkeys}{#1}%
\pgfpointxyz{\myradius*sin(\mytheta)*cos(\myphi)}{\myradius*cos(\mytheta)}{\myradius*sin(\mytheta)*sin(\myphi)}}
%along z axis
\define@key{z sphericalkeys}{radius}{\def\myradius{#1}}
\define@key{z sphericalkeys}{theta}{\def\mytheta{#1}}
\define@key{z sphericalkeys}{phi}{\def\myphi{#1}}
\tikzdeclarecoordinatesystem{z spherical}{% %%%rotation around x
\setkeys{z sphericalkeys}{#1}%
\pgfpointxyz{\myradius*sin(\mytheta)*cos(\myphi)}{\myradius*sin(\mytheta)*sin(\myphi)}{\myradius*cos(\mytheta)}}
\makeatother
% definitions to make your life easier
\tikzset{rotate axes about y axis/.code={
\path (y spherical cs:radius=1,theta=90,phi=0+#1) coordinate(xpp)
(y spherical cs:radius=1,theta=00,phi=90+#1) coordinate(ypp)
(y spherical cs:radius=1,theta=90,phi=90+#1) coordinate(zpp);
},rotate axes about x axis/.code={
\path (x spherical cs:radius=1,theta=00,phi=90+#1) coordinate(xpp)
(x spherical cs:radius=1,theta=90,phi=00+#1) coordinate(ypp)
(x spherical cs:radius=1,theta=90,phi=90+#1) coordinate(zpp);
},
rotate axes about z axis/.code={
\path (z spherical cs:radius=1,theta=90,phi=0+#1) coordinate(xpp)
(z spherical cs:radius=1,theta=90,phi=90+#1) coordinate(ypp)
(0,0,1) coordinate(zpp);
},
pitch/.style={rotate axes about y axis=#1,x={(xpp)},y={(ypp)},z={(zpp)}},
roll/.style={rotate axes about x axis=#1,x={(xpp)},y={(ypp)},z={(zpp)}},
yaw/.style={rotate axes about z axis=#1,x={(xpp)},y={(ypp)},z={(zpp)}}
}
\begin{document}
\tdplotsetmaincoords{70}{120}
\begin{tikzpicture}[tdplot_main_coords,>={Latex[bend]},semithick,line cap=round]
\draw[->] (0,0,0) coordinate (O) -- (1,0,0) node[above]{$x_b$};
\draw[->] (O) -- (0,1,0) node[above]{$y_b$};
\draw[->] (O) -- (0,0,8) node[above]{$z_0=z_b$};
\draw[->] (-0.3,0,1) -- (-0.3,0,3) node[midway,right] {$d_0$};
\path (0,0,6) coordinate (O'); %define new center
\begin{scope}[yaw=80,shift={(O')}]
\draw[->] (O') -- (6,0,0) node[pos=1.1] {$x_0$};
\begin{scope}[canvas is xy plane at z=0]
\draw[->] (1,0.3) -- (3,0.3) node[midway,above] {$a_1$};
\draw[dashed] (O') -- (-80:3);
\draw[->] (-80:1) arc[start angle=-80,end angle=0,radius=1]
node[pos=0.2,below] {$\theta_0$};
\end{scope}
%
\path (4,0,0) coordinate (O''); %define new center
\begin{scope}[roll=320,shift={(O'')}]
\draw[->] (0,0,-1) -- (0,0,6) node[right]{$z_1$};
\draw[->] (0.3,0,2) -- (0.3,0,4) node[midway,right] {$d_1$};
\begin{scope}[canvas is yz plane at x=0]
\draw[dashed] (130:3) -- (310:3);
\draw[->] (130:1) arc[start angle=130,end angle=450,radius=1]
node[pos=0.8,right] {$\alpha_1$};
\end{scope}
%
\path (0,0,5) coordinate (O'''); %define new center
\begin{scope}[yaw=20,shift={(O''')}]
\draw[->] (O''') -- (4.5,0,0) node[pos=1.1] {$x_1$};
\begin{scope}[canvas is xy plane at z=0]
\draw[->] (2.5,-0.5) -- (3.5,-0.5) node[midway,above] {$a_2$};
\draw[dashed] (O''') -- (-20:3);
\draw[->] (340:1) arc[start angle=340,end angle=0,radius=1]
node[pos=0.5,left] {$\theta_1$};
\end{scope}
\end{scope}
\end{scope}
\end{scope}
\end{tikzpicture}
\end{document}