我正在尝试制作一个带有曲面和云中的 1000 个点的 3D 图,其中一些点将隐藏在曲面后面,但由于曲面的透明度而略微可见。但是,无论我做什么,所有点都是完全可见的,曲面绘制在隐藏点的后面。为了说明这个问题,我做了一个简单的例子,有两个点和一个透明曲面。上面的点没有被曲面隐藏,应该完全可见。第二个点被曲面隐藏,应该绘制在透明曲面后面,但与第一个点一样可见。有什么关于如何处理这个问题的建议吗?
\documentclass[tikz]{standalone}
\usepackage{amsmath}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}[view={25}{30}]
\addplot3 [color=green, draw=none, mark=*, mark size=2]
table[row sep=crcr] {%
0 -4 10\\
0 0 -15\\
};
\addplot3 [
surf,
shader=faceted,
fill opacity=0.75,
samples=25,
domain=-4:4,
y domain=-4:4
] {x^2-y^2};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
这是安装过滤器的erahfeza答案的扩展。这里的过滤器检查点是在表面上方还是下方。(它不是绝对完美的,因为点可能“位于”整个表面的“后面” y
。我假设您没有这样的点。如果有,则需要考虑这种可能性。然后过滤器将取决于视角。)
\documentclass[tikz]{standalone}
\usepackage{amsmath}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\pgfplotsset{
layers/my layer set/.define layer set={
background,
main,
foreground
}{
},
set layers=my layer set,
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[view={25}{30},mark layer=like plot]
\addplot3 [color=green, draw=none, mark=*, mark size=2,
on layer=background,
z filter/.expression={z<x^2-y^2 ? z : nan}]
table[row sep=crcr] {%
0 0 15\\
0 0 -15\\
};
\addplot3 [color=green, draw=none, mark=*, mark size=2,
on layer=foreground,
z filter/.expression={z>x^2-y^2 ? z : nan}]
table[row sep=crcr] {%
0 0 15\\
0 0 -15\\
};
\addplot3 [
surf,
shader=faceted,
fill opacity=0.75,
samples=25,
domain=-4:4,
y domain=-4:4,
on layer=main,
] {x^2-y^2};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
您应该需要\addplots
在不同的图层上绘制。
\documentclass[tikz]{standalone}
\usepackage{amsmath}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\pgfplotsset{
layers/my layer set/.define layer set={
background,
main,
foreground
}{
},
set layers=my layer set,
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[view={25}{30}]
\addplot3 [color=green, draw=none, mark=*, mark size=2]
table[row sep=crcr] {%
0 0 15\\
0 0 -15\\
};
\addplot3 [
surf,
shader=faceted,
fill opacity=0.75,
samples=25,
domain=-4:4,
y domain=-4:4,
on layer=foreground,
] {x^2-y^2};
\end{axis}
\end{tikzpicture}
\end{document}