我想勾勒出这幅图
但我无法绘制那些弯曲的夹层。这是我的代码:
\documentclass[dvipsnames,svgnames,x11names,border=5pt]{standalone}
\usepackage{pgfplots}
\usepackage{tikz,tikz-3dplot}
\usetikzlibrary{calc,3d}
\usepackage{graphicx}
\begin{document}
\begin{tikzpicture}
%\useasboundingbox (0.5,0,0) rectangle (10,8,0);
%Glass
\filldraw[ball color=black!50!gray,shading angle=5, fill opacity=0.7, line join=round, draw=none] (1.25,1.2,0) -- (9.75,1.2,0) -- (9.75,1.5,0) --(1.25,1.5,0)--cycle;
\shade[ball color=black!50!gray,shading angle=165, fill opacity=0.7, line join=round, draw=none] (1.25,1.5,0) --(9.75,1.5,0) -- (8,3.7,0) -- (3,3.7,0) -- cycle;
%ITO
\filldraw[ball color=blue!80!green,shading angle=5, fill opacity=0.7, line join=round, draw=none] (1.65,2,0) rectangle (10.19,3,2.2);
\shade[ball color=blue!80!green,shading angle=5, fill opacity=0.7, line join=round, draw=none] (1.635,2.15,0) --(9.36,2.15,0) -- (8.03,3.81,0) -- (2.97,3.81,0) --cycle;
%NiO
\filldraw[ball color=green!50!black!80!blue,shading angle=5, fill opacity=0.7, line join=round, draw=none] (1.9,2.5,0) rectangle (9.93,3.5,2.2);
\shade[ball color=green!50!black!80!blue,shading angle=5, fill opacity=0.7, line join=round, draw=none] (1.885,2.65,0) --(9.1,2.65,0) -- (8.03,3.925,0) -- (2.97,3.925,0) --cycle;
\end{tikzpicture}
\end{document}
另外,我想拥有这些颜色并且旋转我的对象与该示例图像相同,但我无法在乳胶中完成它们!请帮助修改并完成此代码。
答案1
这是另一种方法。
Tikz 不提供线框
虽然 3D 软件包确实提供了一些到 3 个轴 x、y 和 z 的映射,但它不是线框。也就是说,您无法构建线框并根据需要旋转 3D 绘图并填充区域等。它根本不是为此目的而制作的(目前还不是?)。
因此,如果您可以使用 3D-CAD 工具或可以执行此操作的 3D 动画工具,只需使用它,导出为 pdf、png 等,然后通过包将其graphicx
作为普通图像包含在内。
您还可以在节点文本中进行导入,如下所示:
\node at (0,0) {\includegraphics ...};
以艺术家的方式去对待
因此,作为一名艺术家,您只需简单地勾勒出草图,同时将 3D 幻觉考虑进去即可。
这意味着您还可以在 2D 中绘制预先旋转的平面纸张,就像艺术家看到的那样。
对于弧形薄片,下面的代码可以给你一个开始。它还不完美,你可以引入你的球和阴影效果。
因此,您需要做的就是为单个工作表导出合理的坐标,例如使用Paint.net
或类似的程序:
让我们回顾一下要点
这基本思想是提供"\pics"
,它只绘制一张曲面片(在预先感知的 3D 到 2D 映射中),放置您需要的数量并影响它们的颜色。
因此,弯曲的薄板应像
\begin{tikzpicture}
\pic at (0,0) {curv={red!70/red!100/red!60}};
\pic at (-.1,-.3) {curv={orange!70/orange!100/orange!60}};
...
\end{tikzpicture}
因此pic
被称为curv
并且它接受3 parameters
(对于颜色),我想用来分隔/
。
接下来,定义code
for pic
curv
,例如在单独的\tikzset
语句中:
\tikzset{
pics/curv/.style args={#1/#2/#3}{% accept 3 color fills
code={
% ~~~ sheet ~~~~~~~~
\draw[fill=#1] (2.2,-1.4) to [out=170, in=-60] (1.2,-.5)
...
}
}
}
语法有点不同,因为我传递了 3 个参数作为参数args
。
to [in=,out=]
您也可以使用贝塞尔方法,而不是通过角度来定义曲率.. controls ..
。
就是这样。
为了产生幻觉,下面我稍微旋转了第三张纸,但为此目的最好定义一个单独的弯曲纸。
还要注意的是,通过选择视角关闭黑色顶页您发布的图纸可能已经过时,您可能需要将图片剪辑到右侧,或根据需要扩展图纸。
结果和代码
请注意,为了保持幻觉,我将\pic
s 稍微向左下方移动了。
\documentclass[10pt,border=3mm,tikz]{standalone}
\usepackage{tikz}
\tikzset{
pics/curv/.style args={#1/#2/#3}{% accept 3 color fills
code={
% ~~~ sheet ~~~~~~~~
\draw[fill=#1] (2.2,-1.4) to [out=170, in=-60] (1.2,-.5)
-- (0,0)
to [out=280,in=140] (.6,-.9)
-- (2,-1.5) -- (2.2,-1.5) -- cycle;
% ~~~ thickness top ~~~
\draw[fill=#2] (0,0) -- ++(50:1mm) -- ++(1.2,-.5)
-- ++(-140:1mm) -- cycle;
% ~~~ thickness side ~~~
\draw[fill=#3] (2.2,-1.4) to [out=170, in=-60] (1.2,-.5) --
++(50:1mm) to [out=-60,in=170] (2.2,-1.3) -- cycle;
}
}
}
\begin{document}
\begin{tikzpicture}
\pic at (0,0) {curv={red!70/red!100/red!60}};
\pic at (-.1,-.3) {curv={orange!70/orange!100/orange!60}};
\pic[rotate=4] at (-.2,-.7) {curv={blue!70/blue!100/blue!60}};
\end{tikzpicture}
\end{document}
答案2
color map
这并不是试图精确地重现您帖子的屏幕截图,而是一种相对容易地生成此类“图层”的方法。您可以通过调整、绘图函数和循环参数等来自定义外观。
\documentclass[tikz,border=2mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xmin=-1,xmax=0,ymin=-1,ymax=0,
hide axis,
view={-45}{45}]
\pgfplotsinvokeforeach{1,2,3,7,11,15}{
\addplot3[surf,shader=interp,domain=-1:0,domain y=-1:0,point meta=#1+z] {0.1*#1+#1*0.1*x*x};
}
\end{axis}
\end{tikzpicture}
\end{document}