8

I would like to draw a cube using Tikz with some faces of the cube having a texture on it (texture would be a PNG image)

my current code is at follows :

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{3d,calc}
\tikzset{persp/.style={scale=3.0,x={(-0.8cm,-0.4cm)},y={(0.8cm,-0.4cm)}, z={(0cm,1cm)}},points/.style={fill=white,draw=black,thick}}

\begin{document}
\begin{tikzpicture}[persp]\def\i{-15}
    \pgfmathparse{cos(\i)}\let\ci\pgfmathresult
    \pgfmathparse{sin(\i)}\let\si\pgfmathresult 
    \coordinate (Ocube) at (0,0,0);
    \coordinate (Xcube) at (\ci,\si,0);
    \coordinate (Ycube) at (-\si,\ci,0);
    \coordinate (Zcube) at (0,0,1);
    \coordinate (C0) at ($(Ocube)-(Xcube)-(Ycube)-(Zcube)$);
    \coordinate (C1) at ($(Ocube)+(Xcube)-(Ycube)-(Zcube)$);
    \coordinate (C2) at ($(Ocube)-(Xcube)+(Ycube)-(Zcube)$);
    \coordinate (C3) at ($(Ocube)+(Xcube)+(Ycube)-(Zcube)$);
    \coordinate (C4) at ($(Ocube)-(Xcube)-(Ycube)+(Zcube)$);
    \coordinate (C5) at ($(Ocube)+(Xcube)-(Ycube)+(Zcube)$);
    \coordinate (C6) at ($(Ocube)-(Xcube)+(Ycube)+(Zcube)$);
    \coordinate (C7) at ($(Ocube)+(Xcube)+(Ycube)+(Zcube)$);
    \fill[black!20, draw=black, dashed,opacity=0.3] (C0)--(C1)--(C3)--(C2)--cycle;
    \fill[black!20, draw=black, dashed,opacity=0.3] (C0)--(C1)--(C5)--(C4)--cycle;
    \fill[black!20, draw=black, dashed,opacity=0.3] (C0)--(C2)--(C6)--(C4)--cycle;
    \fill[black!20, draw=black, thick,opacity=0.3] (C4)--(C5)--(C7)--(C6)--cycle;
    \fill[black!20, draw=black, thick,opacity=0.3] (C2)--(C3)--(C7)--(C6)--cycle;
    \fill[black!20, draw=black, thick,opacity=0.3] (C1)--(C3)--(C7)--(C5)--cycle;   
    \coordinate (Q0) at ($(Ocube)-.8*(Xcube)+(Ycube)-.8*(Zcube)$);
    \coordinate (Q1) at ($(Ocube)+.8*(Xcube)+(Ycube)-.8*(Zcube)$);
    \coordinate (Q2) at ($(Ocube)-.8*(Xcube)+(Ycube)+.8*(Zcube)$);
    \coordinate (Q3) at ($(Ocube)+.8*(Xcube)+(Ycube)+.8*(Zcube)$);
    \fill[white!20, draw=black, thick,opacity=0.3] (Q0)--(Q1)--(Q3)--(Q2)--cycle;
\end{tikzpicture}
\end{document}

On the last line, rather then filling white a color (white!20), I would like to draw the image "face.png". This drawing must be distorded so to fit the face realisticaly.

Could someone help me doing that ?

2
  • Welcome to TeX.SX! Please make your code compilable (if possible), or at least complete it with \documentclass{...}, the required \usepackage's, \begin{document}, and \end{document}. That may seem tedious to you, but think of the extra work it represents for TeX.SX users willing to give you a hand. Help them help you: remove that one hurdle between you and a solution to your problem.
    – jub0bs
    Commented Mar 25, 2014 at 11:17
  • I juste edited my code, sorry
    – Amxx
    Commented Mar 25, 2014 at 11:27

2 Answers 2

3

Not exactly an answer to the question, but it is fun.

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{backgrounds}

\begin{document}
\begin{tikzpicture}
  \draw[yellow,yslant=0.5] (0,0) rectangle (2,2);
  \node[yslant=0.5,anchor=center,opacity=0.3]  at (1,1.5) {\includegraphics[width=2cm,height=2cm]{example-image-a}};
  \draw[magenta,yslant=-0.5] (-2,2) rectangle (0,0);
  \node[yslant=-0.5,anchor=center,opacity=0.3]  at (-1,1.5) {\includegraphics[width=2cm,height=2cm]{example-image-b}};
  \begin{scope}[on background layer]
  \draw[orange,yslant=-0.5] (0,2) rectangle (2,4);
  \node[yslant=-0.5,anchor=center,xshift=0cm,yshift=1cm,opacity=0.3]  at (1,1.5) {\includegraphics[width=2cm,height=2cm]{example-image-b}};
  \draw[green,yslant=0.5,,xshift=-2cm,yshift=2cm] (0,0) rectangle (2,2);
  \node[yslant=0.5,anchor=center,xshift=-2cm,yshift=2cm,opacity=0.3]  at (1,1.5) {\includegraphics[width=2cm,height=2cm]{example-image-a}};
\draw[blue,yslant=-0.5,xslant=1] (-2,0) rectangle (0,2);
\node[yslant=-0.5,anchor=center,xshift=0cm,yshift=2cm,xslant=1,opacity=0.3]  at (-0,-1) {\includegraphics[width=2cm,height=2cm]{example-image-a}};
  \end{scope}
  \draw[red,yslant=-0.5,xslant=1] (-4,2) rectangle (-2,4);
