钻石恒久远,一颗永流传

钻石恒久远,一颗永流传

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);
}
posted @ 2009-10-08 21:29  ddw1997  阅读(441)  评论(0)    收藏  举报