3D 对象上的渐变颜色填充与光影效果

3D 对象上的渐变颜色填充与光影效果

我想知道是否可以通过以下方式获得渐变色填充来复制灯光位置蒂克兹。例如,在这些图像(通过一本书拍摄)中,可以明显看出,来自上方的灯光效果使图形更加 3D。

图片示例 1 图片示例 2

到目前为止我最好的尝试是

\documentclass[tikz, border = 1cm]{standalone}
\usetikzlibrary{positioning,shadings}

\begin{document}
\begin{tikzpicture}
[x={(0.866025403cm,-0.5cm)}, y={(0cm,1cm)}, z={(-0.866025403*4cm,-0.5*4cm)}]
\newcommand{\f}{2}


\draw[domain = -pi/4:pi-pi/4, smooth, shading=axis, top color=red,bottom color=red,middle color=white, shading angle = 30]
plot({sin(\x r)},{cos(\x r)},{-\f/2}) -- (0.707106781,-0.707106781,-\f/2) -- (0.707106781,-0.707106781,\f/2) --
plot({cos(\x r)},{sin(\x r)},{\f/2}) -- cycle;
\draw[domain = 0:2*pi, smooth, shading=axis, top color=pink, bottom color=red, shading angle = -60]
plot({sin(\x r)},{cos(\x r)},{\f/2}) -- cycle;

\draw[domain = pi-pi/4:2*pi-pi/4, smooth, dashed]
plot({sin(\x r)},{cos(\x r)},{-\f/2});

\draw[densely dashdotted] (0,0,-\f/2) -- (0,0,\f/2);

\fill (0,0,-\f/2) circle [radius=0.5mm];
\fill (0,0,\f/2) circle [radius=0.5mm];
\end{tikzpicture}
\end{document}

编译后结果为

尝试中的图像

这里的灯光效果看起来不太自然,我真的不知道如何达到与上述示例类似的效果12

答案1

\documentclass[tikz, border=1cm, svgnames]{standalone}
\begin{document}
\begin{tikzpicture}[ultra thick]
\pgfdeclareverticalshading{myshading}{50bp}{
color(0bp)=(pink);
color(15bp)=(HotPink!80!white);
color(30bp)=(pink);
color(40bp)=(white);
color(50bp)=(pink)
}
\begin{scope}[transform canvas={rotate=-30}]
\fill[shading=myshading] (-2,-2.5) arc[start angle=270, end angle=90, x radius=1, y radius=2.5] -- (0,2.5) -- (0,-2.5) --cycle;
\fill[HotPink!80!white] (0,0) circle[x radius=1, y radius=2.5];
\fill[HotPink!90!black] (-135:0.5 and 1) -- (-60:1 and 2.5) arc[start angle=-60, end angle=0, x radius=1, y radius=2.5];
\draw[white] (0,-2.5) arc[start angle=270, end angle=90, x radius=1, y radius=2.5];
\draw (0,2.5) arc[start angle=90, end angle=-90, x radius=1, y radius=2.5];
\draw (0,-2.5) -- (-2,-2.5) arc[start angle=270, end angle=90, x radius=1, y radius=2.5] -- (0,2.5);
\fill[shading=myshading] (0,-1) arc[start angle=270, end angle=90, x radius=0.5, y radius=1] -- (8,1) -- (8,-1) --cycle;
\fill[HotPink!80!white] (8,0) circle[x radius=0.5, y radius=1];
\draw[white] (8,-1) arc[start angle=270, end angle=90, x radius=0.5, y radius=1];
\draw (8,1) arc[start angle=90, end angle=-90, x radius=0.5, y radius=1];
\draw (8,-1) -- (0,-1) arc[start angle=270, end angle=90, x radius=0.5, y radius=1] -- (8,1);
\end{scope}
\useasboundingbox (-5,-5) rectangle (8,4);
\end{tikzpicture}
\end{document}

两个不同粉色色调的圆柱体

由于我不知道如何处理自定义阴影 - 或者如果可以的话,我已经习惯了transform canvas旋转图片。transform canvas这通常是解决问题的最后手段,并且可能会引发其他问题。这里需要手动设置边界框。

相关内容