
Код AS3:
package
{
import flash.display.BitmapData;
import flash.display.Graphics;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.Rectangle;
import flash.utils.getTimer;
public class Triangles extends Sprite
{
// plane vertex coordinates (and t values)
private var x1:Number = -100, y1:Number = -100, z1:Number = 0, t1:Number = 0;
private var x2:Number = 100, y2:Number = -100, z2:Number = 0, t2:Number = 0;
private var x3:Number = 100, y3:Number = 100, z3:Number = 0, t3:Number = 0;
private var x4:Number = -100, y4:Number = 100, z4:Number = 0, t4:Number = 0;
private var focalLength:Number = 200;
// 2 triangles for 1 plane, indices will always be the same
private var indices:Vector.<int>;
private var container:Sprite;
private var bitmapData:BitmapData;
public function Triangles()
{
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
indices = new Vector.<int>();
indices.push(0,1,3, 1,2,3);
bitmapData = new BitmapData(200, 200, false, 0x00000000);
bitmapData.fillRect(new Rectangle(2, 2, 196, 196), 0xFFFFFF);
container = new Sprite(); // container to draw triangles in
container.x = 200;
container.y = 200;
addChild(container);
addEventListener(Event.ENTER_FRAME, rotatePlane);
}
private function rotatePlane(event:Event):void {
// rotate vertices over time
var ticker:Number = getTimer()/400;
z2 = z3 = -(z1 = z4 = 100*Math.sin(ticker));
x2 = x3 = -(x1 = x4 = 100*Math.cos(ticker));
// calculate t values
t1 = focalLength/(focalLength + z1);
t2 = focalLength/(focalLength + z2);
t3 = focalLength/(focalLength + z3);
t4 = focalLength/(focalLength + z4);
// determine triangle vertices based on t values
var vertices:Vector.<Number> = new Vector.<Number>();
vertices.push(x1*t1,y1*t1, x2*t2,y2*t2, x3*t3,y3*t3, x4*t4,y4*t4);
// set T values allowing perspective to change
// as each vertex moves around in z space
var uvtData:Vector.<Number> = new Vector.<Number>();
uvtData.push(0,0,t1, 1,0,t2, 1,1,t3, 0,1,t4);
// draw
container.graphics.clear();
container.graphics.beginBitmapFill(bitmapData);
container.graphics.drawTriangles(vertices, indices, uvtData);
}
}
}