编辑新问题表述
我不想扭曲图像以便它适合定义平面的 4 个点。
@abcdefg 提出了一个答案,我看了一下: TikZ 中的文本具有透视效果(不仅仅是倾斜)
这似乎做了我想要做的事情,但我不知道如何将其转换为由 4 个 3D 点界定的图像。
我尝试了以下方法:
\documentclass{standalone}
\usepackage{tikz}
\usepackage[skins]{tcolorbox}
\usepackage{graphicx}
\usepackage{duckuments}
\usetikzlibrary{3d,calc,positioning,perspective}
\makeatother
%
\begin{document}
\begin{tikzpicture}
%Creating the points I want the image to fill withh the image
\coordinate (ll) at (4,-1,0) ;%The lower left corner of the image should go here
\coordinate (lr) at (6,-2,-1) ;%The lower right corner of the image should go here
\coordinate (ur) at (6,1,1) ;%The upper left corner of the image should go here
\coordinate (ul) at (4,1,2) ;%The upper right corner of the image should go here
\foreach \co in {ll,lr,ur,ul}{
\fill[red] (\co) circle (0.1);
}
%Failing at filling the image within the points
\pgfmathdeclarefunction{fxx}{2}{\pgfmathparse{fx(#1+1,#2)-fx(#1,#2)}}
\pgfmathdeclarefunction{fxy}{2}{\pgfmathparse{fy(#1+1,#2)-fy(#1,#2)}}
\pgfmathdeclarefunction{fyx}{2}{\pgfmathparse{fx(#1,#2+1)-fx(#1,#2)}}
\pgfmathdeclarefunction{fyy}{2}{\pgfmathparse{fy(#1,#2+1)-fy(#1,#2)}}
\pgfmathdeclarefunction{gx}{2}{\pgfmathparse{1*#1}}
\pgfmathdeclarefunction{gy}{2}{\pgfmathparse{1*#2}}
\pgfmathdeclarefunction{gz}{2}{\pgfmathparse{#1+13}}
\pgfmathdeclarefunction{fx}{2}{\pgfmathparse{gx(#1,#2)*6/gz(#1,#2)}}
\pgfmathdeclarefunction{fy}{2}{\pgfmathparse{gy(#1,#2)*6/gz(#1,#2)}}
\foreach\i in{4,...,6}{
\foreach\j in{-2,...,1}{
\pgfmathsetmacro\aa{fxx(\i,\j)}
\pgfmathsetmacro\ab{fxy(\i,\j)}
\pgfmathsetmacro\ba{fyx(\i,\j)}
\pgfmathsetmacro\bb{fyy(\i,\j)}
\pgfmathsetmacro\xx{fx (\i,\j)}
\pgfmathsetmacro\yy{fy (\i,\j)}
\pgflowlevelobj{
\pgfsettransformentries{\aa}{\ab}{\ba}{\bb}{\xx cm}{\yy cm}
}{
\clip(1,0)--(0,0)--(0,1)--cycle;
\draw(1,0)--(0,0)--(0,1)--cycle;
\tikzset{shift={(-\i,-\j)}}
\path(0.5,.5)node{\includegraphics{example-image-a}};
}
\pgfmathsetmacro\aa{fxx(\i ,\j+1)}
\pgfmathsetmacro\ab{fxy(\i ,\j+1)}
\pgfmathsetmacro\ba{fyx(\i+1,\j )}
\pgfmathsetmacro\bb{fyy(\i+1,\j )}
\pgfmathsetmacro\xx{fx (\i+1,\j+1)}
\pgfmathsetmacro\yy{fy (\i+1,\j+1)}
\pgflowlevelobj{
\pgfsettransformentries{\aa}{\ab}{\ba}{\bb}{\xx cm}{\yy cm}
}{
\clip(0,0)--(-1,0)--(0,-1)--cycle;
\draw(0,0)--(-1,0)--(0,-1)--cycle;
\tikzset{shift={(-\i-1,-\j-1)}}
\path(0.5,.5)node{\includegraphics{example-image-a}};
}
}
}
\draw[step=5mm] (1,-2) grid (7,1);
\end{tikzpicture}
\end{document}
\end{document}
正如你所见,这一切都毫无作用 ;-(
当然,理想的情况是使用如下命令:
\graphicsto3dsurface{(ll),(lr),(ur),(ul),\includegraphics{example-image-a}
这样图像就位于我的 4 个红点之内。
编辑:以前的表述
标题: fill stretch image
非矩形形状(用于 3D)
我正在 3D 中绘制一些东西,并尝试将一些数据的图像添加到 3D 表面。
为此,我[fill stretch image=example-image-duck]
从tcolorbox
这里的包中找到了命令:如何使用 TikZ 创建填充图像的矩形?
这在 2D 中效果很好,但在 3D 系统中似乎存在问题:它无法扭曲(旋转)图像(或在不同区域以不同程度拉伸图像)。我尝试通过自己旋转图像来解决这个问题。如下所示,效果并不好 ;-(
这可以在下面的 MWE 中看到:
\documentclass{standalone}
\usepackage{tikz}
\usepackage[skins]{tcolorbox}
\usepackage{graphicx}
\usepackage{duckuments}
\usetikzlibrary{3d,calc,positioning}
\begin{document}
\begin{tikzpicture}[z={(90:30mm)},x={(190:30mm)},y ={(-45:24mm)},line join=round]
\path[overlay] (0,0,0) coordinate (O) (1,0,0) coordinate (ex)
(0,1,0) coordinate (ey) (0,0,1) coordinate (ez);
\tikzset{yzx space/.style={x={(ey)},y={(ez)},z={(ex)}}}
\tikzset{xzy space/.style={x={(ex)},y={(ez)},z={(ey)}}}
\tikzset{xyz space/.style={x={(ex)},y={(ey)},z={(ez)}}}
\path[fill stretch image=example-image-duck] (0,0,0) -- ++(0,0,1) -- ++(0,1,0) node[midway,above, sloped] {3D distortion} -- ++(0,0,-1) -- cycle;
\begin{scope}[x={(0:30mm)},y={(90:30mm)}]
\path[fill stretch image=example-image-duck] (-1.2,-0.2) rectangle ++(1,1);
\node[anchor = south] at (-0.7,1) {correct in flat 2D};
\path[fill stretch image=example-image-duck] (-2.3,-0.4) -- ++(1,-0.2) -- ++(0,1.4) -- ++(-1,-0.2) -- cycle;
\node[anchor = south] at (-1.7,1) {2D distortion};
\end{scope}
\path[fill stretch image*={angle=-45}{example-image-duck}] (3,0,0.5) -- ++(0,0,1) -- ++(0,1,0) node[midway,above, sloped] {my Correction attempt} -- ++(0,0,-1) -- cycle;
\end{tikzpicture}
\end{document}
其结果为:
在我看来,这似乎tcolorbox
只是剪切掉图像中超出路径的部分。但这意味着图像的方向不正确。
为了使图像朝向其所在的 3d 表面的方向,对角线example-image-duck
应位于其填充形状的角上。有没有办法确保在 tikz 中发生这种情况?我在文档中找不到tcolorbox
,但这并不能保证它不存在。
受到@abcdefg 的启发,我尝试了周期性地弯曲圆柱体(我还去example-image-a
更好地了解了我是否得到了任何观点,对不起鸭子)
我可能完全误解了答案,但图像本身似乎并没有任何透视效果。
我的问题实际上与图片中 3d 对象的透视关系不大(tikz3d 库解决了这个问题),但在扭曲图像以使其四个角最终位于我想要的位置(由 定义\path
)
这是我尝试过的:
\documentclass{standalone}
\usepackage{tikz}
\usepackage[skins]{tcolorbox}
\usepackage{graphicx}
\usepackage{duckuments}
\usetikzlibrary{3d,calc,positioning,perspective}
\makeatletter
\tikzset{switch on perspective/.code={\def\tikz@parse@splitxyz##1##2##3,##4,{%
\def\pgfutil@next{\tikz@scan@one@point##1(tpp cs:x={##2},y={##3},z={##4})}% https://tex.stackexchange.com/a/365418/194703
}}}
\makeatother
\begin{document}
\begin{tikzpicture}[3d view={140}{30},line join=round]
\begin{scope}[perspective={p={(0.1,0,0),q=(0,40,0),r=0,0,100)}},switch on perspective]
\path[fill stretch image=example-image-a] (0,0,0) -- ++(0,0,1) -- ++(0,1,0) node[midway,above, sloped] {3D distortion} -- ++(0,0,-1) -- cycle;
\end{scope}
\end{tikzpicture}
\end{document}
在试用了该perspective
库和之后,switch on perspective command
我发现它们确实有用。但它们只是没有为图像添加透视效果。