Forums Développement Multimédia

Aller au contenu

Rotation terre 3D et stop

PAO Flash

  • Vous ne pouvez pas répondre à ce sujet
Aucune réponse à ce sujet

#1 lillou34

    Ceinture Orange

  • Members
  • PipPipPip
  • 30 messages

Posté 10 November 2012 - 18:40 PM

rebonjour,

je reviens vers vous concernant mon sujet sur la rotation d'une sphère et un arrêt sur celle-ci :

http://forums.mediab...ation-terre-3d/


L'arrêt marche parfaitement, mais la notion de Timer est très aléatoire. Je souhaiterais faire en sorte que le stop s'effectue sur un pays précisément. Aussi je pensais que le plus adéquate et de définir l'arrêt par rapport au degrés de rotation.

Je n'ai pas réussi à l'effectuer sur le code que j'avais trouvé précédemment mais ça marche à partir d'un autre code.

Le voici :


package {

import flash.display.BlendMode;
import flash.display.TriangleCulling;
import flash.display.Sprite;
import flash.display.Shape;
import flash.display.Stage;
import flash.display.BitmapData;
    import flash.display.Bitmap;

import flash.events.Event;

import flash.geom.PerspectiveProjection;
import flash.geom.Matrix3D;
import flash.geom.Vector3D;
import flash.geom.Utils3D;


public class GlobeRenderingTest extends Sprite {
 
  [Embed(source="planisphere.jpg")] // texture
  private var MappingTexture:Class;
 
  [Embed(source="gradientGlobe.jpg")] // shading
  private var GradientBitmap:Class;
 
  protected var shape:Shape;
  protected var shading:Shape;
 
  protected var vertices:Vector.<Number>; // x,y,z -coordinates
  protected var vertexNormals:Vector.<Vector3D>; // normals for each coordinate
  protected var indices:Vector.<int>; // triangle mesh
  protected  var uvtData:Vector.<Number>;// texture mapping u,v,t-coordinates
  protected var uvtShadingData:Vector.<Number>; // u,v,t-coordinates for shading
  protected var projectedVerts:Vector.<Number>;// x,y-screen coordinates
 
  protected var bitmapData:BitmapData;
  protected var gradientBitmapData:BitmapData;
 
  private var i:int;
  protected var lightDirection:Vector3D = new Vector3D(0.6,0.,0.80);
  protected var lightMovement:Matrix3D;
 
  protected var perspective:PerspectiveProjection;
  protected var projectionMatrix:Matrix3D;
  protected var rotAngle:Number = -115.0;
  protected var rotAnglemax:Number = 740.0;
  //protected var binarytest:Number = 0;
  public function GlobeRenderingTest():void {
   init();
  }
 
  protected function init():void {
 
   bitmapData = new MappingTexture().bitmapData;
   gradientBitmapData = new GradientBitmap().bitmapData;
 
   // spr, the container for projected world map:
   addChild(shape= new Shape());
 
   // the container for shading:
   addChild(shading = new Shape());
   shading.blendMode = BlendMode.HARDLIGHT;
 
   // middle of the stage:
   shading.x= shape.x= stage.stageWidth>>1;
   shading.y= shape.y= stage.stageHeight>>1;
 
   perspective= new PerspectiveProjection();
   perspective.fieldOfView = 1.8; // camera angle, in degrees
       
   vertices = new Vector.<Number>();
   projectedVerts = new Vector.<Number>();
   uvtData = new Vector.<Number>();
   uvtShadingData = new Vector.<Number>();
 
   var radius:Number = 1.0;
 
   var j:int, ix:Number = 0.0, iy:Number = 0.0;
 
   // u and v-divisions on the sphere:
   var n:int = 32, m:int = 16;
 
   vertexNormals= new Vector.<Vector3D>();
 
   for (i=0 ; i!=n; i++) {
    ix= i/(n-1)*Math.PI*2.0;
   
    for (j=0 ; j!=m; j++) {
         iy= (j/(m-1)-0.5)*Math.PI;
 
         // polar coordinate:
         var vc:Vector3D = new Vector3D(
                 Math.cos(iy)*Math.cos(ix),  
                 Math.sin(iy),
                 Math.cos(iy)*Math.sin(ix)
                 );
       
         // in case a sphere the normal is so easy:
         vertexNormals.push(vc);
       
         // the coordinate, scaled by radius
         vertices.push(
           radius*vc.x,
           1.05*radius*vc.y,
           radius*vc.z);
       
         // t=0.0, counted by projectVectors:
         uvtData.push( i/(n-1),j/(m-1), 0.0);
         uvtShadingData.push(i/(n-1),j/(m-1), 0.0);
       
         // initialize also the size of this array
         projectedVerts.push(0.0,0.0);
    }
   }
 
   // the triangle mesh:
   indices= new Vector.<int>();
   var ii:int =0;
   for (i=0 ; i!=n-1; i++) {
    for (j=0 ; j!=m-1; j++) {
         indices.push( ii,ii+m+1,ii+1,
                 ii+m,ii+m+1,ii++);
    }
    ii++;
   }
 
 
   var tmp:Number;
   // normalize the lightDirection
   lightDirection.x *= (tmp = 1.0/lightDirection.length);
   lightDirection.y *= tmp;
   lightDirection.z *= tmp;
 
   // animate the light by rotating around some arbitrary axis:
   lightMovement = new Matrix3D();
   lightMovement.prependRotation(2.1,new Vector3D(0.5,0.8,0.1));
   // lightMovement.appendScale(20.0,20.0,20.0);
 
   addEventListener(Event.ENTER_FRAME, update);
  }
 
 
  protected function update(e:Event=null):void {
 
   projectionMatrix = perspective.toMatrix3D();
   // controls the viewpoint:
   projectionMatrix.prependTranslation(0.0,0.0,7.0);
   // rotate the globe:
 
 
   if (rotAngle<rotAnglemax)
   //{/* */
   {
   projectionMatrix.prependRotation( rotAngle+=7, new Vector3D(0.24,0.96,0.0));
   Utils3D.projectVectors(projectionMatrix, vertices,
                 projectedVerts, uvtData);
                 //trace("stop");
   }
   /*else
   {
 
   }
*/

 
 
   /*
    // in case of a sphere and with no need for z-sorting
    // this routine has been commented out
    //
   
    // sorting in z
    var minz:Number;
    for each (var tr in triangles) {
         tr.z = uvtData[3*tr.index0+2];
         if ((minz=uvtData[3*tr.index1+2])<tr.z) tr.z = minz;
         if ((minz=uvtData[3*tr.index2+2])<tr.z) tr.z = minz;
    }
    triangles.sortOn("z", Array.NUMERIC);
   
    i=0;
    for each (tr in triangles) {
         //indices.push(tr.index0,tr.index1,tr.index2);
         indices[i++]=tr.index0;
         indices[i++]=tr.index1;
         indices[i++]=tr.index2;
    }
   */

   // drawing ...
   // first the texture
 
   with (shape.graphics) {
    clear();
    beginBitmapFill(bitmapData  ,
            null,  // no matrix
            false, // = repeat, important for 'moving' the bitmap
            false); // = smooth
    drawTriangles(projectedVerts,
                 indices,
                 uvtData,
                 TriangleCulling.NEGATIVE);
    endFill();
   }
 
   // then the shading:
   updateShading();
   with (shading.graphics) {
    clear();
    beginBitmapFill(gradientBitmapData  ,
            null,  // no matrix
            false, // = repeat, important for 'moving' the bitmap
            false); // = smooth
    drawTriangles(projectedVerts,
                 indices,
                 uvtShadingData,
                 TriangleCulling.NEGATIVE);
    endFill();
   }
  }
 
  protected function updateShading(e:Event=null) :void {
 
   // move the light direction:
   lightDirection = lightMovement.transformVector(lightDirection);
 
   // utils.projectvectors used only once,
   // this copies the t-coordinates
   for (i=uvtData.length-1; i>0; i-=3) uvtShadingData[i]=uvtData[i];
 
   var nrml:Vector3D;
   i=-3;
   for each (nrml in vertexNormals) {
    // dotProduct returns the cosine of the angle between
    // lightDirection and mesh normal,
    // this value in range -1.0..1.0 is mapped to 0.0..1.0 as u-coordinate
    uvtShadingData[i+=3] = 0.5+0.5*nrml.dotProduct(lightDirection);
   }
  }
 
}
}
 


Je parviens à le stoper avec ceci " if (rotAngle<rotAnglemax)"

mon problème est que ce code est une class et que j'ai besoin de l'intégrer à un FLA.

J'ai tenté de modifier le code mais je bloque là dessus :


  [Embed(source="planisphere.jpg")] // texture
  private var MappingTexture:Class;
 
  [Embed(source="gradientGlobe.jpg")] // shading
  private var GradientBitmap:Class;
 


ce n'est visiblement pas adéquat à l'intérieur d'un flash, seulement dans une class.

Comment puis je alors appeler mon image ?

Si quelqu'un a une idée...je sèche totalement...

Merci d'avance !



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)