Proiezione prospettica

import graph;
import animate;
animation A=animation("bezier1");
A.global=false;
defaultpen(fontsize(20pt));
import graph3;
import three;

int NN=20;
real h=1/NN;
triple F_orig(pair uv) {
  real t=uv.x;
  real s=uv.y;
  return (0,t , s);
}

surface surf_o2=surface(F_orig,(-2,-2),(2,2),20,20,Spline);

for(int i=0; i < NN+1; ++i) {
  picture pic;
  size(pic,20cm, 20cm);

  real k=1-2*h*i;

  triple CamPos = (8,30,20);
  triple up = (0,0,1);
  triple target = (-0.5,0,1);
  currentprojection = perspective(CamPos, up, target);
  currentprojection.autoadjust=false;

  draw(pic,-0.5X -- 3X, arrow=Arrow3(), L=Label("$x$", position=EndPoint, align=W));
  draw(pic,-0.5Y -- 3Y, arrow=Arrow3(), L=Label("$y$", position=EndPoint));
  draw(pic,-0.5Z -- 3Z, arrow=Arrow3(), L=Label("$z$", position=EndPoint));
  draw(pic, surf_o2, blue+opacity(0.05),meshpen=black+opacity(0.1),nolight);

  draw(pic, (k,-1,-0.5)--(k,1,-0.5), blue+linewidth(2pt));
  draw(pic, (k,1,0)--(k,1,-0.5), blue+linewidth(2pt));
  draw(pic, (k,1,0)--(k,-1,0), blue+linewidth(2pt));
  draw(pic, (k,-1,0)--(k,-1,-0.5), blue+linewidth(2pt));

  draw(pic, (0,-2/(2-k),-2+3/(2-k))--(0,2/(2-k),-2+3/(2-k)), red+linewidth(2pt));
  draw(pic, (0,2/(2-k), -2+4/(2-k))--(0,2/(2-k),-2+3/(2-k)), red+linewidth(2pt));
  draw(pic, (0,2/(2-k),-2+4/(2-k))--(0,-2/(2-k), -2+4/(2-k)), red+linewidth(2pt));
  draw(pic, (0,-2/(2-k), -2+4/(2-k))--(0,-2/(2-k),-2+3/(2-k)), red+linewidth(2pt));


  draw(pic, (2,0,-2)--(k-2+2,-1,1.5-2), black+dotted+linewidth(2pt));
  draw(pic, (2,0,-2)--(k-2+2,1,1.5-2), black+dotted+linewidth(2pt));
  draw(pic, (2,0,-2)--(k-2+2,1,2-2), black+dotted+linewidth(2pt));
  draw(pic, (2,0,-2)--(k-2+2,-1,2-2), black+dotted+linewidth(2pt));

  draw(pic, (k,-1,-0.5)--(0,-2/(2-k),-2+3/(2-k)), black+dotted+linewidth(2pt));
  draw(pic, (k,1,0)--(0,2/(2-k), -2+4/(2-k)), black+dotted+linewidth(2pt));
  draw(pic, (k,1,-0.5)--(0,2/(2-k),-2+3/(2-k)), black+dotted+linewidth(2pt));
  draw(pic, (k,-1,0)--(0,-2/(2-k), -2+4/(2-k)), black+dotted+linewidth(2pt));

  A.add(pic);
  save();
}

A.movie(loops=3,delay=300);
Link al pdf animato (visualizzabile con Acrobat Reader)