19
$\begingroup$

I would like to distort or map a given JPEG so that it looks 3D when viewed from certain angle, as in this YouTube video. The most interesting part of the video:

perspective

I usually use conformal mapping (a complex function) to do my distortions. Can you help me with figuring out which function to use for this?

$\endgroup$
2

1 Answer 1

29
$\begingroup$
lin[cam_, obj_][t_] := cam  t + (1 - t) obj
s[cam_, obj_] := First@Solve[lin[cam, obj][t][[3]] == 0, t];
tr[cam_, obj_] := lin[cam, obj][t] /. s[cam, obj] // FullSimplify

And that's it: tr[ ] is your transformation function. Let's test it with a Rubik's cube, simulating the video you linked. The following boring part is building the cube. We will make only three faces, since the rest aren't visible.

(*The following is a face with random colors*)
d = .05; col := RandomChoice[{Red, Orange, Green, White, Yellow, Blue}];
face := Table[{col, EdgeForm[Black], Polygon[{{i + d, j + d, 0}, {i + 1 - d, j + d, 0}, 
                                              {i + 1 - d, j + 1 - d, 0}, {i + d, j + 1 - d, 0}}]}, 
             {i, 0, 2}, {j, 0, 2}]

(*Now we build a "3-faced-cube"*)
m = RotationTransform[Pi, {0, 1, 0}, 3/2 {1, 0, 1}];
cube = Table[(face /. Polygon[x_] :> Polygon[m /@ (RotateLeft[#, i] & /@ x)]), {i, 0, 2}];
Graphics3D[cube, Axes -> True, Lighting -> {{"Ambient", White}}]

Mathematica graphics

And now (surprise!) we project the cube onto a sheet of paper using the function defined at the top. Let's see two views. First, the one faking a 3D view made by selecting the appropriate ViewPoint and ViewVector (meaning the camera position and direction):

Graphics3D[cube /. Polygon[x_] :> Polygon[tr[{10, -10, 10}, #] & /@ x], 
           Lighting -> "Neutral", ViewVector -> {{10, -10, 10}, {0, 3, 0}}, Boxed -> True]

Mathematica graphics

And now the "real" paper sheet for you to print it and make your own video :)

Framed@Graphics[cube /. (Polygon[x_] :> Polygon[tr[{10, -10, 10}, #] & /@ x]) /. 
                Polygon[x_] :> Polygon[Most /@ x]]

Mathematica graphics

Edit:

Raising and then lowering the camera:

enter image description here .

$\endgroup$
6
  • $\begingroup$ What are we looking at? How does it relate to what we see in the video? $\endgroup$
    – C. E.
    Dec 6, 2013 at 20:51
  • 2
    $\begingroup$ @C. E. The dots on the z==0 plane are the 2-d projection for the front face and top face of the cube as you should draw them to fake the appearance for the camera at a certain position (cam in my code) $\endgroup$ Dec 6, 2013 at 20:54
  • $\begingroup$ @Anon Perhaps it's clear now :) $\endgroup$ Dec 7, 2013 at 6:28
  • $\begingroup$ Much better! Very nice. $\endgroup$
    – C. E.
    Dec 7, 2013 at 11:05
  • $\begingroup$ Love the simplicity of this answer. A published a related demonstration some time ago demonstrations.wolfram.com/… hth $\endgroup$ Dec 9, 2013 at 9:31

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.