Drawing 3D Cube 
Let's make 3d cube from these images and place text over it.
 by Kai Reschke from Pixabay
 by enriquelopezgarre from Pixabay

Example code:
ts
import { Canvas, distort, makeCanvas, degreesToRadians } from "@alxcube/lens";
const butterfly = await Canvas.createFromUrl("butterfly.jpg");
const web = await Canvas.createFromUrl("web.jpg");
const boat = await Canvas.createFromUrl("boat.jpg");
// Output square image side size
const outputSize = 210;
// Cube edge size
const edgeSize = (outputSize - 10) / 2;
// Cube center coords
const center = [outputSize / 2, outputSize / 2];
// Create canvas for output image and append it to body
const resultCanvas = makeCanvas(outputSize, outputSize, true);
document.body.appendChild(resultCanvas);
// Calculate cube apexes destination coords.
const north = [center[0], center[1] - edgeSize];
const northWest = [
  Math.cos(degreesToRadians(30)) * -edgeSize + center[0],
  Math.sin(degreesToRadians(30)) * -edgeSize + center[1],
];
const northEast = [
  Math.cos(degreesToRadians(30)) * edgeSize + center[0],
  northWest[1],
];
const southWest = [northWest[0], northWest[1] + edgeSize];
const southEast = [northEast[0], southWest[1]];
const south = [center[0], center[1] + edgeSize];
// Map images to destination apexes coordinates
const argsMap = [
  [butterfly, [north, northEast, center, northWest]],
  [web, [northWest, center, south, southWest]],
  [boat, [northEast, southEast, south, center]],
];
for (const [
  sourceImage,
  [topLeft, topRight, bottomRight, bottomLeft],
] of argsMap) {
  // Map image corners to corresponding destination image points.
  // prettier-ignore
  const controlPoints = [
      0, 0, ...topLeft,
      sourceImage.width - 1, 0, ...topRight,
      sourceImage.width - 1, sourceImage.height - 1, ...bottomRight,
      0, sourceImage.height - 1, ...bottomLeft
  ];
  // Distort image
  const { image } = await distort(sourceImage, "Affine", controlPoints, {
    viewport: true,
  });
  // Get image virtual viewport
  const vp = image.getViewport();
  // Put distorted image on result canvas according to virtual viewport offset
  resultCanvas.getContext("2d").drawImage(image.getResource(), vp.x1, vp.y1);
}
// Load image with text
const text = await Canvas.createFromUrl("white-text.png");
// Distort text image
const { image: circleText } = await distort(text, "Arc", [
  360, // Arc angle — full circle
  0, // Rotation angle - 0 deg
  edgeSize * 0.8, // Outer radius of text circle,
  edgeSize * 0.4, // // Inner radius of text circle
]);
// Get offset of circle center
const { x1: textCenterOffsetX, y1: textCenterOffsetY } =
  circleText.getViewport();
// Draw circle so that circle center will be placed on destination canvas center
resultCanvas
  .getContext("2d")
  .drawImage(
    circleText.getResource(),
    center[0] + textCenterOffsetX,
    center[1] + textCenterOffsetX
  );Drawing result: 

 by