tikzパス内の座標系を変更する方法

tikzパス内の座標系を変更する方法

最近、3D 図面の描画に取り組み始めました。tikz 3d ライブラリを使用して 3D 図面を描画しようとしています。しかし、いくつか問題に直面しています。

circle主に、、、などのコマンドは3 次元では機能しないようですarcrectangle、これは平面で機能するため当然です。この問題を回避するために、pgf マ​​ニュアルでは、平面を選択し、法線ベクトル上の位置を指定して、その平面に描画するだけであると指定されています。pgfmanual (3.1.6a セクション 40.3) では、これを環境内で実行しますscope。これの問題は、平面の外側に描画できないことです。

そこで、スコープを入力せずに、、、circleなどのコマンドの平面を選択する方法があるかどうか疑問に思いました。アイデアとしては、たとえばパスの途中で座標系を変更することによって、これらのコマンドをより大きな描画コマンドまたは塗りつぶしコマンドに統合したいということです。 arcrectangle\draw (0,0,0) -- ++(1,0,0) arc [yzplane at x=1, start angle=0, end angle = 180, radius=1] -- cycle;

具体的な問題を以下に示します。平面上に円を配置しyz、それを円錐の円にしたいと考えています。次に、この円の端に線を引くことはできますが、それをどのように陰影付けすればよいかわかりません。

以下に、この円を陰影付けする私の試みを示しますが、ご覧のとおり、平面ではなく平面arc内に配置しています。xyyz

tikzlibraryを使用してこれを回避する方法はありますか3d? を使用してこれを回避する方法はありますかtikz-3dplot?

\documentclass{standalone}

\usepackage\[T1\]{fontenc}
\usepackage{fontspec}
\usepackage{tikz}
\usepackage{xcolor}
\usetikzlibrary{3d,calc,positioning}

\begin{document}
\begin{tikzpicture}\[z={(90:10mm)},x={(190:10mm)},y ={(-45:10mm)}\]

        \def\circleplace{-2};
        \def\circleSize{0.4}
        \coordinate(coneTop) at (0,0,0);

        \begin{scope}\[canvas is yz plane at x=\circleplace\]
            \draw (0,0) circle (\circleSize);
            \draw\[thick, dashed\] (135:\circleSize) arc \[start angle = 135, end angle = 315, radius=\circleSize\]; 
        \end{scope}

        \filldraw\[fill = red, fill opacity = 0.2\] (coneTop) -- (\circleplace,{\circleSize*cos(135)},{\circleSize*sin(135)}) arc \[start angle= 135, delta angle =  180, radius = 0.4\] -- cycle;
        \draw\[dashed\] (\circleplace,{\circleSize*cos(135)},{\circleSize*sin(135)}) arc \[start angle= 135, delta angle = -180, radius = 0.4\];

        \draw (coneTop) -- (\circleplace,{\circleSize*cos(135)},{\circleSize*sin(135)});
        \draw (coneTop) -- (\circleplace,{\circleSize*cos(315)},{\circleSize*sin(315)});

        \draw (1,0,0) -- ++(1,0,0) node\[anchor=south\]{$x$};
        \draw (1,0,0) -- ++(0,1,0) node\[anchor=south\]{$y$};
        \draw (1,0,0) -- ++(0,0,1) node\[anchor=south\]{$z$};
    \end{tikzpicture}

\end{document}

ここに画像の説明を入力してください

答え1

達成したいことは、シンボリック座標を使用することで実現できます。平面内に到達するスコープ内からシンボリック座標にアクセスできます。

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{3d}
\begin{document}
\begin{tikzpicture}[z={(90:10mm)},x={(190:10mm)},y ={(-45:10mm)},line cap=round,line join=round]
 \path (0,0,0) coordinate (O) (1,0,0) coordinate (X);
 \begin{scope}[canvas is yz plane at x=0]
  \draw (O) -- (X) arc[start angle=0, end angle = 180, radius=1] -- cycle;
 \end{scope}
\end{tikzpicture}
\end{document}

パス内の座標系を変更できることに注意してください。

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{3d}
\begin{document}
\begin{tikzpicture}[z={(90:10mm)},x={(190:10mm)},y ={(-45:10mm)},line cap=round,line join=round]
 \draw (0,0,0) -- ++(1,0,0) [canvas is yz plane at x=0]
 arc[start angle=0, end angle = 180, radius=1] -- cycle;
\end{tikzpicture}
\end{document}

ライブラリのスタイルに付属する投影が不要な場合もあります。その場合は、パスに挿入できる3d独自の投影を設定できます。[yzplane]

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{3d}
\begin{document}
\begin{tikzpicture}[z={(90:10mm)},x={(190:10mm)},y ={(-45:10mm)},line cap=round,line join=round]
 \path[overlay] (0,0,0) coordinate (O) (1,0,0) coordinate (ex)
  (0,1,0) coordinate (ey) (0,0,1) coordinate (ez);
 \tikzset{yz plane/.style={x={(ey)},y={(ez)}}} 
 \draw (0,0,0) -- ++(1,0,0) [yz plane]
 arc[start angle=0, end angle = 180, radius=1] -- cycle;
\end{tikzpicture}
\end{document}

つまり、 を使用する場合、パス内にまたは を挿入して、パスの途中で新しい座標系に切り替えることtikz-3dplotができます。[tdplot_main_coords][tdplot_screen_coords]

関連情報