var sp:Sprite =addChild(new Sprite()) as Sprite;
sp.x = stage.stageWidth / 2;
sp.y = stage.stageHeight / 2;
sp.z = 0;
var iNum:int = 4;//八边形的层数
var jNum:int = 12;//八边形的边数
var R:Number = 40;//八边形最大的半径
var r:Number = 0;//上下顶端的半径
var temp_Rr:Number;//
var temp_x:Number;
var temp_y:Number;
var temp_z:Number;
var ang:Number;
var total_Point:Array = [];
var container_triangle:Array = [];
var mtxworld:Matrix3D=new Matrix3D();//改变点坐标的矩阵
var _oldMousePoint:Point = new Point ;
var color:uint=0xA4B3D2;//初始颜色值0xc8b9ec/0xcbe0f4
function init(R:Number=40,r:Number=0) {
for (var i:int=0; i<=iNum; i++) {
total_Point[i] = [];
if (i == 0) {
temp_Rr = r;
temp_y = 0;
}
if (i == iNum) {
temp_Rr = r;
temp_y = 120;
}
if (i < iNum && i > 0) {
//temp_Rr=R+(i-1)*20 ;
i == 1 ? temp_Rr = 40:0;
i == 2 ? temp_Rr = 70:0;
i == 3 ? temp_Rr = 80:0;
temp_y=20*(i-1);
}
if (i % iNum == 0) {
total_Point[i].push(new Vector3D(0,temp_y,0));
} else {
for (var j:int=0; j<=jNum; j++) {
ang = i == 2 ? 1 * Math.PI / 12:0;
//ang = 0;
temp_x=-temp_Rr*Math.cos(j*(2*Math.PI/jNum)+ang);
temp_z=temp_Rr*Math.sin(j*(2*Math.PI/jNum)+ang);
total_Point[i].push(new Vector3D(temp_x,temp_y,temp_z));
}
}
}
for (j=0; j<jNum; j++) {
var triangle_A:Object = {pt1:total_Point[3][j],pt2:total_Point[2][j],pt3:total_Point[3][j + 1]};
var triangle_B:Object = {pt1:total_Point[2][j],pt2:total_Point[1][j],pt3:total_Point[1][j + 1]};
var triangle_C:Object = {pt1:total_Point[3][j + 1],pt2:total_Point[2][j],pt3:total_Point[2][j + 1]};
var triangle_D:Object = {pt1:total_Point[2][j + 1],pt2:total_Point[2][j],pt3:total_Point[1][j + 1]};
var triangle_E:Object = {pt1:total_Point[1][j],pt2:total_Point[0][0],pt3:total_Point[1][j + 1]};
var triangle_F:Object = {pt1:total_Point[4][0],pt2:total_Point[3][j],pt3:total_Point[3][j + 1]};
container_triangle.push(triangle_A,triangle_B,triangle_C,triangle_D,triangle_E,triangle_F);
}
trace(container_triangle.length);
render();
}
function render(degreX:Number=20,degreY:Number=0,degreZ:Number=0) {
var point3D:Vector.<Number>=new Vector.<Number>();
var point2D:Vector.<Number>=new Vector.<Number>();
var new_3D:Vector.<Number>=new Vector.<Number>();
var uvt:Vector.<Number>=new Vector.<Number>();
var temp3D_triangle:Object;
var temp_triangles:Array=new Array();
//var mouseVector:Vector3D=new Vector3D(sp.mouseX,sp.mouseY,600);
var mouseVector:Vector3D = new Vector3D(10 * Math.random(),30 * Math.random(),600);
var array_length:int = container_triangle.length;
for (var i:int=0; i<array_length; i++) {
point3D.push(container_triangle[i].pt1.x,container_triangle[i].pt1.y,container_triangle[i].pt1.z,container_triangle[i].pt2.x,container_triangle[i].pt2.y,container_triangle[i].pt2.z,container_triangle[i].pt3.x,container_triangle[i].pt3.y,container_triangle[i].pt3.z);
}
mtxworld.appendRotation(degreX/1,Vector3D.X_AXIS);//后置增量旋转
mtxworld.appendRotation(degreY/1,Vector3D.Y_AXIS);
mtxworld.appendRotation(degreZ/1,Vector3D.Z_AXIS);
mtxworld.transformVectors(point3D,new_3D);//new_3D获取旋转后的坐标以便得到Z值设置层深
//Utils3D.projectVectors(pm, new_3D, point2D,uvt);
array_length = new_3D.length;
for (i=0; i<array_length; i+=9) {
temp3D_triangle={pt1:new Vector3D(new_3D[i],new_3D[i+1],new_3D[i+2]),pt2:new Vector3D(new_3D[i+3],new_3D[i+4],new_3D[i+5]),pt3:new Vector3D(new_3D[i+6],new_3D[i+7],new_3D[i+8]),d:new_3D[i+2]+new_3D[i+5]+new_3D[i+8]};
temp_triangles.push(temp3D_triangle);
}
temp_triangles.sortOn("d",Array.NUMERIC |Array.DESCENDING );//按数值降序排列,大的先绘制在里,小的后绘制在外
sp.graphics.clear();
//sp.graphics.lineStyle(1,0xffffff);
//sp.graphics.beginFill(0xE2DFC8);
array_length=temp_triangles.length;
for (i=0; i<array_length; i++) {
var v_1:Vector3D=temp_triangles[i].pt1.subtract(temp_triangles[i].pt2);
var v_2:Vector3D=temp_triangles[i].pt3.subtract(temp_triangles[i].pt1);
var v_light:Vector3D=mouseVector//.subtract(temp_triangles[i].pt2);
v_light.normalize();
//mouseVector.normalize()
//var v_light:Vector3D=mouseVector
var n:Vector3D=v_1.crossProduct(v_2);
n.normalize();
var w:Number=v_light.dotProduct(n);
var r0:int=(color>>16)*w,g0:int=(color>>8&0xff)*w,b0:int=(color&0xff)*w;
r0=(r0>255)?255:(r0<0)?0:r0;
g0=(r0>255)?255:(g0<0)?0:g0;
b0=(r0>255)?255:(b0<0)?0:b0;
sp.graphics.beginFill(r0<<16|g0<<8|b0);
var v1:Vector3D=temp_triangles[i].pt1,v2:Vector3D=temp_triangles[i].pt2,v3:Vector3D=temp_triangles[i].pt3;
sp.graphics.drawTriangles(Vector.<Number>([v1.x,v1.y,v2.x,v2.y,v3.x,v3.y]),null,null,TriangleCulling.POSITIVE);
}
}
init();
stage.addEventListener(MouseEvent.MOUSE_DOWN, downHandler);
stage.addEventListener(Event.ENTER_FRAME, loopHandlerA);
function downHandler(e:Event ):void {
Mouse.cursor=MouseCursor.HAND;
_oldMousePoint.x=mouseX;
_oldMousePoint.y=mouseY;
stage.removeEventListener(Event.ENTER_FRAME, loopHandlerA);
stage.addEventListener(Event.ENTER_FRAME, loopHandler);
stage.addEventListener(MouseEvent.MOUSE_UP, upHandler);
}
function loopHandler(e:Event ):void {
render(mouseY-_oldMousePoint.y,-(mouseX-_oldMousePoint.x));
_oldMousePoint.x=mouseX;
_oldMousePoint.y=mouseY;
}
function upHandler(e:Event ):void {
Mouse.cursor=MouseCursor.AUTO;
stage.removeEventListener(Event.ENTER_FRAME, loopHandler);
stage.addEventListener(Event.ENTER_FRAME, loopHandlerA);
}
function loopHandlerA(e:Event ):void {
render(0,1,0);
}
sp.x = stage.stageWidth / 2;
sp.y = stage.stageHeight / 2;
sp.z = 0;
var iNum:int = 4;//八边形的层数
var jNum:int = 12;//八边形的边数
var R:Number = 40;//八边形最大的半径
var r:Number = 0;//上下顶端的半径
var temp_Rr:Number;//
var temp_x:Number;
var temp_y:Number;
var temp_z:Number;
var ang:Number;
var total_Point:Array = [];
var container_triangle:Array = [];
var mtxworld:Matrix3D=new Matrix3D();//改变点坐标的矩阵
var _oldMousePoint:Point = new Point ;
var color:uint=0xA4B3D2;//初始颜色值0xc8b9ec/0xcbe0f4
function init(R:Number=40,r:Number=0) {
for (var i:int=0; i<=iNum; i++) {
total_Point[i] = [];
if (i == 0) {
temp_Rr = r;
temp_y = 0;
}
if (i == iNum) {
temp_Rr = r;
temp_y = 120;
}
if (i < iNum && i > 0) {
//temp_Rr=R+(i-1)*20 ;
i == 1 ? temp_Rr = 40:0;
i == 2 ? temp_Rr = 70:0;
i == 3 ? temp_Rr = 80:0;
temp_y=20*(i-1);
}
if (i % iNum == 0) {
total_Point[i].push(new Vector3D(0,temp_y,0));
} else {
for (var j:int=0; j<=jNum; j++) {
ang = i == 2 ? 1 * Math.PI / 12:0;
//ang = 0;
temp_x=-temp_Rr*Math.cos(j*(2*Math.PI/jNum)+ang);
temp_z=temp_Rr*Math.sin(j*(2*Math.PI/jNum)+ang);
total_Point[i].push(new Vector3D(temp_x,temp_y,temp_z));
}
}
}
for (j=0; j<jNum; j++) {
var triangle_A:Object = {pt1:total_Point[3][j],pt2:total_Point[2][j],pt3:total_Point[3][j + 1]};
var triangle_B:Object = {pt1:total_Point[2][j],pt2:total_Point[1][j],pt3:total_Point[1][j + 1]};
var triangle_C:Object = {pt1:total_Point[3][j + 1],pt2:total_Point[2][j],pt3:total_Point[2][j + 1]};
var triangle_D:Object = {pt1:total_Point[2][j + 1],pt2:total_Point[2][j],pt3:total_Point[1][j + 1]};
var triangle_E:Object = {pt1:total_Point[1][j],pt2:total_Point[0][0],pt3:total_Point[1][j + 1]};
var triangle_F:Object = {pt1:total_Point[4][0],pt2:total_Point[3][j],pt3:total_Point[3][j + 1]};
container_triangle.push(triangle_A,triangle_B,triangle_C,triangle_D,triangle_E,triangle_F);
}
trace(container_triangle.length);
render();
}
function render(degreX:Number=20,degreY:Number=0,degreZ:Number=0) {
var point3D:Vector.<Number>=new Vector.<Number>();
var point2D:Vector.<Number>=new Vector.<Number>();
var new_3D:Vector.<Number>=new Vector.<Number>();
var uvt:Vector.<Number>=new Vector.<Number>();
var temp3D_triangle:Object;
var temp_triangles:Array=new Array();
//var mouseVector:Vector3D=new Vector3D(sp.mouseX,sp.mouseY,600);
var mouseVector:Vector3D = new Vector3D(10 * Math.random(),30 * Math.random(),600);
var array_length:int = container_triangle.length;
for (var i:int=0; i<array_length; i++) {
point3D.push(container_triangle[i].pt1.x,container_triangle[i].pt1.y,container_triangle[i].pt1.z,container_triangle[i].pt2.x,container_triangle[i].pt2.y,container_triangle[i].pt2.z,container_triangle[i].pt3.x,container_triangle[i].pt3.y,container_triangle[i].pt3.z);
}
mtxworld.appendRotation(degreX/1,Vector3D.X_AXIS);//后置增量旋转
mtxworld.appendRotation(degreY/1,Vector3D.Y_AXIS);
mtxworld.appendRotation(degreZ/1,Vector3D.Z_AXIS);
mtxworld.transformVectors(point3D,new_3D);//new_3D获取旋转后的坐标以便得到Z值设置层深
//Utils3D.projectVectors(pm, new_3D, point2D,uvt);
array_length = new_3D.length;
for (i=0; i<array_length; i+=9) {
temp3D_triangle={pt1:new Vector3D(new_3D[i],new_3D[i+1],new_3D[i+2]),pt2:new Vector3D(new_3D[i+3],new_3D[i+4],new_3D[i+5]),pt3:new Vector3D(new_3D[i+6],new_3D[i+7],new_3D[i+8]),d:new_3D[i+2]+new_3D[i+5]+new_3D[i+8]};
temp_triangles.push(temp3D_triangle);
}
temp_triangles.sortOn("d",Array.NUMERIC |Array.DESCENDING );//按数值降序排列,大的先绘制在里,小的后绘制在外
sp.graphics.clear();
//sp.graphics.lineStyle(1,0xffffff);
//sp.graphics.beginFill(0xE2DFC8);
array_length=temp_triangles.length;
for (i=0; i<array_length; i++) {
var v_1:Vector3D=temp_triangles[i].pt1.subtract(temp_triangles[i].pt2);
var v_2:Vector3D=temp_triangles[i].pt3.subtract(temp_triangles[i].pt1);
var v_light:Vector3D=mouseVector//.subtract(temp_triangles[i].pt2);
v_light.normalize();
//mouseVector.normalize()
//var v_light:Vector3D=mouseVector
var n:Vector3D=v_1.crossProduct(v_2);
n.normalize();
var w:Number=v_light.dotProduct(n);
var r0:int=(color>>16)*w,g0:int=(color>>8&0xff)*w,b0:int=(color&0xff)*w;
r0=(r0>255)?255:(r0<0)?0:r0;
g0=(r0>255)?255:(g0<0)?0:g0;
b0=(r0>255)?255:(b0<0)?0:b0;
sp.graphics.beginFill(r0<<16|g0<<8|b0);
var v1:Vector3D=temp_triangles[i].pt1,v2:Vector3D=temp_triangles[i].pt2,v3:Vector3D=temp_triangles[i].pt3;
sp.graphics.drawTriangles(Vector.<Number>([v1.x,v1.y,v2.x,v2.y,v3.x,v3.y]),null,null,TriangleCulling.POSITIVE);
}
}
init();
stage.addEventListener(MouseEvent.MOUSE_DOWN, downHandler);
stage.addEventListener(Event.ENTER_FRAME, loopHandlerA);
function downHandler(e:Event ):void {
Mouse.cursor=MouseCursor.HAND;
_oldMousePoint.x=mouseX;
_oldMousePoint.y=mouseY;
stage.removeEventListener(Event.ENTER_FRAME, loopHandlerA);
stage.addEventListener(Event.ENTER_FRAME, loopHandler);
stage.addEventListener(MouseEvent.MOUSE_UP, upHandler);
}
function loopHandler(e:Event ):void {
render(mouseY-_oldMousePoint.y,-(mouseX-_oldMousePoint.x));
_oldMousePoint.x=mouseX;
_oldMousePoint.y=mouseY;
}
function upHandler(e:Event ):void {
Mouse.cursor=MouseCursor.AUTO;
stage.removeEventListener(Event.ENTER_FRAME, loopHandler);
stage.addEventListener(Event.ENTER_FRAME, loopHandlerA);
}
function loopHandlerA(e:Event ):void {
render(0,1,0);
}