TikZ:在透明物体中绘制物体(3d)

TikZ:在透明物体中绘制物体(3d)

我想用 TikZ 在另一个透明长方体中绘制一个长方体。因此我创建了一个\newcommand来绘制长方体。

\documentclass[11pt, halfparskip]{scrartcl}
\usepackage{ucs}
\usepackage[utf8x]{inputenc}
\usepackage{tikz}

\begin{document}
\newcommand{\cuboid}[7]{
    % bottom
    \draw[#7] (#1, #2, #3) -- ++(#4, 0, 0) -- ++(0, 0, #6) -- ++(-#4, 0, 0) -- cycle;
    % back
    \draw[#7] (#1, #2, #3) -- ++(#4, 0, 0) -- ++(0, #5, 0) -- ++(-#4, 0, 0) -- cycle;
    % left
    \draw[#7] (#1, #2, #3) -- ++(0, 0, #6) -- ++(0, #5, 0) -- ++(0, 0, -#6) -- cycle;
    % right
    \draw[#7] (#1+#4, #2, #3) -- ++(0, 0, #6) -- ++(0, #5, 0) -- ++(0, 0, -#6) -- cycle;
    % front
    \draw[#7] (#1, #2, #3+#6) -- ++(#4, 0, 0) -- ++(0, #5, 0) -- ++(-#4, 0, 0) -- cycle;
    % top
    \draw[#7] (#1, #2+#5, #3) -- ++(#4, 0, 0) -- ++(0, 0, #6) -- ++(-#4, 0, 0) -- cycle;
}
\begin{tikzpicture}


\tikzstyle{bottomfill} = [thick, fill=lightgray, fill opacity=.5]
\tikzstyle{camerafill} = [thick, fill=blue!20]

\cuboid{0}{0}{0}{4}{4}{4}{bottomfill}
\cuboid{1}{1}{1}{1}{1}{1}{camerafill}

\draw[->, thick] (2, 1.5, 1.5) -- ++(4, 0, 0);

\end{tikzpicture}
\end{document}

但结果看起来很奇怪(内部长方体似乎在透明长方体的外面;比较长方体和第二张图的箭头)

在此处输入图片描述

如果我按照正确的 z 顺序添加平面,结果看起来是正确的(但这很累)

\documentclass[11pt, halfparskip]{scrartcl}
\usepackage{ucs}
\usepackage[utf8x]{inputenc}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\tikzstyle{bottomfill} = [thick, fill=lightgray, fill opacity=.5]
\tikzstyle{camerafill} = [thick, fill=blue!20]

% 1 bottom
\draw[bottomfill] (0, 0, 0) -- ++(4, 0, 0) -- ++(0, 0, 4) -- ++(-4, 0, 0) -- cycle;
% 1 back
\draw[bottomfill] (0, 0, 0) -- ++(4, 0, 0) -- ++(0, 4, 0) -- ++(-4, 0, 0) -- cycle;
% 1 left
\draw[bottomfill] (0, 0, 0) -- ++(0, 0, 4) -- ++(0, 4, 0) -- ++(0, 0, -4) -- cycle;

% 2 bottom
\draw[camerafill] (1, 1, 1) -- ++(1, 0, 0) -- ++(0, 0, 1) -- ++(-1, 0, 0) -- cycle;
% 2 back
\draw[camerafill] (1, 1, 1) -- ++(1, 0, 0) -- ++(0, 1, 0) -- ++(-1, 0, 0) -- cycle;
% 2 left
\draw[camerafill] (1, 1, 1) -- ++(0, 0, 1) -- ++(0, 1, 0) -- ++(0, 0, -1) -- cycle;
% 2 right
\draw[camerafill] (1+1, 1, 1) -- ++(0, 0, 1) -- ++(0, 1, 0) -- ++(0, 0, -1) -- cycle;
% 2 front
\draw[camerafill] (1, 1, 1+1) -- ++(1, 0, 0) -- ++(0, 1, 0) -- ++(-1, 0, 0) -- cycle;
% 2 top
\draw[camerafill] (1, 1+1, 1) -- ++(1, 0, 0) -- ++(0, 0, 1) -- ++(-1, 0, 0) -- cycle;

\draw[thick] (2, 1.5, 1.5) -- ++(2, 0, 0);

% 1 right
\draw[bottomfill] (0+4, 0, 0) -- ++(0, 0, 4) -- ++(0, 4, 0) -- ++(0, 0, -4) -- cycle;
% 1 front
\draw[bottomfill] (0, 0, 0+4) -- ++(4, 0, 0) -- ++(0, 4, 0) -- ++(-4, 0, 0) -- cycle;
% 1 top
\draw[bottomfill] (0, 0+4, 0) -- ++(4, 0, 0) -- ++(0, 0, 4) -- ++(-4, 0, 0) -- cycle;

\draw[->, thick] (4, 1.5, 1.5) -- ++(2, 0, 0);
\end{tikzpicture}
\end{document}

结果

在此处输入图片描述

我的问题:在 TikZ 中是否有可能在透明对象中绘制对象而不按正确的 z 顺序添加形状?

答案1

渐近线解决方案?

\documentclass{standalone}
\usepackage{asymptote}

\begin{document}

\begin{asy}[width=8cm,height=8cm]
import three;

currentprojection=perspective(3,6.5,5);
currentlight=(3,7,8);

surface cube1 = scale3(1)*shift((-0.5,-0.5,-0.5))*unitcube;
surface cube2 = scale3(2)*shift((-0.5,-0.5,-0.5))*unitcube;

draw(cube1,lightgrey);
draw(cube2,lightblue+opacity(0.2));

\end{asy}
\end{document}

用 和 进行编译pdflatex file.texasy file-1.asy还有一些其他的pdflatex

在此处输入图片描述

相关内容