저는 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}