我想用 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.tex
,asy file-1.asy
还有一些其他的pdflatex
。