5

I have two TikZ drawings I would like to combine. One I have drawn 'in 2D', the other I have drawn 'in 3D'. My real drawings are very complicated, but I have created a minimal example to illustrate what I'm trying to do.

Minimal 2D example

\documentclass[margin=5pt]{standalone}
\usepackage{tikz}
\usepackage{graphicx}

\begin{document}
\begin{tikzpicture}

\draw[fill={rgb:blue,1;white,5}] (0,0) -- (2,0) -- (2,2) -- (0,2) -- cycle;

\node at (1,1) (ImageA) {\includegraphics[width=1.5cm]{example-image-a}};

\coordinate (Origin) at (0,0);
\draw[fill=red] (Origin) circle (0.05cm);

\node at (3,2) (Label) {Hello!}; 
\draw[->] (Label) -- (ImageA);

\end{tikzpicture}
\end{document}

enter image description here

Minimal 3D example

\documentclass[margin=5pt]{standalone}
\usepackage{tikz}
\usepackage{graphicx}

\begin{document}
\begin{tikzpicture}[y={(-1cm,0.5cm)},x={(1cm,0.5cm)}, z={(0cm,1cm)}]

\draw[fill={rgb:red,1;white,5}] (0,0,0) -- (3,0,0) -- (3,2,0) -- (0,2,0) -- cycle;

\end{tikzpicture}
\end{document}

enter image description here

What I want the combined drawing to look like:

enter image description here

Is there an easy way to achieve this? My real 2D drawing is really complicated and having to manually re-code every element to make it work in my 3D drawing would be very hard work I feel. Similarly, my 3D drawing is really complicated and I don't want to have to re-code that.

I was hoping there is some easy way to do this. For example, could I select a new origin for my 2D drawing in the 3D drawing, and it re-adjusts my existing 2D code automatically?

9

It is rather easy with the 3d library, using this answer and that follow-up answer. Notice that the image gets reflected because you chose the y-direction negative.

\documentclass[tikz,margin=5pt]{standalone}
\usetikzlibrary{3d}

\begin{document}

\begin{tikzpicture}[y={(-1cm,0.5cm)},x={(1cm,0.5cm)}, z={(0cm,1cm)}]
\draw[fill={rgb:red,1;white,5}] (0,0,0) -- (3,0,0) -- (3,2,0) -- (0,2,0) -- cycle;
\begin{scope}[canvas is yz plane at x=1.25]
\draw[fill={rgb:blue,1;white,5}] (0,0) -- (2,0) -- (2,2) -- (0,2) -- cycle;
\node[transform shape] at (1,1) (ImageA)  {\includegraphics[width=1.5cm]{example-image.pdf}};
\coordinate (Origin) at (0,0);
\draw[fill=red] (Origin) circle (0.05cm);
\node at (3,2) (Label) {Hello!}; 
\draw[->] (Label) -- (ImageA);
\end{scope}
\end{tikzpicture}
\end{document}

enter image description here

If you want the picture not getting reflected, you only need to multiply the y-direction by -1.

\documentclass[tikz,margin=5pt]{standalone}
\usetikzlibrary{3d}

\begin{document}

\begin{tikzpicture}[y={(1cm,-0.5cm)},x={(1cm,0.5cm)}, z={(0cm,1cm)}]
\draw[fill={rgb:red,1;white,5}] (0,0,0) -- (3,0,0) -- (3,2,0) -- (0,2,0) -- cycle;
\begin{scope}[canvas is yz plane at x=1.25]
\draw[fill={rgb:blue,1;white,5}] (0,0) -- (2,0) -- (2,2) -- (0,2) -- cycle;
\node[transform shape] at (1,1) (ImageA)  {\includegraphics[width=1.5cm]{example-image.pdf}};
\coordinate (Origin) at (0,0);
\draw[fill=red] (Origin) circle (0.05cm);
\node at (3,2) (Label) {Hello!}; 
\draw[->] (Label) -- (ImageA);
\end{scope}
\end{tikzpicture}
\end{document}

enter image description here

ADDENDUM: Using the original definition of y, flipping the image and the hello label (xscale=-1 appears odd but the y-direction is the x-direction in the scope), and enhancing the 3D feel.

\documentclass[tikz,margin=5pt]{standalone}
\usetikzlibrary{3d}

\begin{document}

\begin{tikzpicture}[y={(-1cm,0.5cm)},x={(1cm,0.5cm)}, z={(0cm,1cm)}]
\draw[fill=red,opacity=0.3] (1.5,0,0) -- (3,0,0) -- (3,2,0) --
(1.5,2,0) -- cycle;
\begin{scope}[canvas is yz plane at x=1.5]
\draw[fill=blue,opacity=0.3] (0,0) -- (2,0) -- (2,2) -- (0,2) -- cycle;
\node[transform shape,opacity=0.5,xscale=-1] at (1,1) (ImageA)  {\includegraphics[width=1.5cm]{example-image.pdf}};
\node[transform shape,xscale=-1] at (3,2) (Label) {Hello!}; 
\draw[->] (Label) -- (ImageA);
\end{scope}
\draw[fill=red,opacity=0.3] (0,0,0) -- (1.5,0,0) -- (1.5,2,0) -- (0,2,0) -- cycle;
\begin{scope}[canvas is yz plane at x=1.5]
\coordinate (Origin) at (0,0);
\shade[ball color=red] (Origin) circle (0.05cm);
\end{scope}
\end{tikzpicture}
\end{document}

enter image description here

EDIT: Had a screwed-up example-image in my path and calc was not needed.

  • 2
    very nice and neat solution +1 – RockyRock May 17 '18 at 15:38
  • @marmot Thanks for clearing that up. Yes, I agree my definition of y has been confusing! But I found a solution that works for me (keeping my weird y definition). \begin{scope}[canvas is yz plane at x=1.25,xscale=-1,xshift=-2cm] – Milo May 17 '18 at 16:23
  • Original and very nice answer. +1. – Sebastiano May 17 '18 at 20:03
  • Amazing answer!! +1 – caverac May 17 '18 at 20:04
  • @Sebastiano (caverac) Mille grazie! (Merci!) but it is not at all original (yet I refer to the original answers)... – marmot May 17 '18 at 20:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.