所以最近我开始尝试绘制 3D 图形。我正在尝试使用 tikz 3d 库绘制 3D 图形。但我遇到了一些问题。
circle
主要是诸如、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]
切换到路径中间的新坐标系。