cube
forked from 隠面消去 (diff: 262)
ActionScript3 source code
/**
* Copyright Fricks ( http://wonderfl.net/user/Fricks )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/vzMb
*/
// forked from little_dandy's 隠面消去
// forked from little_dandy's forked from: flash on 2009-5-22
// forked from little_dandy's flash on 2009-5-22
package {
import flash.display.Sprite;
import flash.display.Shape;
import flash.display.Graphics;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.geom.Point;
import flash.geom.Matrix;
import flash.events.Event;
import flash.net.URLRequest;
import flash.utils.ByteArray;
import flash.system.Security;
public class FlashTest extends Sprite {
private var sw:Number = stage.stageWidth;
private var sh:Number = stage.stageHeight;
private var cx:Number = sw/2;
private var cy:Number = sh/2;
private var camz:Number = 300;
private var shape:Shape;
private var g:Graphics;
private var ary:Array;
private var cn:Number = 8;
private var degree:Number = 1.0;
private var radian:Number = 0.;
private var degree2:Number = 1.0;
private var radian2:Number = 0.;
private var iLoader:Loader;
private var iRequest:URLRequest;
private var iLoader2:Loader;
private var iRequest2:URLRequest;
private var iLoader3:Loader;
private var iRequest3:URLRequest;
private var iLoader4:Loader;
private var iRequest4:URLRequest;
private var iLoader5:Loader;
private var iRequest5:URLRequest;
private var iLoader6:Loader;
private var iRequest6:URLRequest;
public function FlashTest() {
// write as3 code here..
Security.loadPolicyFile("http://dandy-z.mods.jp/crossdomain.xml");
init();
}
private function init(){
iLoader = new Loader();
iRequest = new URLRequest("http://dandy-z.mods.jp/image.jpg");
iLoader.load(iRequest);
iLoader2 = new Loader();
iRequest2 = new URLRequest("http://dandy-z.mods.jp/image.jpg");
iLoader2.load(iRequest2);
iLoader3 = new Loader();
iRequest3 = new URLRequest("http://dandy-z.mods.jp/image.jpg");
iLoader3.load(iRequest3);
iLoader4 = new Loader();
iRequest4 = new URLRequest("http://dandy-z.mods.jp/image.jpg");
iLoader4.load(iRequest4);
iLoader5 = new Loader();
iRequest5 = new URLRequest("http://dandy-z.mods.jp/image.jpg");
iLoader5.load(iRequest5);
iLoader6 = new Loader();
iRequest6 = new URLRequest("http://dandy-z.mods.jp/image.jpg");
iLoader6.load(iRequest6);
//addChild(iLoader);
//iLoader.x = -cx;
//iLoader.y = -cy;
iLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,iLoadComplete);
}
private function iLoadComplete(e:Event) {
ary = new Array();
ary[0] = {px:100,py:100,pz:100};
ary[1] = {px:100,py:-100,pz:100};
ary[2] = {px:-100,py:-100,pz:100};
ary[3] = {px:-100,py:100,pz:100};
ary[4] = {px:100,py:100,pz:-100};
ary[5] = {px:-100,py:100,pz:-100};
ary[6] = {px:-100,py:-100,pz:-100};
ary[7] = {px:100,py:-100,pz:-100};
shape = new Shape();
addChild(shape);
g = shape.graphics;
addEventListener(Event.ENTER_FRAME,upDate);
}
private function upDate(e:Event){
g.clear();
degree = (mouseX-cx)/50;
degree2 = (mouseY-cy)/50;
radian = (degree/180)*Math.PI;
radian2 = (degree2/180)*Math.PI;
for(var i=0;i<cn;i++){
/*X軸に沿ったに回転
y' = ycosβ - zsinβ
z' = ysinβ + zcosβ
Y軸に沿った回転
z' = zcosβ - xsinβ
x' = zsinβ + xcosβ
Z軸に沿った回転 ---Z軸の回転は2次元(XY平面)の回転に対応
x' = xcosβ - ysinβ
y' = xsinβ + ycosβ*/
//x軸
var fpy = ((ary[i].py)*Math.cos(radian2)-(ary[i].pz)*Math.sin(radian2));
var fpz = ((ary[i].py)*Math.sin(radian2)+(ary[i].pz)*Math.cos(radian2));
//y軸
var pz = ((fpz)*Math.cos(radian2)-(ary[i].px)*Math.sin(radian2));
var fpx = ((fpz)*Math.sin(radian2)+(ary[i].px)*Math.cos(radian2));
//z軸
var px = ((fpx)*Math.cos(radian)-(fpy)*Math.sin(radian));
var py = ((fpx)*Math.sin(radian)+(fpy)*Math.cos(radian));
ary[i].px = px;
ary[i].py = py;
ary[i].pz = pz;
}
var ba:ByteArray = new ByteArray();
ba.writeObject(ary);
ba.position = 0;
var cAry:Array = ba.readObject();
for(var j=0;j<cAry.length;j++){
var scale = camz/(cAry[j].pz+camz);
var sx = (cAry[j].px)*scale;
var sy = (cAry[j].py)*scale;
cAry[j].px = sx;
cAry[j].py = sy;
//dPoint(cAry[j].px+cx-2,cAry[j].py+cy-2);
}
/*g.lineStyle(1,0xFF0000);
g.moveTo(cAry[0].px+cx,cAry[0].py+cy);
g.lineTo(cAry[1].px+cx,cAry[1].py+cy);
g.lineTo(cAry[2].px+cx,cAry[2].py+cy);
g.lineTo(cAry[3].px+cx,cAry[3].py+cy);
g.lineTo(cAry[0].px+cx,cAry[0].py+cy);
g.moveTo(cAry[4].px+cx,cAry[4].py+cy);
g.lineTo(cAry[5].px+cx,cAry[5].py+cy);
g.lineTo(cAry[6].px+cx,cAry[6].py+cy);
g.lineTo(cAry[7].px+cx,cAry[7].py+cy);
g.lineTo(cAry[4].px+cx,cAry[4].py+cy);
g.moveTo(cAry[0].px+cx,cAry[0].py+cy);
g.lineTo(cAry[4].px+cx,cAry[4].py+cy);
g.moveTo(cAry[1].px+cx,cAry[1].py+cy);
g.lineTo(cAry[5].px+cx,cAry[5].py+cy);
g.moveTo(cAry[2].px+cx,cAry[2].py+cy);
g.lineTo(cAry[6].px+cx,cAry[6].py+cy);
g.moveTo(cAry[3].px+cx,cAry[3].py+cy);
g.lineTo(cAry[7].px+cx,cAry[7].py+cy);*/
var bm:Bitmap = iLoader.getChildAt(0) as Bitmap;
var bmd:BitmapData = bm.bitmapData;
var vec0:Object = new Object();
vec0.px = cAry[3].px - cAry[2].px;
vec0.py = cAry[3].py - cAry[2].py;
vec0.pz = cAry[3].pz - cAry[2].pz;
var vec1:Object = new Object();
vec1.px = cAry[1].px - cAry[2].px;
vec1.py = cAry[1].py - cAry[2].py;
vec1.pz = cAry[1].pz - cAry[2].pz;
var norm = crossP(vec0,vec1);
var cam:Object = new Object();
cam.px = 0;
cam.py = 0;
cam.pz = camz;
if(!dotP(norm,cam)){
var mtx0:Matrix = new Matrix(0,iLoader.height,iLoader.width,0,0,0);
var mtx1:Matrix = new Matrix((cAry[1].px+cx)-(cAry[2].px+cx),(cAry[1].py+cy)-(cAry[2].py+cy),(cAry[3].px+cx)-(cAry[2].px+cx),(cAry[3].py+cy)-(cAry[2].py+cy),cAry[2].px+cx,cAry[2].py+cy);
mtx0.invert();
mtx0.concat(mtx1);
g.beginBitmapFill(bmd,mtx0,false,false);
g.moveTo(cAry[2].px+cx,cAry[2].py+cy);
g.lineTo(cAry[1].px+cx,cAry[1].py+cy);
g.lineTo(cAry[3].px+cx,cAry[3].py+cy);
g.lineTo(cAry[2].px+cx,cAry[2].py+cy);
g.endFill();
var mtx2:Matrix = new Matrix(0-iLoader.width,iLoader.height-iLoader.height,iLoader.width-iLoader.width,0-iLoader.height,iLoader.width,iLoader.height);
var mtx3:Matrix = new Matrix((cAry[1].px+cx)-(cAry[0].px+cx),(cAry[1].py+cy)-(cAry[0].py+cy),(cAry[3].px+cx)-(cAry[0].px+cx),(cAry[3].py+cy)-(cAry[0].py+cy),cAry[0].px+cx,cAry[0].py+cy);
mtx2.invert();
mtx2.concat(mtx3);
g.beginBitmapFill(bmd,mtx2,false,false);
g.moveTo(cAry[0].px+cx,cAry[0].py+cy);
g.lineTo(cAry[1].px+cx,cAry[1].py+cy);
g.lineTo(cAry[3].px+cx,cAry[3].py+cy);
g.lineTo(cAry[0].px+cx,cAry[0].py+cy);
g.endFill();
}
var bm2:Bitmap = iLoader2.getChildAt(0) as Bitmap;
var bmd2:BitmapData = bm2.bitmapData;
var vec2:Object = new Object();
vec2.px = cAry[7].px - cAry[6].px;
vec2.py = cAry[7].py - cAry[6].py;
vec2.pz = cAry[7].pz - cAry[6].pz;
var vec3:Object = new Object();
vec3.px = cAry[5].px - cAry[6].px;
vec3.py = cAry[5].py - cAry[6].py;
vec3.pz = cAry[5].pz - cAry[6].pz;
var norm2 = crossP(vec2,vec3);
if(!dotP(norm2,cam)){
var mtx4:Matrix = new Matrix(0,iLoader2.height,iLoader2.width,0,0,0);
var mtx5:Matrix = new Matrix((cAry[5].px+cx)-(cAry[6].px+cx),(cAry[5].py+cy)-(cAry[6].py+cy),(cAry[7].px+cx)-(cAry[6].px+cx),(cAry[7].py+cy)-(cAry[6].py+cy),cAry[6].px+cx,cAry[6].py+cy);
mtx4.invert();
mtx4.concat(mtx5);
g.beginBitmapFill(bmd2,mtx4,false,false);
g.moveTo(cAry[6].px+cx,cAry[6].py+cy);
g.lineTo(cAry[5].px+cx,cAry[5].py+cy);
g.lineTo(cAry[7].px+cx,cAry[7].py+cy);
g.lineTo(cAry[6].px+cx,cAry[6].py+cy);
g.endFill();
var mtx6:Matrix = new Matrix(0-iLoader2.width,iLoader2.height-iLoader2.height,iLoader2.width-iLoader2.width,0-iLoader2.height,iLoader2.width,iLoader2.height);
var mtx7:Matrix = new Matrix((cAry[5].px+cx)-(cAry[4].px+cx),(cAry[5].py+cy)-(cAry[4].py+cy),(cAry[7].px+cx)-(cAry[4].px+cx),(cAry[7].py+cy)-(cAry[4].py+cy),cAry[4].px+cx,cAry[4].py+cy);
mtx6.invert();
mtx6.concat(mtx7);
g.beginBitmapFill(bmd2,mtx6,false,false);
g.moveTo(cAry[4].px+cx,cAry[4].py+cy);
g.lineTo(cAry[5].px+cx,cAry[5].py+cy);
g.lineTo(cAry[7].px+cx,cAry[7].py+cy);
g.lineTo(cAry[4].px+cx,cAry[4].py+cy);
g.endFill();
}
var bm3:Bitmap = iLoader3.getChildAt(0) as Bitmap;
var bmd3:BitmapData = bm3.bitmapData;
var vec4:Object = new Object();
vec4.px = cAry[5].px - cAry[6].px;
vec4.py = cAry[5].py - cAry[6].py;
vec4.pz = cAry[5].pz - cAry[6].pz;
var vec5:Object = new Object();
vec5.px = cAry[2].px - cAry[6].px;
vec5.py = cAry[2].py - cAry[6].py;
vec5.pz = cAry[2].pz - cAry[6].pz;
var norm3 = crossP(vec4,vec5);
if(!dotP(norm3,cam)){
var mtx8:Matrix = new Matrix(0,iLoader3.height,iLoader3.width,0,0,0);
var mtx9:Matrix = new Matrix((cAry[2].px+cx)-(cAry[6].px+cx),(cAry[2].py+cy)-(cAry[6].py+cy),(cAry[5].px+cx)-(cAry[6].px+cx),(cAry[5].py+cy)-(cAry[6].py+cy),cAry[6].px+cx,cAry[6].py+cy);
mtx8.invert();
mtx8.concat(mtx9);
g.beginBitmapFill(bmd3,mtx8,false,false);
g.moveTo(cAry[6].px+cx,cAry[6].py+cy);
g.lineTo(cAry[2].px+cx,cAry[2].py+cy);
g.lineTo(cAry[5].px+cx,cAry[5].py+cy);
g.lineTo(cAry[6].px+cx,cAry[6].py+cy);
g.endFill();
var mtx10:Matrix = new Matrix(0-iLoader.width,iLoader.height-iLoader.height,iLoader.width-iLoader.width,0-iLoader.height,iLoader.width,iLoader.height);
var mtx11:Matrix = new Matrix((cAry[2].px+cx)-(cAry[3].px+cx),(cAry[2].py+cy)-(cAry[3].py+cy),(cAry[5].px+cx)-(cAry[3].px+cx),(cAry[5].py+cy)-(cAry[3].py+cy),cAry[3].px+cx,cAry[3].py+cy);
mtx10.invert();
mtx10.concat(mtx11);
g.beginBitmapFill(bmd3,mtx10,false,false);
g.moveTo(cAry[3].px+cx,cAry[3].py+cy);
g.lineTo(cAry[2].px+cx,cAry[2].py+cy);
g.lineTo(cAry[5].px+cx,cAry[5].py+cy);
g.lineTo(cAry[3].px+cx,cAry[3].py+cy);
g.endFill();
}
var bm4:Bitmap = iLoader4.getChildAt(0) as Bitmap;
var bmd4:BitmapData = bm4.bitmapData;
var vec6:Object = new Object();
vec6.px = cAry[1].px - cAry[7].px;
vec6.py = cAry[1].py - cAry[7].py;
vec6.pz = cAry[1].pz - cAry[7].pz;
var vec7:Object = new Object();
vec7.px = cAry[4].px - cAry[7].px;
vec7.py = cAry[4].py - cAry[7].py;
vec7.pz = cAry[4].pz - cAry[7].pz;
var norm4 = crossP(vec6,vec7);
if(!dotP(norm4,cam)){
var mtx12:Matrix = new Matrix(0,iLoader4.height,iLoader4.width,0,0,0);
var mtx13:Matrix = new Matrix((cAry[4].px+cx)-(cAry[7].px+cx),(cAry[4].py+cy)-(cAry[7].py+cy),(cAry[1].px+cx)-(cAry[7].px+cx),(cAry[1].py+cy)-(cAry[7].py+cy),cAry[7].px+cx,cAry[7].py+cy);
mtx12.invert();
mtx12.concat(mtx13);
g.beginBitmapFill(bmd4,mtx12,false,false);
g.moveTo(cAry[7].px+cx,cAry[7].py+cy);
g.lineTo(cAry[4].px+cx,cAry[4].py+cy);
g.lineTo(cAry[1].px+cx,cAry[1].py+cy);
g.lineTo(cAry[7].px+cx,cAry[7].py+cy);
g.endFill();
var mtx14:Matrix = new Matrix(0-iLoader4.width,iLoader4.height-iLoader4.height,iLoader4.width-iLoader4.width,0-iLoader4.height,iLoader4.width,iLoader4.height);
var mtx15:Matrix = new Matrix((cAry[4].px+cx)-(cAry[0].px+cx),(cAry[4].py+cy)-(cAry[0].py+cy),(cAry[1].px+cx)-(cAry[0].px+cx),(cAry[1].py+cy)-(cAry[0].py+cy),cAry[0].px+cx,cAry[0].py+cy);
mtx14.invert();
mtx14.concat(mtx15);
g.beginBitmapFill(bmd4,mtx14,false,false);
g.moveTo(cAry[0].px+cx,cAry[0].py+cy);
g.lineTo(cAry[4].px+cx,cAry[4].py+cy);
g.lineTo(cAry[1].px+cx,cAry[1].py+cy);
g.lineTo(cAry[0].px+cx,cAry[0].py+cy);
g.endFill();
}
var bm5:Bitmap = iLoader5.getChildAt(0) as Bitmap;
var bmd5:BitmapData = bm5.bitmapData;
var vec8:Object = new Object();
vec8.px = cAry[2].px - cAry[6].px;
vec8.py = cAry[2].py - cAry[6].py;
vec8.pz = cAry[2].pz - cAry[6].pz;
var vec9:Object = new Object();
vec9.px = cAry[7].px - cAry[6].px;
vec9.py = cAry[7].py - cAry[6].py;
vec9.pz = cAry[7].pz - cAry[6].pz;
var norm5 = crossP(vec8,vec9);
if(!dotP(norm5,cam)){
var mtx16:Matrix = new Matrix(0,iLoader5.height,iLoader5.width,0,0,0);
var mtx17:Matrix = new Matrix((cAry[7].px+cx)-(cAry[6].px+cx),(cAry[7].py+cy)-(cAry[6].py+cy),(cAry[2].px+cx)-(cAry[6].px+cx),(cAry[2].py+cy)-(cAry[6].py+cy),cAry[6].px+cx,cAry[6].py+cy);
mtx16.invert();
mtx16.concat(mtx17);
g.beginBitmapFill(bmd5,mtx16,false,false);
g.moveTo(cAry[6].px+cx,cAry[6].py+cy);
g.lineTo(cAry[7].px+cx,cAry[7].py+cy);
g.lineTo(cAry[2].px+cx,cAry[2].py+cy);
g.lineTo(cAry[6].px+cx,cAry[6].py+cy);
g.endFill();
var mtx18:Matrix = new Matrix(0-iLoader5.width,iLoader5.height-iLoader5.height,iLoader5.width-iLoader5.width,0-iLoader5.height,iLoader5.width,iLoader5.height);
var mtx19:Matrix = new Matrix((cAry[7].px+cx)-(cAry[1].px+cx),(cAry[7].py+cy)-(cAry[1].py+cy),(cAry[2].px+cx)-(cAry[1].px+cx),(cAry[2].py+cy)-(cAry[1].py+cy),cAry[1].px+cx,cAry[1].py+cy);
mtx18.invert();
mtx18.concat(mtx19);
g.beginBitmapFill(bmd5,mtx18,false,false);
g.moveTo(cAry[1].px+cx,cAry[1].py+cy);
g.lineTo(cAry[7].px+cx,cAry[7].py+cy);
g.lineTo(cAry[2].px+cx,cAry[2].py+cy);
g.lineTo(cAry[1].px+cx,cAry[1].py+cy);
g.endFill();
}
var bm6:Bitmap = iLoader6.getChildAt(0) as Bitmap;
var bmd6:BitmapData = bm6.bitmapData;
var vec10:Object = new Object();
vec10.px = cAry[0].px - cAry[4].px;
vec10.py = cAry[0].py - cAry[4].py;
vec10.pz = cAry[0].pz - cAry[4].pz;
var vec11:Object = new Object();
vec11.px = cAry[5].px - cAry[4].px;
vec11.py = cAry[5].py - cAry[4].py;
vec11.pz = cAry[5].pz - cAry[4].pz;
var norm6 = crossP(vec10,vec11);
if(!dotP(norm6,cam)){
var mtx20:Matrix = new Matrix(0,iLoader6.height,iLoader6.width,0,0,0);
var mtx21:Matrix = new Matrix((cAry[5].px+cx)-(cAry[4].px+cx),(cAry[5].py+cy)-(cAry[4].py+cy),(cAry[0].px+cx)-(cAry[4].px+cx),(cAry[0].py+cy)-(cAry[4].py+cy),cAry[4].px+cx,cAry[4].py+cy);
mtx20.invert();
mtx20.concat(mtx21);
g.beginBitmapFill(bmd6,mtx20,false,false);
g.moveTo(cAry[4].px+cx,cAry[4].py+cy);
g.lineTo(cAry[5].px+cx,cAry[5].py+cy);
g.lineTo(cAry[0].px+cx,cAry[0].py+cy);
g.lineTo(cAry[4].px+cx,cAry[4].py+cy);
g.endFill();
var mtx22:Matrix = new Matrix(0-iLoader6.width,iLoader6.height-iLoader6.height,iLoader6.width-iLoader6.width,0-iLoader6.height,iLoader6.width,iLoader6.height);
var mtx23:Matrix = new Matrix((cAry[5].px+cx)-(cAry[3].px+cx),(cAry[5].py+cy)-(cAry[3].py+cy),(cAry[0].px+cx)-(cAry[3].px+cx),(cAry[0].py+cy)-(cAry[3].py+cy),cAry[3].px+cx,cAry[3].py+cy);
mtx22.invert();
mtx22.concat(mtx23);
g.beginBitmapFill(bmd6,mtx22,false,false);
g.moveTo(cAry[3].px+cx,cAry[3].py+cy);
g.lineTo(cAry[5].px+cx,cAry[5].py+cy);
g.lineTo(cAry[0].px+cx,cAry[0].py+cy);
g.lineTo(cAry[3].px+cx,cAry[3].py+cy);
g.endFill();
}
}
private function dPoint(dx:Number,dy:Number){
g.beginFill(0x0000FF);
g.drawCircle(dx,dy,2);
}
private function crossP(vec1:Object,vec2:Object):Object{
var nl:Object = new Object();
nl.px = vec1.py*vec2.pz - vec1.pz*vec2.py;
nl.py = vec1.pz*vec2.px - vec1.px*vec2.pz;
nl.pz = vec1.px*vec2.py - vec1.py*vec2.px;
return nl;
}
private function dotP(nlv:Object,camv:Object):Boolean{
var dp:Number = nlv.px*camv.px + nlv.py*camv.py + nlv.pz*camv.pz;
var bo:Boolean;
if(dp < 0){
bo = true;
}else{
bo = false;
}
return bo;
}
}
}
