Overblog
Editer la page Suivre ce blog Administration + Créer mon blog
/ / /


Le script de fonctions d'animation ANIM.JSX doit présent pour pouvoir exécuter ce script. 
 

/************************************************************************
                        ANIMATION
   Brisure
 ************************************************************************
 L'image de reference est brisee en morceaux a partir d'un centre.
 Chaque morceau est ensuite deplace vers l'exterieur (explosion lente).
 ************************************************************************
 L'image de reference doit etre dans le calque selectionn‚.
 La couleur de 1er plan est utilisee pour l'ombre des morceaux.
 La fenetre d'animation doit etre ouverte (et ne contenir normalement
 qu'une image qq).
 Le calque de reference sera deplace en premiere position, et les images
 seront creees devant.
 Pour sauver l'animation faire : Fichier > Sauver pour le Web
 ************************************************************************
 20/08/09 Habaki V1r01 : Creation
 ************************************************************************/
#include "anim.jsx" // Fonctions d'animation

var RulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;

try{
  var PI = 3.14159;
  var PI2 = PI*2;
 
  var Doc = app.activeDocument;
  var Sel = Doc.selection;
  var docH = app.activeDocument.width.value;
  var docV = app.activeDocument.height.value;
 
  //------------------------------
  // Parametres
  //------------------------------
  var Layer0 = Doc.activeLayer; // Image de reference
  var INbMax = 10;  // Nombre d'images a creer
  var ImgTime0 = 1;  // Duree de l'image de reference (s)
  var ImgTime = 0.2;  // Duree des autres images (s)
  var Speed = 40;  // Vitesse de deplacement (pixels)
  var SpeedD = 8;  // Delta de vitesse
  var Rot = 0;  // Rotation (dgs)
  var AMax = 50;  // Angle max d'un morceau (dg)
  var AMin = 5 ;  // Angle min d'un morceau (dg)
  var Cx = docH/2; // Centre de brisure X
  var Cy = docV/2; // Centre de brisure Y
  //------------------------------
 
  var R  = Math.sqrt(docH*docH + docV*docV); // Rayon
  var Layer, Layer1, LayerNb, Nb;
  var Rand;
  var A, A0;   // Angles
  var Angles    = Array();
  var selRegion = Array(Array(Cx,Cy),
                        Array(1, 0),
                        Array(1, 1)
                        );
 
  // Deplace calque de reference au debut
  Layer0.move(Doc.artLayers[0], ElementPlacement.PLACEBEFORE);
 
  // Creation des morceaux
  A0 = 0.0;
  LayerNb = 0;
  while (A0 < PI2) {
    Rand = Math.random(); //1.0..0.0
    A = Rand * AMax;
    if (A < AMin) {A = AMin;}
    A *= PI / 180;
    if (A + A0 > PI2) {A = PI2 - A0;}
    Angles[LayerNb] = A0 + A/2;
   
    // Zone de selection d'un morceau
    selRegion[1][0] = Cx + R*Math.cos(A0);
    selRegion[1][1] = Cy -R*Math.sin(A0);
    selRegion[2][0] = Cx + R*Math.cos(A0+A);
    selRegion[2][1] = Cy -R*Math.sin(A0+A);
   
    // Layer : Morceau
    Layer = Layer0.duplicate();
    LayerNb++;
   
    // Layer1 : Ombre
    Layer1 = Doc.artLayers.add();
    Layer1.move(Layer, ElementPlacement.PLACEAFTER);
    app.activeDocument.activeLayer = Layer1;
    Sel.select(selRegion);
    Sel.fill(app.foregroundColor); // Couleur ombre
    Layer1.translate(25,25);  // Deplace ombre
    Layer1.opacity = 75;
   
    // Decoupe un morceau
    app.activeDocument.activeLayer = Layer;
    Sel.invert();
    Sel.clear();
    Sel.deselect();
   
    // Ombre floue
    Layer1.applyGaussianBlur(10.0); // after deselect
   
    // Fusionne Morceau et son ombre
    // REMARQUE: Certaines ombres vont se retrouver devant
    // d'autres morceaux au debut du deplacement, mais cela
    // donne un effet de choc initial a la brisure.
    // Sinon il faudrait deplacer separement morceaux et ombres.
    Layer.merge();
    A0 += A;
 
  } // while
 
  // Vitesse de deplacement
  Speed = (R/2.05 - SpeedD*INbMax*(INbMax-1)/2)/INbMax;
  //alert(LayerNb + " Pieces" + ", Speed = " + Speed);
 
  // Creation des images de l'animation
  for (INb=1;INb <= INbMax; INb++) {
    // Deplace morceaux
    for (i=0;i < LayerNb;i++) {
      Doc.artLayers[i].translate( Speed*Math.cos(Angles[i]),
                                 -Speed*Math.sin(Angles[i])
                                 );
      if (Rot)
        Doc.artLayers[i].rotate( Rot*(1.0 - Math.random()));
    } // for
    // Augmente vitesse : meilleur effet
    Speed += SpeedD;
   
    // Fusionne les copies des morceaux d'une image
    Layer = Doc.artLayers[LayerNb-1];
    Layer1 = Layer.duplicate();
    Layer1.move(Layer, ElementPlacement.PLACEAFTER);
    Layer1.name = "Image" + INb;
    for (i=LayerNb-2;i >= 0;i--) {
      Layer = Doc.artLayers[i].duplicate();
      Layer.move(Layer1, ElementPlacement.PLACEBEFORE);
      Layer.merge();
    } // for
  } // for
 
  // Destruction des morceaux
  for (i=LayerNb-1; i>=0; i--) {
    Doc.artLayers[i].remove();
  } // for
 
  // Creation animation
  // Chaque image: Image de reference + Image de deplacement
  for (INb=1;INb <= INbMax; INb++) {
   
    if (INb==1) {
      animation_ImageSelect(1); // Deja presente
    } else {
      animation_ImageNew(0);
    }
    animation_ImageTimeSet(0, ImgTime);
    for (i=1;i <= INbMax; i++) {
      animation_LayerShow(0, Layer0.name, true);
      animation_LayerShow(0, "Image" + i, (i==INb ? true : false));
    } // for
  } // for
 
  // En dernier l'image de reference seule
  animation_ImageNew(0);
  animation_ImageTimeSet(0, ImgTime0);
  for (i=1;i <= INbMax; i++) {
    animation_LayerShow(0, Layer0.name, true);
    animation_LayerShow(0, "Image" + i, false);
  } // for
 
} catch(ex) {
 alert(ex.message);
}
app.preferences.rulerUnits = RulerUnits;

Partager cette page
Repost0
Published by Habaki - dans Scripts

Catégories