编辑新问题表述

编辑新问题表述

编辑新问题表述

我不想扭曲图像以便它适合定义平面的 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我发现它们确实有用。但它们只是没有为图像添加透视效果。

相关内容