
最近、3D 図面の描画に取り組み始めました。tikz 3d ライブラリを使用して 3D 図面を描画しようとしています。しかし、いくつか問題に直面しています。
circle
主に、、、などのコマンドは3 次元では機能しないようですarc
がrectangle
、これは平面で機能するため当然です。この問題を回避するために、pgf マニュアルでは、平面を選択し、法線ベクトル上の位置を指定して、その平面に描画するだけであると指定されています。pgfmanual (3.1.6a セクション 40.3) では、これを環境内で実行しますscope
。これの問題は、平面の外側に描画できないことです。
そこで、スコープを入力せずに、、、circle
などのコマンドの平面を選択する方法があるかどうか疑問に思いました。アイデアとしては、たとえばパスの途中で座標系を変更することによって、これらのコマンドをより大きな描画コマンドまたは塗りつぶしコマンドに統合したいということです。
arc
rectangle
\draw (0,0,0) -- ++(1,0,0) arc [yzplane at x=1, start angle=0, end angle = 180, radius=1] -- cycle;
具体的な問題を以下に示します。平面上に円を配置しyz
、それを円錐の円にしたいと考えています。次に、この円の端に線を引くことはできますが、それをどのように陰影付けすればよいかわかりません。
以下に、この円を陰影付けする私の試みを示しますが、ご覧のとおり、平面ではなく平面arc
内に配置しています。xy
yz
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]