package cn.ndl.test {
import flash.display.Bitmap;
import flash.display.GraphicsTrianglePath;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display.TriangleCulling;
import flash.events.Event;
public class ImageTube extends Sprite {
[Embed(source="http://www.cnblogs.com/../map.jpg")]
private var imgClass:Class;
private var ver:Vector.<Number>=new Vector.<Number>;
private var ind:Vector.<int>=new Vector.<int>;
private var uvt:Vector.<Number>=new Vector.<Number>;
private var spr:Sprite;
private var res:int=60;
private var cols:int=20;
private var row:int=20;
private var centerZ:Number=200;
private var fl:Number=1000;
private var r:Number=400;
private var bd:Bitmap;
private var offset:Number=0;
public function ImageTube() {
super();
stage.align=StageAlign.TOP_LEFT;
stage.scaleMode=StageScaleMode.NO_SCALE;
init();
}
private function init():void {
spr=new Sprite;
spr.x=400;
spr.y=400;
this.addChild(spr);
bd=new imgClass;
makeTriangles();
draw();
this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e:Event):void {
/*spr.rotationX+=1;
spr.rotationY+=1.2;
spr.rotationZ+=1;
*/
draw();
}
private function draw():void {
offset+=.05;
ver.length=0;
uvt.length=0;
trace("==============================================");
for (var i:int=0; i < row; i++) {
for (var j:int=0; j < cols; j++) {
var angle:Number=Math.PI * 2 / (cols - 1) * j;
var angle2:Number=Math.PI * i / (row - 1) - Math.PI / 2;
//var angle:Number=Math.atan2(mouseY-spr.y,mouseX-spr.x);
var xpos:Number=Math.cos(angle + offset) * r * Math.cos(angle2);
//var ypos:Number=(i - row / 2) * res;
var ypos:Number=Math.sin(angle2) * r;
var zpos:Number=Math.sin(angle + offset) * r * Math.cos(angle2);
var sc:Number=fl / (fl + zpos + centerZ);
ver.push(xpos * sc, ypos * sc);
uvt.push(j / (cols - 1), i / (row - 1));
trace("ver:", xpos * sc, ypos * sc);
trace("uvt:", j / (cols - 1), i / (row - 1));
}
}
spr.graphics.clear();
spr.graphics.lineStyle(0, 0, .5);
spr.graphics.beginBitmapFill(bd.bitmapData);
spr.graphics.drawTriangles(ver, ind, uvt, TriangleCulling.NEGATIVE);
}
private function makeTriangles():void {
for (var i:int=0; i < row; i++)
for (var j:int=0; j < cols; j++) {
var angle:Number=Math.PI * 2 / (cols - 1) * j;
var xpos:Number=Math.cos(angle) * r;
var ypos:Number=(i - row / 2) * res;
//var ypos:Number=i * res;
var zpos:Number=Math.sin(angle) * r;
var sc:Number=fl / (fl + zpos + centerZ);
ver.push(xpos * sc, ypos * sc);
uvt.push(j / (cols - 1), i / (row - 1));
//uvt.push(sc);
if (j < cols - 1 && i < row - 1) {
ind.push(i * cols + j, i * cols + j + 1, i * cols + j + 1 + cols);
ind.push(i * cols + j + 1 + cols, i * cols + j + cols, i * cols + j);
}
}
}
}
}