UVT mapping with Graphic.drawTriangle method
package {
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.text.*;
public class Main extends Sprite {
var points:Array;
var xn:uint = 20, yn:uint = 20;
var texture:BitmapData;
var ang:Number = 0;
var fl:Number = 600;
var cx:Number, cy:Number;
var canvas:Sprite;
public function Main() {
cx = stage.stageWidth / 2;
cy = stage.stageHeight / 2;
texture = new Curtain(0,0);
addChild(canvas = new Sprite);
points = new Array();
var i:uint, j:uint;
for (j = 0; j <= yn; j ++) {
points[j] = new Vector.<Vector3D>();
for (i = 0; i <= xn; i ++) {
points[j].push(new Vector3D( i * texture.width / xn- texture.width / 2,
200,
j * texture.width / yn + 200));
}
}
addEventListener(Event.ENTER_FRAME, h_enterFrame);
}
public function h_enterFrame(evt:Event):void {
var i:uint, j:uint;
var vertices:Vector.<Number> = new Vector.<Number>;
var indices:Vector.<int> = new Vector.<int>;
var uvt:Vector.<Number> = new Vector.<Number>;
var g:Graphics = canvas.graphics;
ang += 0.1;
for (j = 0; j <= yn; j ++) {
for (i = 0; i <= xn; i ++) {
var p3d = new Vector3D(points[j][i].x, points[j][i].y + Math.sin(ang + (j + i) / 2) * 20, points[j][i].z);
var p:Point = p3dTo2d(p3d);
// vertices.push(points[j][i].x, points[j][i].z);
vertices.push(p.x + cx, p.y);
uvt.push(1 / xn * i, 1/ yn * j, points[j][i].z);
}
}
j = 1;
for (j = 0; j < yn; j ++) {
for (i = 0; i < xn; i ++) {
indices.push(j * (xn + 1) + i, j * (xn + 1) + i + 1, (j + 1) * (xn + 1) + i);
indices.push( j * (xn + 1) + i + 1, (j + 1) * (xn + 1) + i + 1, (j + 1) * (xn + 1) + i);
}
}
g.clear();
//g.lineStyle(0,0xff0000);
g.beginBitmapFill(texture);
g.drawTriangles(vertices, indices, uvt,TriangleCulling.POSITIVE);
g.endFill();
}
private function createTextField(s:String):TextField {
var tx:TextField = new TextField();
var tf:TextFormat = new TextFormat();
tx.text = s;
return tx
}
private function p3dTo2d(p3d:Vector3D):Point {
var p2d:Point = new Point;
var ratio:Number = fl / p3d.z;
p2d.x = p3d.x * ratio;
p2d.y = p3d.y * ratio - 100;
return p2d
}
}
}