1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
package
{
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.PerspectiveProjection;
import flash.geom.Point;
import flash.text.TextField;
import flash.text.TextFormat;
public class Main extends Sprite
{
private const thetamax:uint = 20;
private var w:Number;
private var h:Number;
private var dimx:Number;
private var dimy:Number;
private var centre:Point;
private var thetay:Number;
private var thetax:Number;
private var Affichage:TextField = new TextField();
private var Font:TextFormat = new TextFormat();
private var plaque:Sprite = new Sprite();
private var projection:PerspectiveProjection = transform.perspectiveProjection;
private var ptdefuite:Point = projection.projectionCenter;
private var repere:Shape = new Shape();
public function Main():void
{
w = stage.stageWidth;
h = stage.stageHeight;
centre = new Point(w / 2, h / 2);
dimx = 3 * w / 4; //dimensions de la plaque
dimy = 3 * h / 4;
projection.focalLength = 660; //modification de la focale (plus courte pour une distorsion de la plaque et donner une idée de proximité)
with (repere.graphics) //reère (0x,oy)
{
lineStyle(1, 0xFF0000);
moveTo(ptdefuite.x, 0);
lineTo(ptdefuite.x, h);
moveTo(0, ptdefuite.y);
lineTo(w, ptdefuite.y);
}
//pour l'affichege des valeurs des angles
with (Font)
{
font = "arial";
size = 22;
color = 0;
align = "left";
}
with (Affichage)
{
defaultTextFormat = Font;
x = -dimx / 5;
y = -50;
autoSize = "left";
selectable = false;
}
//
with (plaque.graphics)
{
beginFill(0xf0f0f0);
lineStyle(2, 0);
drawRect(-dimx / 2, -dimy / 2, dimx, dimy); //on décale la forme vectorielle interne pour le centre de rotation
}
plaque.x = centre.x;
plaque.y = centre.y;
addChild(plaque);
plaque.addChild(Affichage);
addChild(repere);
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}
private function onMouseMove(e:MouseEvent):void
{
thetay = 2 * (mouseX - centre.x) * thetamax / w; //angle de rotaion en y de -20° à +20°
thetax = -2 * (mouseY - centre.y) * thetamax / h; //angle de rotation en x de -20° à +20°
plaque.rotationY = thetay;
plaque.rotationX = thetax;
thetax = arrondi(thetax);
thetay = arrondi(thetay);
Affichage.text = "angleY= " + thetay.toString() + " °" + " angleX=" + thetax.toString() + " °"; //valeurs des angles
}
private function arrondi(val:Number):Number
{
return Math.round(10 * val) / 10;
}
}
} |
Partager