\node[yslant=-0.5,anchor=center,xshift=0cm,yshift=4cm,xslant=1,opacity=0.3]  at (-0,-1) {\includegraphics[width=2cm,height=2cm]{example-image-a}};

\end{tikzpicture}
\end{document}

enter image description here

2
  • Some explanation text would have been welcom but I manage to make it work. However, I had to manualy tweak yslant, and it's therefore not a good solution in as it doesnt adapt to my a variable based projection.
    – Amxx
    Commented Mar 25, 2014 at 16:04
  • @Amxx That is why it is not an exact answer :) But this was the easiest.
    – user11232
    Commented Mar 25, 2014 at 22:55
5

There are several questions on the site which address filling a shape with an image in TikZ, for example:

We can adapt those solutions to your 3D shape. We use \clip to restrict to the front square of the cube, then add the image, and finally we draw the border around it.

I’ve replaced the line:

\fill[white!20, draw=black, thick,opacity=0.3] (Q0)--(Q1)--(Q3)--(Q2)--cycle;

with

\def\frontsquare{(Q0)--(Q1)--(Q3)--(Q2)--cycle}

\begin{scope}
    \clip \frontsquare;
    \node {\includegraphics{grass.jpg}};
\end{scope}

\draw[black, thick] \frontsquare;

First I define \frontsquare to the area you want to fill. The \clip contained in the scope restricts everything else we draw to within that area, until \end{scope}. When I use \includegraphics to add an image, only the part of the image that is within the front square. The \draw command then adds a border.

This is what the resulting cube looks like:

enter image description here

and here’s the complete code:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{3d,calc}
\tikzset{persp/.style={scale=3.0,x={(-0.8cm,-0.4cm)},y={(0.8cm,-0.4cm)}, z={(0cm,1cm)}},points/.style={fill=white,draw=black,thick}}

\begin{document}
\begin{tikzpicture}[persp]\def\i{-15}
    \pgfmathparse{cos(\i)}\let\ci\pgfmathresult
    \pgfmathparse{sin(\i)}\let\si\pgfmathresult 
    \coordinate (Ocube) at (0,0,0);
    \coordinate (Xcube) at (\ci,\si,0);
    \coordinate (Ycube) at (-\si,\ci,0);
    \coordinate (Zcube) at (0,0,1);
    \coordinate (C0) at ($(Ocube)-(Xcube)-(Ycube)-(Zcube)$);
    \coordinate (C1) at ($(Ocube)+(Xcube)-(Ycube)-(Zcube)$);
    \coordinate (C2) at ($(Ocube)-(Xcube)+(Ycube)-(Zcube)$);
    \coordinate (C3) at ($(Ocube)+(Xcube)+(Ycube)-(Zcube)$);
    \coordinate (C4) at ($(Ocube)-(Xcube)-(Ycube)+(Zcube)$);
    \coordinate (C5) at ($(Ocube)+(Xcube)-(Ycube)+(Zcube)$);
    \coordinate (C6) at ($(Ocube)-(Xcube)+(Ycube)+(Zcube)$);
    \coordinate (C7) at ($(Ocube)+(Xcube)+(Ycube)+(Zcube)$);
    \fill[black!20, draw=black, dashed,opacity=0.3] (C0)--(C1)--(C3)--(C2)--cycle;
    \fill[black!20, draw=black, dashed,opacity=0.3] (C0)--(C1)--(C5)--(C4)--cycle;
    \fill[black!20, draw=black, dashed,opacity=0.3] (C0)--(C2)--(C6)--(C4)--cycle;
    \fill[black!20, draw=black, thick,opacity=0.3] (C4)--(C5)--(C7)--(C6)--cycle;
    \fill[black!20, draw=black, thick,opacity=0.3] (C2)--(C3)--(C7)--(C6)--cycle;
    \fill[black!20, draw=black, thick,opacity=0.3] (C1)--(C3)--(C7)--(C5)--cycle;   
    \coordinate (Q0) at ($(Ocube)-.8*(Xcube)+(Ycube)-.8*(Zcube)$);
    \coordinate (Q1) at ($(Ocube)+.8*(Xcube)+(Ycube)-.8*(Zcube)$);
    \coordinate (Q2) at ($(Ocube)-.8*(Xcube)+(Ycube)+.8*(Zcube)$);
    \coordinate (Q3) at ($(Ocube)+.8*(Xcube)+(Ycube)+.8*(Zcube)$);

    \def\frontsquare{(Q0)--(Q1)--(Q3)--(Q2)--cycle}

    \begin{scope}
        \clip \frontsquare;
        \node {\includegraphics{grass.jpg}};
    \end{scope}

    \draw[black, thick] \frontsquare;
\end{tikzpicture}
\end{document}
3
  • I saw such exemples, but they don't fit my needs as they just clip the image to the polygone. In my case the image is a QRcode and i would like it to fit the square face which means distord it accordingly
    – Amxx
    Commented Mar 25, 2014 at 12:09
  • @Amxx: Of course. I’ve picked a bad image: the grass doesn’t show the lack of perspective transform. Playing with the tikz-3dplot library might give a way to fix it, but I can’t think of one off the top of my head.
    – alexwlchan
    Commented Mar 25, 2014 at 12:12
  • That's precisely what I'm looking for
    – Amxx
    Commented Mar 25, 2014 at 13:59

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .